diff options
author | Benety Goh <benety@mongodb.com> | 2017-06-09 17:17:02 -0400 |
---|---|---|
committer | Benety Goh <benety@mongodb.com> | 2017-06-13 13:59:41 -0400 |
commit | e262c56e47d7f5c88e9f08833545c3cc35ad4769 (patch) | |
tree | 823327fa976a304842ade4912415fad20bcb4976 /src/mongo/db/catalog/database_test.cpp | |
parent | 133f0fd284abdf8a313d47b412f58e2cba60cc80 (diff) | |
download | mongo-e262c56e47d7f5c88e9f08833545c3cc35ad4769.tar.gz |
SERVER-29541 disallow drop-pending collections under master/slave
Diffstat (limited to 'src/mongo/db/catalog/database_test.cpp')
-rw-r--r-- | src/mongo/db/catalog/database_test.cpp | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/mongo/db/catalog/database_test.cpp b/src/mongo/db/catalog/database_test.cpp index d65a6145acd..0a71b6defbe 100644 --- a/src/mongo/db/catalog/database_test.cpp +++ b/src/mongo/db/catalog/database_test.cpp @@ -173,6 +173,43 @@ TEST_F(DatabaseTest, ASSERT_EQUALS(dropOpTime, *reaperEarliestDropOpTime); } +/** + * Sets up ReplicationCoordinator for master/slave. + */ +void _setUpMasterSlave(ServiceContext* service) { + repl::ReplSettings settings; + settings.setOplogSizeBytes(10 * 1024 * 1024); + settings.setMaster(true); + repl::ReplicationCoordinator::set( + service, stdx::make_unique<repl::ReplicationCoordinatorMock>(service, settings)); + auto replCoord = repl::ReplicationCoordinator::get(service); + ASSERT_TRUE(repl::ReplicationCoordinator::modeMasterSlave == replCoord->getReplicationMode()); +} + +TEST_F(DatabaseTest, + DropCollectionDropsCollectionAndLogsOperationIfWritesAreReplicatedAndReplModeIsMasterSlave) { + _setUpMasterSlave(getServiceContext()); + + ASSERT_TRUE(_opCtx->writesAreReplicated()); + ASSERT_FALSE( + repl::ReplicationCoordinator::get(_opCtx.get())->isOplogDisabledFor(_opCtx.get(), _nss)); + + _testDropCollection(_opCtx.get(), _nss, true); + + // Drop optime is non-null because an op was written to the oplog. + auto dropOpTime = repl::ReplClientInfo::forClient(&cc()).getLastOp(); + ASSERT_GREATER_THAN(dropOpTime, repl::OpTime()); + + // Replicated collection should not be renamed under master/slave. + auto dpns = _nss.makeDropPendingNamespace(dropOpTime); + ASSERT_FALSE(mongo::AutoGetCollectionForRead(_opCtx.get(), dpns).getCollection()); + + // Reaper should not have the drop optime of the collection. + auto reaperEarliestDropOpTime = + repl::DropPendingCollectionReaper::get(_opCtx.get())->getEarliestDropOpTime(); + ASSERT_FALSE(reaperEarliestDropOpTime); +} + TEST_F(DatabaseTest, DropCollectionRejectsProvidedDropOpTimeIfWritesAreReplicated) { ASSERT_TRUE(_opCtx->writesAreReplicated()); ASSERT_FALSE( @@ -219,6 +256,32 @@ TEST_F( ASSERT_EQUALS(dropOpTime, *reaperEarliestDropOpTime); } +TEST_F( + DatabaseTest, + DropCollectionIgnoresProvidedDropOpTimeAndDropsCollectionButDoesNotLogOperationIfReplModeIsMasterSlave) { + _setUpMasterSlave(getServiceContext()); + + repl::UnreplicatedWritesBlock uwb(_opCtx.get()); + ASSERT_FALSE(_opCtx->writesAreReplicated()); + ASSERT_TRUE( + repl::ReplicationCoordinator::get(_opCtx.get())->isOplogDisabledFor(_opCtx.get(), _nss)); + + repl::OpTime dropOpTime(Timestamp(Seconds(100), 0), 1LL); + _testDropCollection(_opCtx.get(), _nss, true, dropOpTime); + + // Last optime in repl client is null because we did not write to the oplog. + ASSERT_EQUALS(repl::OpTime(), repl::ReplClientInfo::forClient(&cc()).getLastOp()); + + // Collection is not renamed under master/slave. + auto dpns = _nss.makeDropPendingNamespace(dropOpTime); + ASSERT_FALSE(mongo::AutoGetCollectionForRead(_opCtx.get(), dpns).getCollection()); + + // Reaper should not have the drop optime of the collection. + auto reaperEarliestDropOpTime = + repl::DropPendingCollectionReaper::get(_opCtx.get())->getEarliestDropOpTime(); + ASSERT_FALSE(reaperEarliestDropOpTime); +} + void _testDropCollectionThrowsExceptionIfThereAreIndexesInProgress(OperationContext* opCtx, const NamespaceString& nss) { writeConflictRetry(opCtx, "testDropCollectionWithIndexesInProgress", nss.ns(), [opCtx, nss] { |