summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorA. Jesse Jiryu Davis <jesse@mongodb.com>2019-03-27 12:29:03 -0400
committerA. Jesse Jiryu Davis <jesse@mongodb.com>2019-03-27 18:00:23 -0400
commit9b00696ed75f65e1ebc8d635593bed79b290cfbb (patch)
treedc1e1d1b0f04925cab0ab279638cf434b7ed6bbb
parent4b859c936a6ba27506d11a2879b75b4bf6bfa876 (diff)
downloadmongo-r4.0.8.tar.gz
SERVER-40355 Handle RS config with _id larger than set sizer4.0.8-rc0r4.0.8
-rw-r--r--jstests/noPassthrough/member_id_too_large.js37
-rw-r--r--src/mongo/db/repl/topology_coordinator.cpp2
2 files changed, 38 insertions, 1 deletions
diff --git a/jstests/noPassthrough/member_id_too_large.js b/jstests/noPassthrough/member_id_too_large.js
new file mode 100644
index 00000000000..9e514d49a8e
--- /dev/null
+++ b/jstests/noPassthrough/member_id_too_large.js
@@ -0,0 +1,37 @@
+// Tests replSetInitiate and replSetReconfig with member _id values greater than the number of
+// members in the set, followed by waiting for writeConcern with "w" values equal to size of set.
+// @tags: [requires_replication]
+(function() {
+ "use strict";
+
+ const rst = new ReplSetTest({nodes: 2});
+ rst.startSet();
+
+ jsTestLog("replSetInitiate with member _id greater than number of members");
+
+ let conf = rst.getReplSetConfig();
+ conf.members[1]._id = 2;
+
+ rst.initiate(conf);
+
+ const dbName = "test";
+ const collName = "test";
+ const primary = rst.getPrimary();
+ const testColl = primary.getDB(dbName).getCollection(collName);
+ const doc = {a: 1};
+
+ assert.commandWorked(testColl.insert(doc, {writeConcern: {w: 2}}));
+
+ jsTestLog("replSetReconfig with member _id greater than number of members");
+
+ let secondary2 = MongoRunner.runMongod({replSet: rst.name});
+ conf = rst.getReplSetConfigFromNode();
+ conf.version++;
+ conf.members.push({_id: 5, host: secondary2.host});
+ assert.commandWorked(primary.getDB("admin").runCommand({replSetReconfig: conf}));
+ assert.commandWorked(testColl.insert(doc, {writeConcern: {w: 2}}));
+ assert.commandWorked(testColl.insert(doc, {writeConcern: {w: 3}}));
+
+ MongoRunner.stopMongod(secondary2);
+ rst.stopSet();
+})();
diff --git a/src/mongo/db/repl/topology_coordinator.cpp b/src/mongo/db/repl/topology_coordinator.cpp
index 1d1d242ed14..b6fb47ac5fa 100644
--- a/src/mongo/db/repl/topology_coordinator.cpp
+++ b/src/mongo/db/repl/topology_coordinator.cpp
@@ -1174,7 +1174,7 @@ bool TopologyCoordinator::haveNumNodesReachedOpTime(const OpTime& targetOpTime,
}
for (auto&& memberData : _memberData) {
- const auto isArbiter = _rsConfig.getMemberAt(memberData.getMemberId()).isArbiter();
+ const auto isArbiter = _rsConfig.getMemberAt(memberData.getConfigIndex()).isArbiter();
// We do not count arbiters towards the write concern.
if (isArbiter) {