diff options
author | Tommaso Tocci <tommaso.tocci@mongodb.com> | 2020-10-01 14:20:08 +0200 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-10-03 06:49:00 +0000 |
commit | c9cb7ecc844b1ea3b14db4afcb8edaedb5a337ce (patch) | |
tree | 59f508633de0249f93fac4684a814497513db2b4 /jstests | |
parent | 66999d4a0c312052f2987f7f283155d468a995f5 (diff) | |
download | mongo-c9cb7ecc844b1ea3b14db4afcb8edaedb5a337ce.tar.gz |
SERVER-48170 Multiversion tests assume primary stability when using upgradeCluster() with 2-node replica set shards
(cherry picked from commit 478bf480ebfad1ab6fee19cb9a199071115f42c8)
Diffstat (limited to 'jstests')
5 files changed, 46 insertions, 27 deletions
diff --git a/jstests/multiVersion/agg_merge_upsert_supplied_replset.js b/jstests/multiVersion/agg_merge_upsert_supplied_replset.js index 3a360efee5b..e3eaa2d4e6a 100644 --- a/jstests/multiVersion/agg_merge_upsert_supplied_replset.js +++ b/jstests/multiVersion/agg_merge_upsert_supplied_replset.js @@ -31,7 +31,7 @@ let targetColl = testDB.target_coll; function refreshReplSet(version, secondariesOnly) { // Upgrade the set and wait for it to become available again. if (secondariesOnly) { - rst.upgradeSecondaries(rst.getPrimary(), {binVersion: version}); + rst.upgradeSecondaries({binVersion: version}); } else { rst.upgradeSet({binVersion: version}); } @@ -89,4 +89,4 @@ assert.sameMembers(targetColl.find().toArray(), sourceColl.find().toArray()); assert.commandWorked(targetColl.remove({})); rst.stopSet(); -})();
\ No newline at end of file +})(); diff --git a/jstests/multiVersion/genericSetFCVUsage/major_version_upgrade.js b/jstests/multiVersion/genericSetFCVUsage/major_version_upgrade.js index c1c608a54ff..89893130172 100644 --- a/jstests/multiVersion/genericSetFCVUsage/major_version_upgrade.js +++ b/jstests/multiVersion/genericSetFCVUsage/major_version_upgrade.js @@ -227,8 +227,10 @@ for (let i = 0; i < versions.length; i++) { let primary = rst.getPrimary(); // Upgrade the secondary nodes first. - rst.upgradeSecondaries(primary, {binVersion: version.binVersion}); + rst.upgradeSecondaries({binVersion: version.binVersion}); + assert.eq( + primary, rst.getPrimary(), "Primary changed unexpectedly after upgrading secondaries"); assert.neq(null, primary, `replica set was unable to start up after upgrading secondaries to version: ${ diff --git a/jstests/multiVersion/libs/multi_rs.js b/jstests/multiVersion/libs/multi_rs.js index 96c1df55982..5c21853423f 100644 --- a/jstests/multiVersion/libs/multi_rs.js +++ b/jstests/multiVersion/libs/multi_rs.js @@ -2,6 +2,13 @@ // Utility functions for multi-version replica sets // +ReplSetTest.prototype._stablePrimaryOnRestarts = function() { + // In a 2-node replica set the secondary can step up after a restart. In fact while the + // secondary is being restarted, the primary may end up stepping down (due to heartbeats not + // being received) and for the restarted node to run for and win the election. + return this.nodes.length > 2; +}; + /** * Upgrade or downgrade replica sets. * @@ -10,28 +17,38 @@ * @param pwd {string} optional, password for authentication. Must be set if user is set. */ ReplSetTest.prototype.upgradeSet = function(options, user, pwd) { + this.awaitNodesAgreeOnPrimary(); let primary = this.getPrimary(); - this.upgradeSecondaries(primary, Object.assign({}, options), user, pwd); - this.upgradeArbiters(primary, Object.assign({}, options), user, pwd); + this.upgradeSecondaries(Object.assign({}, options), user, pwd); + this.upgradeArbiters(Object.assign({}, options), user, pwd); - // Upgrade the primary after stepping down. + if (!this._stablePrimaryOnRestarts()) { + this.awaitNodesAgreeOnPrimary(); + if (this.getPrimary() != primary) { + this.upgradeMembers([primary], Object.assign({}, options), user, pwd); + return; + } + } + + assert.eq( + this.getPrimary(), primary, "Primary changed unexpectedly after upgrading secondaries"); this.upgradePrimary(primary, Object.assign({}, options), user, pwd); }; -ReplSetTest.prototype.upgradeMembers = function(primary, members, options, user, pwd) { - const noDowntimePossible = this.nodes.length > 2; +function mergeNodeOptions(nodeOptions, options) { + for (let nodeName in nodeOptions) { + nodeOptions[nodeName] = Object.merge(nodeOptions[nodeName], options); + } + return nodeOptions; +} +ReplSetTest.prototype.upgradeMembers = function(members, options, user, pwd) { // Merge new options into node settings. - for (let nodeName in this.nodeOptions) { - this.nodeOptions[nodeName] = Object.merge(this.nodeOptions[nodeName], options); - } + this.nodeOptions = mergeNodeOptions(this.nodeOptions, options); for (let member of members) { this.upgradeNode(member, options, user, pwd); - - if (noDowntimePossible) - assert.eq(this.getPrimary(), primary); } }; @@ -42,21 +59,22 @@ ReplSetTest.prototype.getNonArbiterSecondaries = function() { return nonArbiters; }; -ReplSetTest.prototype.upgradeSecondaries = function(primary, options, user, pwd) { - this.upgradeMembers(primary, this.getNonArbiterSecondaries(), options, user, pwd); +ReplSetTest.prototype.upgradeSecondaries = function(options, user, pwd) { + this.upgradeMembers(this.getNonArbiterSecondaries(), options, user, pwd); }; -ReplSetTest.prototype.upgradeArbiters = function(primary, options, user, pwd) { +ReplSetTest.prototype.upgradeArbiters = function(options, user, pwd) { // We don't support downgrading data files for arbiters. We need to instead delete the dbpath. + const oldStartClean = {startClean: (options && !!options["startClean"])}; if (options && options.binVersion == "last-stable") { options["startClean"] = true; } - this.upgradeMembers(primary, this.getArbiters(), options, user, pwd); + this.upgradeMembers(this.getArbiters(), options, user, pwd); + // Make sure we don't set {startClean:true} on other nodes unless the user explicitly requested. + this.nodeOptions = mergeNodeOptions(this.nodeOptions, oldStartClean); }; ReplSetTest.prototype.upgradePrimary = function(primary, options, user, pwd) { - const noDowntimePossible = this.nodes.length > 2; - // Merge new options into node settings. for (let nodeName in this.nodeOptions) { this.nodeOptions[nodeName] = Object.merge(this.nodeOptions[nodeName], options); @@ -79,9 +97,10 @@ ReplSetTest.prototype.upgradePrimary = function(primary, options, user, pwd) { let newPrimary = this.getPrimary(); - if (noDowntimePossible) - assert.eq(newPrimary, primary); - + if (this._stablePrimaryOnRestarts()) { + assert.eq( + newPrimary, primary, "Primary changed unexpectedly after upgrading old primary node"); + } return newPrimary; }; @@ -118,7 +137,7 @@ ReplSetTest.prototype.upgradeNode = function(node, opts = {}, user, pwd) { ReplSetTest.prototype.stepdown = function(nodeId) { nodeId = this.getNodeId(nodeId); - assert.eq(this.getNodeId(this.getPrimary()), nodeId); + assert.eq(this.getNodeId(this.getPrimary()), nodeId, "Trying to stepdown a non primary node"); var node = this.nodes[nodeId]; assert.soonNoExcept(function() { diff --git a/jstests/multiVersion/merge_out_upgrade_downgrade.js b/jstests/multiVersion/merge_out_upgrade_downgrade.js index 53f9c9d0b2c..6cc62bc6d64 100644 --- a/jstests/multiVersion/merge_out_upgrade_downgrade.js +++ b/jstests/multiVersion/merge_out_upgrade_downgrade.js @@ -86,7 +86,7 @@ let testRepl = function() { replTest.startSet(); replTest.initiate(); // Upgrade secondary to latest version. - replTest.upgradeSecondaries(replTest.getPrimary(), {binVersion: "latest"}); + replTest.upgradeSecondaries({binVersion: "latest"}); let [primary, primaryDb, secondaryDb, inputCollPrimary, inputCollSecondary] = awaitReplSet(replTest); diff --git a/jstests/sharding/mongod_returns_no_cluster_time_without_keys.js b/jstests/sharding/mongod_returns_no_cluster_time_without_keys.js index 2665415aab5..8b3c80ea12f 100644 --- a/jstests/sharding/mongod_returns_no_cluster_time_without_keys.js +++ b/jstests/sharding/mongod_returns_no_cluster_time_without_keys.js @@ -13,8 +13,6 @@ // compatible with implicit sessions. TestData.disableImplicitSessions = true; -load("jstests/multiVersion/libs/multi_rs.js"); - const keyFile = 'jstests/libs/key1'; const adminUser = { db: "admin", |