summaryrefslogtreecommitdiff
path: root/src/mongo/db/catalog/drop_database.cpp
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2017-10-06 14:53:02 -0400
committerBenety Goh <benety@mongodb.com>2017-10-13 14:19:26 -0400
commitae3ea6327667d80aed87150fb8ed9ba21dbae1b0 (patch)
treea598b1071659876b8ab41feb4164f4780a67d966 /src/mongo/db/catalog/drop_database.cpp
parent82c6964a6fd3c71861e4c085effc73a52976a720 (diff)
downloadmongo-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.cpp14
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);