summaryrefslogtreecommitdiff
path: root/src/meta/meta_track.c
diff options
context:
space:
mode:
authorAlex Gorrod <alexander.gorrod@mongodb.com>2015-06-26 09:38:56 +1000
committerMichael Cahill <michael.cahill@mongodb.com>2015-06-29 15:06:59 +1000
commit9f72da7968f828753276aaf92afbb0c82f75a3b4 (patch)
tree8d2e7b563552f72aff8755f6c2d2dcc39c1d2d8d /src/meta/meta_track.c
parent3751941f5339b257d9fd9c19879f1a901facfbb6 (diff)
downloadmongo-9f72da7968f828753276aaf92afbb0c82f75a3b4.tar.gz
SERVER-18838 During drops, don't remove files until the metadata is durable.
(cherry picked from commit b847cccb204b0d621c9e14a07368dd1287a77b87)
Diffstat (limited to 'src/meta/meta_track.c')
-rw-r--r--src/meta/meta_track.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/meta/meta_track.c b/src/meta/meta_track.c
index 62d4df47ff6..66e7e3977f4 100644
--- a/src/meta/meta_track.c
+++ b/src/meta/meta_track.c
@@ -17,6 +17,7 @@ typedef struct __wt_meta_track {
enum {
WT_ST_EMPTY, /* Unused slot */
WT_ST_CHECKPOINT, /* Complete a checkpoint */
+ WT_ST_DROP_COMMIT, /* Drop post commit */
WT_ST_FILEOP, /* File operation */
WT_ST_LOCK, /* Lock a handle */
WT_ST_REMOVE, /* Remove a metadata entry */
@@ -106,7 +107,8 @@ __meta_track_apply(WT_SESSION_IMPL *session, WT_META_TRACK *trk, int unroll)
* Unlock handles and complete checkpoints regardless of whether we are
* unrolling.
*/
- if (!unroll && trk->op != WT_ST_CHECKPOINT && trk->op != WT_ST_LOCK)
+ if (!unroll && trk->op != WT_ST_CHECKPOINT &&
+ trk->op != WT_ST_DROP_COMMIT && trk->op != WT_ST_LOCK)
goto free;
switch (trk->op) {
@@ -120,6 +122,14 @@ __meta_track_apply(WT_SESSION_IMPL *session, WT_META_TRACK *trk, int unroll)
WT_TRET(bm->checkpoint_resolve(bm, session)));
}
break;
+ case WT_ST_DROP_COMMIT:
+ if ((tret = __wt_remove_if_exists(session, trk->a)) != 0) {
+ __wt_err(session, tret,
+ "metadata remove dropped file %s",
+ trk->a);
+ WT_TRET(tret);
+ }
+ break;
case WT_ST_LOCK: /* Handle lock, see above */
if (unroll && trk->created)
F_SET(trk->dhandle, WT_DHANDLE_DISCARD);
@@ -394,6 +404,23 @@ __wt_meta_track_fileop(
}
/*
+ * __wt_meta_track_drop --
+ * Track a file drop, where the remove is deferred until commit.
+ */
+int
+__wt_meta_track_drop(
+ WT_SESSION_IMPL *session, const char *filename)
+{
+ WT_META_TRACK *trk;
+
+ WT_RET(__meta_track_next(session, &trk));
+
+ trk->op = WT_ST_DROP_COMMIT;
+ WT_RET(__wt_strdup(session, filename, &trk->a));
+ return (0);
+}
+
+/*
* __wt_meta_track_handle_lock --
* Track a locked handle.
*/