diff options
author | Michael Cahill <michael.cahill@wiredtiger.com> | 2012-06-19 11:38:34 +1000 |
---|---|---|
committer | Michael Cahill <michael.cahill@wiredtiger.com> | 2012-06-19 11:38:34 +1000 |
commit | df46cd4697916e68110ac553c598f94a16c92366 (patch) | |
tree | da2da440fb8fa18ef9e2dba335696f03a47f313e /src/meta | |
parent | 3e404fe091b654fd295c33a584abc1c8d1ce4859 (diff) | |
download | mongo-df46cd4697916e68110ac553c598f94a16c92366.tar.gz |
Defer making free pages available until the end of a checkpoint, in case it fails after processing some files.
Diffstat (limited to 'src/meta')
-rw-r--r-- | src/meta/meta_track.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/src/meta/meta_track.c b/src/meta/meta_track.c index b7d5c77bc35..9f17789a1cc 100644 --- a/src/meta/meta_track.c +++ b/src/meta/meta_track.c @@ -15,6 +15,7 @@ typedef struct __wt_meta_track { enum { WT_ST_EMPTY, /* Unused slot */ + WT_ST_CHECKPOINT, /* Complete a checkpoint */ WT_ST_FILEOP, /* File operation */ WT_ST_LOCK, /* Lock a handle */ WT_ST_REMOVE, /* Remove a metadata entry */ @@ -91,13 +92,25 @@ __meta_track_apply(WT_SESSION_IMPL *session, WT_META_TRACK *trk, int unroll) WT_DECL_RET; int tret; - /* Unlock handles regardless of whether we are unrolling. */ - if (!unroll && trk->op != WT_ST_LOCK) + /* + * Unlock handles and complete checkpoints regardless of whether we are + * unrolling. + */ + if (!unroll && trk->op != WT_ST_CHECKPOINT && trk->op != WT_ST_LOCK) goto free; switch (trk->op) { case WT_ST_EMPTY: /* Unused slot */ break; + case WT_ST_CHECKPOINT: /* Checkpoint, see above */ + saved_btree = session->btree; + session->btree = trk->btree; + if (!unroll) + WT_TRET(__wt_bm_snapshot_resolve(session, NULL)); + /* Release the snapshot lock */ + __wt_rwunlock(session, session->btree->snaplock); + session->btree = saved_btree; + break; case WT_ST_LOCK: /* Handle lock, see above */ saved_btree = session->btree; session->btree = trk->btree; @@ -234,6 +247,23 @@ __wt_meta_track_sub_off(WT_SESSION_IMPL *session) } /* + * __wt_meta_track_checkpoint -- + * Track a handle involved in a checkpoint. + */ +int +__wt_meta_track_checkpoint(WT_SESSION_IMPL *session) +{ + WT_META_TRACK *trk; + + WT_ASSERT(session, session->btree != NULL); + + WT_RET(__meta_track_next(session, &trk)); + + trk->op = WT_ST_CHECKPOINT; + trk->btree = session->btree; + return (0); +} +/* * __wt_meta_track_insert -- * Track an insert operation. */ |