diff options
Diffstat (limited to 'src/mongo/db/catalog/rename_collection_test.cpp')
-rw-r--r-- | src/mongo/db/catalog/rename_collection_test.cpp | 25 |
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 |