diff options
author | Benety Goh <benety@mongodb.com> | 2017-10-06 14:53:02 -0400 |
---|---|---|
committer | Benety Goh <benety@mongodb.com> | 2017-10-13 14:19:26 -0400 |
commit | ae3ea6327667d80aed87150fb8ed9ba21dbae1b0 (patch) | |
tree | a598b1071659876b8ab41feb4164f4780a67d966 /src/mongo/db/catalog/drop_database.cpp | |
parent | 82c6964a6fd3c71861e4c085effc73a52976a720 (diff) | |
download | mongo-ae3ea6327667d80aed87150fb8ed9ba21dbae1b0.tar.gz |
SERVER-31436 dropDatabase ensures writes are still accepted before finishing database drop
Diffstat (limited to 'src/mongo/db/catalog/drop_database.cpp')
-rw-r--r-- | src/mongo/db/catalog/drop_database.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/mongo/db/catalog/drop_database.cpp b/src/mongo/db/catalog/drop_database.cpp index 1df925e5b49..ff526a9feda 100644 --- a/src/mongo/db/catalog/drop_database.cpp +++ b/src/mongo/db/catalog/drop_database.cpp @@ -224,6 +224,20 @@ Status dropDatabase(OperationContext* opCtx, const std::string& dbName) { return writeConflictRetry(opCtx, "dropDatabase_database", dbName, [&] { Lock::GlobalWrite lk(opCtx); + + bool userInitiatedWritesAndNotPrimary = + opCtx->writesAreReplicated() && !replCoord->canAcceptWritesForDatabase(opCtx, dbName); + + if (userInitiatedWritesAndNotPrimary) { + return Status(ErrorCodes::NotMaster, + str::stream() << "Could not drop database " << dbName + << " because we transitioned from PRIMARY to " + << replCoord->getMemberState().toString() + << " while waiting for " + << numCollectionsToDrop + << " pending collection drop(s)."); + } + AutoGetDb autoDB(opCtx, dbName, MODE_X); if (auto db = autoDB.getDb()) { return _finishDropDatabase(opCtx, dbName, db); |