summaryrefslogtreecommitdiff
path: root/src/mongo/db/catalog/rename_collection_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/catalog/rename_collection_test.cpp')
-rw-r--r--src/mongo/db/catalog/rename_collection_test.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/mongo/db/catalog/rename_collection_test.cpp b/src/mongo/db/catalog/rename_collection_test.cpp
index 9e8f5ba2ac6..c0bfc7c792e 100644
--- a/src/mongo/db/catalog/rename_collection_test.cpp
+++ b/src/mongo/db/catalog/rename_collection_test.cpp
@@ -106,6 +106,7 @@ public:
std::vector<std::string> oplogEntries;
bool onInsertsThrows = false;
+ bool onInsertsIsGlobalWriteLockExclusive = false;
bool onRenameCollectionCalled = false;
repl::OpTime renameOpTime = {Timestamp(Seconds(100), 1U), 1LL};
@@ -138,6 +139,11 @@ void OpObserverMock::onInserts(OperationContext* opCtx,
uasserted(ErrorCodes::OperationFailed, "insert failed");
}
+ // Check global lock state.
+ auto lockState = opCtx->lockState();
+ ASSERT_TRUE(lockState->isWriteLocked());
+ onInsertsIsGlobalWriteLockExclusive = lockState->isW();
+
_logOp(opCtx, nss, "inserts");
OpObserverNoop::onInserts(opCtx, nss, uuid, begin, end, fromMigrate);
}
@@ -768,4 +774,23 @@ TEST_F(RenameCollectionTest, RenameCollectionAcrossDatabaseDropsTemporaryCollect
_checkOplogEntries(_opObserver->oplogEntries, {"create", "index", "drop"});
}
+TEST_F(RenameCollectionTest,
+ RenameCollectionAcrossDatabaseDowngradesGlobalWriteLockToNonExclusive) {
+ _createCollection(_opCtx.get(), _sourceNss);
+ _insertDocument(_opCtx.get(), _sourceNss, BSON("_id" << 0));
+ ASSERT_OK(renameCollection(_opCtx.get(), _sourceNss, _targetNssDifferentDb, {}));
+ ASSERT_FALSE(_opObserver->onInsertsIsGlobalWriteLockExclusive);
+}
+
+TEST_F(RenameCollectionTest,
+ RenameCollectionAcrossDatabaseKeepsGlobalWriteLockExclusiveIfCallerHasGlobalWriteLock) {
+ // This simulates the case when renameCollection is called using the applyOps command (different
+ // from secondary oplog application).
+ _createCollection(_opCtx.get(), _sourceNss);
+ _insertDocument(_opCtx.get(), _sourceNss, BSON("_id" << 0));
+ Lock::GlobalWrite globalWrite(_opCtx.get());
+ ASSERT_OK(renameCollection(_opCtx.get(), _sourceNss, _targetNssDifferentDb, {}));
+ ASSERT_TRUE(_opObserver->onInsertsIsGlobalWriteLockExclusive);
+}
+
} // namespace