diff options
author | Michael Cahill <michael.cahill@wiredtiger.com> | 2013-03-25 16:37:32 +1100 |
---|---|---|
committer | Michael Cahill <michael.cahill@wiredtiger.com> | 2013-03-25 16:37:32 +1100 |
commit | 068bd803ba2bb21feae8b7508f69f228b33d07e9 (patch) | |
tree | f8f386c051202c0c3923fae15c71a6cff376d7cf /src/meta/meta_track.c | |
parent | 4be1afdf665bf4bd4449910049fcb0c0ccb9286e (diff) | |
parent | 01d65d9b536e162ae900aa16158eb29d3144528a (diff) | |
download | mongo-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.c | 29 |
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); } |