diff options
author | Eliot Horowitz <eliot@10gen.com> | 2014-04-30 00:16:07 -0400 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2014-04-30 05:59:26 -0400 |
commit | 2516d36768448ee1b6a2246eb562f48e2f9a0751 (patch) | |
tree | f16c2d20ad4efe5dc881220ab6459bb89cba4518 | |
parent | 116d7d799a6edea172e612767d0605a913f7a9f5 (diff) | |
download | mongo-2516d36768448ee1b6a2246eb562f48e2f9a0751.tar.gz |
SERVER-13739: don't delete new files until as late as possible during repair
-rw-r--r-- | src/mongo/db/repair_database.cpp | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/src/mongo/db/repair_database.cpp b/src/mongo/db/repair_database.cpp index 098184c3c83..03d61395e61 100644 --- a/src/mongo/db/repair_database.cpp +++ b/src/mongo/db/repair_database.cpp @@ -430,21 +430,32 @@ namespace mongo { Database::closeDatabase( dbName, reservedPathString ); } + // at this point if we abort, we don't want to delete new files + // as they might be the only copies + + if ( repairFileDeleter.get() ) + repairFileDeleter->success(); + Client::Context ctx( dbName ); Database::closeDatabase(dbName, storageGlobalParams.dbpath); - if ( backupOriginalFiles ) { _renameForBackup( dbName, reservedPath ); } else { + // first make new directory before deleting data + Path newDir = Path(storageGlobalParams.dbpath) / dbName; + MONGO_ASSERT_ON_EXCEPTION(boost::filesystem::create_directory(newDir)); + + // this deletes old files _deleteDataFiles( dbName ); - MONGO_ASSERT_ON_EXCEPTION( - boost::filesystem::create_directory(Path(storageGlobalParams.dbpath) / dbName)); - } - if ( repairFileDeleter.get() ) - repairFileDeleter->success(); + if ( !boost::filesystem::exists(newDir) ) { + // we deleted because of directoryperdb + // re-create + MONGO_ASSERT_ON_EXCEPTION(boost::filesystem::create_directory(newDir)); + } + } _replaceWithRecovered( dbName, reservedPathString.c_str() ); |