summaryrefslogtreecommitdiff
path: root/src/meta/meta_track.c
diff options
context:
space:
mode:
authorMichael Cahill <michael.cahill@wiredtiger.com>2013-03-25 16:37:32 +1100
committerMichael Cahill <michael.cahill@wiredtiger.com>2013-03-25 16:37:32 +1100
commit068bd803ba2bb21feae8b7508f69f228b33d07e9 (patch)
treef8f386c051202c0c3923fae15c71a6cff376d7cf /src/meta/meta_track.c
parent4be1afdf665bf4bd4449910049fcb0c0ccb9286e (diff)
parent01d65d9b536e162ae900aa16158eb29d3144528a (diff)
downloadmongo-068bd803ba2bb21feae8b7508f69f228b33d07e9.tar.gz
Merge branch 'develop' into data-handles
Conflicts: dist/filelist src/block/block_mgr.c src/btree/bt_cell.c src/btree/bt_curnext.c src/btree/bt_curprev.c src/btree/bt_debug.c src/btree/bt_evict.c src/btree/bt_handle.c src/btree/bt_slvg.c src/btree/bt_stat.c src/btree/bt_vrfy.c src/btree/bt_vrfy_dsk.c src/btree/rec_write.c src/btree/row_srch.c src/conn/conn_dhandle.c src/cursor/cur_file.c src/cursor/cur_index.c src/cursor/cur_stat.c src/include/api.h src/include/btree.h src/include/btree.i src/include/cache.i src/include/extern.h src/include/serial.i src/include/stat.h src/include/wt_internal.h src/lsm/lsm_cursor.c src/lsm/lsm_worker.c src/meta/meta_track.c src/schema/schema_drop.c src/schema/schema_plan.c src/schema/schema_truncate.c src/session/session_api.c src/session/session_dhandle.c src/txn/txn_ckpt.c
Diffstat (limited to 'src/meta/meta_track.c')
-rw-r--r--src/meta/meta_track.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/src/meta/meta_track.c b/src/meta/meta_track.c
index 66950b668fb..2dca37d05ea 100644
--- a/src/meta/meta_track.c
+++ b/src/meta/meta_track.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2008-2012 WiredTiger, Inc.
+ * Copyright (c) 2008-2013 WiredTiger, Inc.
* All rights reserved.
*
* See the file LICENSE for redistribution information.
@@ -36,7 +36,7 @@ __meta_track_next(WT_SESSION_IMPL *session, WT_META_TRACK **trkp)
{
size_t offset, sub_off;
- if (!WT_META_TRACKING(session))
+ if (session->meta_track_next == NULL)
session->meta_track_next = session->meta_track;
offset = WT_PTRDIFF(session->meta_track_next, session->meta_track);
@@ -83,13 +83,17 @@ __wt_meta_track_discard(WT_SESSION_IMPL *session)
int
__wt_meta_track_on(WT_SESSION_IMPL *session)
{
- return (__meta_track_next(session, NULL));
+ if (session->meta_track_nest++ == 0)
+ WT_RET(__meta_track_next(session, NULL));
+
+ return (0);
}
static int
__meta_track_apply(WT_SESSION_IMPL *session, WT_META_TRACK *trk, int unroll)
{
WT_DATA_HANDLE *saved_dhandle;
+ WT_BM *bm;
WT_DECL_RET;
int tret;
@@ -106,8 +110,10 @@ __meta_track_apply(WT_SESSION_IMPL *session, WT_META_TRACK *trk, int unroll)
case WT_ST_CHECKPOINT: /* Checkpoint, see above */
saved_dhandle = session->dhandle;
WT_SET_BTREE_IN_SESSION(session, trk->btree);
- if (!unroll)
- WT_TRET(__wt_bm_checkpoint_resolve(session));
+ if (!unroll) {
+ bm = trk->btree->bm;
+ WT_TRET(bm->checkpoint_resolve(bm, session));
+ }
session->dhandle = saved_dhandle;
break;
case WT_ST_LOCK: /* Handle lock, see above */
@@ -183,10 +189,13 @@ free: trk->op = WT_ST_EMPTY;
int
__wt_meta_track_off(WT_SESSION_IMPL *session, int unroll)
{
+ WT_DATA_HANDLE *saved_dhandle;
WT_DECL_RET;
WT_META_TRACK *trk, *trk_orig;
- if (!WT_META_TRACKING(session))
+ WT_ASSERT(session,
+ WT_META_TRACKING(session) && session->meta_track_nest > 0);
+ if (--session->meta_track_nest != 0)
return (0);
trk_orig = session->meta_track;
@@ -198,6 +207,14 @@ __wt_meta_track_off(WT_SESSION_IMPL *session, int unroll)
while (--trk >= trk_orig)
WT_TRET(__meta_track_apply(session, trk, unroll));
+ /* If the operation succeeded, checkpoint the metadata. */
+ if (!unroll && ret == 0 && session->metafile != NULL) {
+ saved_dhandle = session->dhandle;
+ WT_SET_BTREE_IN_SESSION(session, session->metafile);
+ ret = __wt_checkpoint(session, NULL);
+ session->dhandle = saved_dhandle;
+ }
+
return (ret);
}