summaryrefslogtreecommitdiff
path: root/src/meta
diff options
context:
space:
mode:
authorMichael Cahill <michael.cahill@wiredtiger.com>2012-06-19 11:38:34 +1000
committerMichael Cahill <michael.cahill@wiredtiger.com>2012-06-19 11:38:34 +1000
commitdf46cd4697916e68110ac553c598f94a16c92366 (patch)
treeda2da440fb8fa18ef9e2dba335696f03a47f313e /src/meta
parent3e404fe091b654fd295c33a584abc1c8d1ce4859 (diff)
downloadmongo-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.c34
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.
*/