diff options
author | Benety Goh <benety@mongodb.com> | 2020-03-04 15:03:14 -0500 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-03-04 20:19:40 +0000 |
commit | c752f2b20efee7de94123787950415723c38b91f (patch) | |
tree | aa0c6e902a1914ee18351f47754a3dc63f452140 | |
parent | 0ef652f6456a46b6e162e147f75ab5cdd05018f5 (diff) | |
download | mongo-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.js | 9 | ||||
-rw-r--r-- | src/mongo/db/commands/create_indexes.cpp | 18 |
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}; |