summaryrefslogtreecommitdiff
path: root/src/mongo/db/catalog/database_test.cpp
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2017-06-09 17:17:02 -0400
committerBenety Goh <benety@mongodb.com>2017-06-13 13:59:41 -0400
commite262c56e47d7f5c88e9f08833545c3cc35ad4769 (patch)
tree823327fa976a304842ade4912415fad20bcb4976 /src/mongo/db/catalog/database_test.cpp
parent133f0fd284abdf8a313d47b412f58e2cba60cc80 (diff)
downloadmongo-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.cpp63
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] {