diff options
author | Alex Gorrod <alexander.gorrod@mongodb.com> | 2015-06-26 09:38:56 +1000 |
---|---|---|
committer | Michael Cahill <michael.cahill@mongodb.com> | 2015-06-29 15:06:59 +1000 |
commit | 9f72da7968f828753276aaf92afbb0c82f75a3b4 (patch) | |
tree | 8d2e7b563552f72aff8755f6c2d2dcc39c1d2d8d /src/meta/meta_track.c | |
parent | 3751941f5339b257d9fd9c19879f1a901facfbb6 (diff) | |
download | mongo-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.c | 29 |
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. */ |