summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEliot Horowitz <eliot@10gen.com>2014-04-30 00:16:07 -0400
committerEliot Horowitz <eliot@10gen.com>2014-04-30 05:59:26 -0400
commit2516d36768448ee1b6a2246eb562f48e2f9a0751 (patch)
treef16c2d20ad4efe5dc881220ab6459bb89cba4518
parent116d7d799a6edea172e612767d0605a913f7a9f5 (diff)
downloadmongo-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.cpp23
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() );