summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2020-03-04 15:03:14 -0500
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-03-04 20:19:40 +0000
commitc752f2b20efee7de94123787950415723c38b91f (patch)
treeaa0c6e902a1914ee18351f47754a3dc63f452140
parent0ef652f6456a46b6e162e147f75ab5cdd05018f5 (diff)
downloadmongo-c752f2b20efee7de94123787950415723c38b91f.tar.gz
SERVER-46601 disallow two phase index builds for non-replicated collections
-rw-r--r--jstests/noPassthrough/list_indexes_ready_and_in_progress.js9
-rw-r--r--src/mongo/db/commands/create_indexes.cpp18
2 files changed, 16 insertions, 11 deletions
diff --git a/jstests/noPassthrough/list_indexes_ready_and_in_progress.js b/jstests/noPassthrough/list_indexes_ready_and_in_progress.js
index 00217196457..69319d92de5 100644
--- a/jstests/noPassthrough/list_indexes_ready_and_in_progress.js
+++ b/jstests/noPassthrough/list_indexes_ready_and_in_progress.js
@@ -1,13 +1,16 @@
/**
* Tests that the listIndexes command shows ready and in-progress indexes.
+ * @tags: [requires_replication]
*/
(function() {
"use strict";
load("jstests/noPassthrough/libs/index_build.js");
-const conn = MongoRunner.runMongod();
-assert.neq(null, conn, "mongod was unable to start up");
+const rst = new ReplSetTest({nodes: 1});
+const nodes = rst.startSet();
+rst.initiate();
+const conn = rst.getPrimary();
const testDB = conn.getDB("test");
assert.commandWorked(testDB.dropDatabase());
@@ -44,5 +47,5 @@ const exitCode = createIdx();
assert.eq(0, exitCode, 'expected shell to exit cleanly');
IndexBuildTest.assertIndexes(coll, 3, ["_id_", "a_1", "b_1"]);
-MongoRunner.stopMongod(conn);
+rst.stopSet();
}());
diff --git a/src/mongo/db/commands/create_indexes.cpp b/src/mongo/db/commands/create_indexes.cpp
index 525b83d14e0..a305baa7a69 100644
--- a/src/mongo/db/commands/create_indexes.cpp
+++ b/src/mongo/db/commands/create_indexes.cpp
@@ -276,9 +276,9 @@ Status validateTTLOptions(OperationContext* opCtx, const BSONObj& cmdObj) {
* commit quorum, which consists of all the data-bearing nodes.
*/
boost::optional<CommitQuorumOptions> parseAndGetCommitQuorum(OperationContext* opCtx,
+ IndexBuildProtocol protocol,
const BSONObj& cmdObj) {
auto replCoord = repl::ReplicationCoordinator::get(opCtx);
- auto twoPhaseindexBuildEnabled = IndexBuildsCoordinator::supportsTwoPhaseIndexBuild();
auto commitQuorumEnabled = (enableIndexBuildCommitQuorum) ? true : false;
if (cmdObj.hasField(kCommitQuorumFieldName)) {
@@ -288,13 +288,13 @@ boost::optional<CommitQuorumOptions> parseAndGetCommitQuorum(OperationContext* o
uassert(ErrorCodes::BadValue,
str::stream() << "commitQuorum is supported only for two phase index builds with "
"majority commit quorum support enabled ",
- (twoPhaseindexBuildEnabled && commitQuorumEnabled));
+ (IndexBuildProtocol::kTwoPhase == protocol && commitQuorumEnabled));
CommitQuorumOptions commitQuorum;
uassertStatusOK(commitQuorum.parse(cmdObj.getField(kCommitQuorumFieldName)));
return commitQuorum;
}
- if (twoPhaseindexBuildEnabled) {
+ if (IndexBuildProtocol::kTwoPhase == protocol) {
// Setting CommitQuorum to 0 will make the index build to opt out of voting proces.
return (replCoord->isReplEnabled() && commitQuorumEnabled)
? CommitQuorumOptions(CommitQuorumOptions::kMajority)
@@ -498,7 +498,13 @@ bool runCreateIndexesWithCoordinator(OperationContext* opCtx,
auto specs = uassertStatusOK(
parseAndValidateIndexSpecs(opCtx, ns, cmdObj, serverGlobalParams.featureCompatibility));
- boost::optional<CommitQuorumOptions> commitQuorum = parseAndGetCommitQuorum(opCtx, cmdObj);
+ auto replCoord = repl::ReplicationCoordinator::get(opCtx);
+ auto indexBuildsCoord = IndexBuildsCoordinator::get(opCtx);
+ auto protocol = IndexBuildsCoordinator::supportsTwoPhaseIndexBuild() &&
+ !replCoord->isOplogDisabledFor(opCtx, ns)
+ ? IndexBuildProtocol::kTwoPhase
+ : IndexBuildProtocol::kSinglePhase;
+ auto commitQuorum = parseAndGetCommitQuorum(opCtx, protocol, cmdObj);
Status validateTTL = validateTTLOptions(opCtx, cmdObj);
uassertStatusOK(validateTTL);
@@ -565,11 +571,7 @@ bool runCreateIndexesWithCoordinator(OperationContext* opCtx,
AutoStatsTracker::LogMode::kUpdateTopAndCurOp,
dbProfilingLevel);
- auto indexBuildsCoord = IndexBuildsCoordinator::get(opCtx);
auto buildUUID = UUID::gen();
- auto protocol = IndexBuildsCoordinator::supportsTwoPhaseIndexBuild()
- ? IndexBuildProtocol::kTwoPhase
- : IndexBuildProtocol::kSinglePhase;
LOGV2(20438, "Registering index build: {buildUUID}", "buildUUID"_attr = buildUUID);
ReplIndexBuildState::IndexCatalogStats stats;
IndexBuildsCoordinator::IndexBuildOptions indexBuildOptions = {commitQuorum};