diff options
author | A. Jesse Jiryu Davis <jesse@mongodb.com> | 2019-03-27 12:29:03 -0400 |
---|---|---|
committer | A. Jesse Jiryu Davis <jesse@mongodb.com> | 2019-03-27 18:00:23 -0400 |
commit | 9b00696ed75f65e1ebc8d635593bed79b290cfbb (patch) | |
tree | dc1e1d1b0f04925cab0ab279638cf434b7ed6bbb | |
parent | 4b859c936a6ba27506d11a2879b75b4bf6bfa876 (diff) | |
download | mongo-9b00696ed75f65e1ebc8d635593bed79b290cfbb.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.js | 37 | ||||
-rw-r--r-- | src/mongo/db/repl/topology_coordinator.cpp | 2 |
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) { |