summaryrefslogtreecommitdiff
path: root/src/mongo/db/repair_database.cpp
diff options
context:
space:
mode:
authorGregory Wlodarek <gregory.wlodarek@mongodb.com>2019-01-25 18:26:12 -0500
committerGregory Wlodarek <gregory.wlodarek@mongodb.com>2019-01-25 18:37:28 -0500
commitd76c1d8a1061cb4fe8111ded7db18d1ea9e6275e (patch)
tree36a06b8998b542f8a0536c99ccbde00740f9cf59 /src/mongo/db/repair_database.cpp
parentfca0ff24600172186132291171bd3324afc2b4dc (diff)
downloadmongo-d76c1d8a1061cb4fe8111ded7db18d1ea9e6275e.tar.gz
SERVER-39037 Refactor check whether a replica set node is running in standalone mode
Diffstat (limited to 'src/mongo/db/repair_database.cpp')
-rw-r--r--src/mongo/db/repair_database.cpp21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/mongo/db/repair_database.cpp b/src/mongo/db/repair_database.cpp
index 2e4007b90e1..20808127c4f 100644
--- a/src/mongo/db/repair_database.cpp
+++ b/src/mongo/db/repair_database.cpp
@@ -234,7 +234,8 @@ Status rebuildIndexesOnCollection(OperationContext* opCtx,
namespace {
Status repairCollections(OperationContext* opCtx,
StorageEngine* engine,
- const std::string& dbName) {
+ const std::string& dbName,
+ stdx::function<void(const std::string& dbName)> onRecordStoreRepair) {
DatabaseCatalogEntry* dbce = engine->getDatabaseCatalogEntry(opCtx, dbName);
@@ -242,8 +243,6 @@ Status repairCollections(OperationContext* opCtx,
dbce->getCollectionNamespaces(&colls);
for (std::list<std::string>::const_iterator it = colls.begin(); it != colls.end(); ++it) {
- // Don't check for interrupt after starting to repair a collection otherwise we can
- // leave data in an inconsistent state. Interrupting between collections is ok, however.
opCtx->checkForInterrupt();
log() << "Repairing collection " << *it;
@@ -251,13 +250,19 @@ Status repairCollections(OperationContext* opCtx,
Status status = engine->repairRecordStore(opCtx, *it);
if (!status.isOK())
return status;
+ }
+
+ onRecordStoreRepair(dbName);
+
+ for (std::list<std::string>::const_iterator it = colls.begin(); it != colls.end(); ++it) {
+ opCtx->checkForInterrupt();
CollectionCatalogEntry* cce = dbce->getCollectionCatalogEntry(*it);
auto swIndexNameObjs = getIndexNameObjs(opCtx, dbce, cce);
if (!swIndexNameObjs.isOK())
return swIndexNameObjs.getStatus();
- status = rebuildIndexesOnCollection(opCtx, dbce, cce, swIndexNameObjs.getValue());
+ Status status = rebuildIndexesOnCollection(opCtx, dbce, cce, swIndexNameObjs.getValue());
if (!status.isOK())
return status;
@@ -267,7 +272,10 @@ Status repairCollections(OperationContext* opCtx,
}
} // namespace
-Status repairDatabase(OperationContext* opCtx, StorageEngine* engine, const std::string& dbName) {
+Status repairDatabase(OperationContext* opCtx,
+ StorageEngine* engine,
+ const std::string& dbName,
+ stdx::function<void(const std::string& dbName)> onRecordStoreRepair) {
DisableDocumentValidation validationDisabler(opCtx);
// We must hold some form of lock here
@@ -308,7 +316,7 @@ Status repairDatabase(OperationContext* opCtx, StorageEngine* engine, const std:
}
});
- auto status = repairCollections(opCtx, engine, dbName);
+ auto status = repairCollections(opCtx, engine, dbName, onRecordStoreRepair);
if (!status.isOK()) {
severe() << "Failed to repair database " << dbName << ": " << status.reason();
return status;
@@ -316,4 +324,5 @@ Status repairDatabase(OperationContext* opCtx, StorageEngine* engine, const std:
return Status::OK();
}
+
} // namespace mongo