diff options
Diffstat (limited to 'jstests/replsets/catchup_takeover_one_high_priority.js')
-rw-r--r-- | jstests/replsets/catchup_takeover_one_high_priority.js | 166 |
1 files changed, 84 insertions, 82 deletions
diff --git a/jstests/replsets/catchup_takeover_one_high_priority.js b/jstests/replsets/catchup_takeover_one_high_priority.js index 575407c19d2..10c6b99307f 100644 --- a/jstests/replsets/catchup_takeover_one_high_priority.js +++ b/jstests/replsets/catchup_takeover_one_high_priority.js @@ -14,86 +14,88 @@ // that it becomes primary. (function() { - 'use strict'; - - load('jstests/replsets/rslib.js'); - - var name = 'catchup_takeover_one_high_priority'; - var replSet = new ReplSetTest({name: name, nodes: 3, useBridge: true}); - - var nodenames = replSet.nodeList(); - var nodes = replSet.startSet(); - replSet.initiateWithAnyNodeAsPrimary({ - "_id": name, - "members": [ - {"_id": 0, "host": nodenames[0]}, - {"_id": 1, "host": nodenames[1]}, - {"_id": 2, "host": nodenames[2], "priority": 2} - ] - }); - - // Wait until node 2 becomes primary. - replSet.waitForState(2, ReplSetTest.State.PRIMARY, replSet.kDefaultTimeoutMS); - jsTestLog('node 2 is now primary'); - - replSet.awaitReplication(); - - // Stop replication and disconnect node 2 so that it cannot do a priority takeover. - stopServerReplication(nodes[2]); - nodes[2].disconnect(nodes[1]); - nodes[2].disconnect(nodes[0]); - - // Ensure that node 0 becomes primary. - assert.commandWorked(nodes[0].adminCommand({replSetStepUp: 1})); - replSet.awaitNodesAgreeOnPrimary(replSet.kDefaultTimeoutMS, nodes.slice(0, 2)); - assert.eq(ReplSetTest.State.PRIMARY, - assert.commandWorked(nodes[0].adminCommand('replSetGetStatus')).myState, - nodes[0].host + " was not primary after step-up"); - jsTestLog('node 0 is now primary'); - - // Sleep for a few seconds to ensure that node 2's optime is more than 2 seconds behind. - // This will ensure it can't do a priority takeover until it catches up. - sleep(3000); - - var primary = replSet.getPrimary(); - var writeConcern = {writeConcern: {w: 2, wtimeout: replSet.kDefaultTimeoutMS}}; - assert.writeOK(primary.getDB(name).bar.insert({y: 100}, writeConcern)); - - // Write something so that node 0 is ahead of node 1. - stopServerReplication(nodes[1]); - writeConcern = {writeConcern: {w: 1, wtimeout: replSet.kDefaultTimeoutMS}}; - assert.writeOK(primary.getDB(name).bar.insert({x: 100}, writeConcern)); - - nodes[2].reconnect(nodes[0]); - nodes[2].reconnect(nodes[1]); - - // Step up a lagged node. - assert.commandWorked(nodes[1].adminCommand({replSetStepUp: 1})); - replSet.awaitNodesAgreeOnPrimary(replSet.kDefaultTimeoutMS, nodes); - assert.eq(ReplSetTest.State.PRIMARY, - assert.commandWorked(nodes[1].adminCommand('replSetGetStatus')).myState, - nodes[1].host + " was not primary after step-up"); - jsTestLog('node 1 is now primary, but cannot accept writes'); - - // Confirm that the most up-to-date node becomes primary - // after the default catchup delay. - replSet.waitForState(0, ReplSetTest.State.PRIMARY, 60 * 1000); - jsTestLog('node 0 performed catchup takeover and is now primary'); - - // Wait until the old primary steps down. - replSet.awaitNodesAgreeOnPrimary(); - - // Let the nodes catchup. - restartServerReplication(nodes[1]); - restartServerReplication(nodes[2]); - - // Confirm that the highest priority node becomes primary - // after catching up. - replSet.waitForState(2, ReplSetTest.State.PRIMARY, 30 * 1000); - jsTestLog('node 2 performed priority takeover and is now primary'); - - // Wait until the old primary steps down so the connections won't be closed during stopSet(). - replSet.waitForState(0, ReplSetTest.State.SECONDARY, replSet.kDefaultTimeoutMS); - - replSet.stopSet(); +'use strict'; + +load('jstests/replsets/rslib.js'); + +var name = 'catchup_takeover_one_high_priority'; +var replSet = new ReplSetTest({name: name, nodes: 3, useBridge: true}); + +var nodenames = replSet.nodeList(); +var nodes = replSet.startSet(); +replSet.initiateWithAnyNodeAsPrimary({ + "_id": name, + "members": [ + {"_id": 0, "host": nodenames[0]}, + {"_id": 1, "host": nodenames[1]}, + {"_id": 2, "host": nodenames[2], "priority": 2} + ] +}); + +// Wait until node 2 becomes primary. +replSet.waitForState(2, ReplSetTest.State.PRIMARY, replSet.kDefaultTimeoutMS); +jsTestLog('node 2 is now primary'); + +replSet.awaitReplication(); + +// Stop replication and disconnect node 2 so that it cannot do a priority takeover. +stopServerReplication(nodes[2]); +nodes[2].disconnect(nodes[1]); +nodes[2].disconnect(nodes[0]); + +// Ensure that node 0 becomes primary. +assert.commandWorked(nodes[0].adminCommand({replSetStepUp: 1})); +replSet.awaitNodesAgreeOnPrimary(replSet.kDefaultTimeoutMS, nodes.slice(0, 2)); +assert.eq(ReplSetTest.State.PRIMARY, + assert.commandWorked(nodes[0].adminCommand('replSetGetStatus')).myState, + nodes[0].host + " was not primary after step-up"); +jsTestLog('node 0 is now primary'); + +// Sleep for a few seconds to ensure that node 2's optime is more than 2 seconds behind. +// This will ensure it can't do a priority takeover until it catches up. +sleep(3000); + +var primary = replSet.getPrimary(); +var writeConcern = {writeConcern: {w: 2, wtimeout: replSet.kDefaultTimeoutMS}}; +assert.writeOK(primary.getDB(name).bar.insert({y: 100}, writeConcern)); + +// Write something so that node 0 is ahead of node 1. +stopServerReplication(nodes[1]); +writeConcern = { + writeConcern: {w: 1, wtimeout: replSet.kDefaultTimeoutMS} +}; +assert.writeOK(primary.getDB(name).bar.insert({x: 100}, writeConcern)); + +nodes[2].reconnect(nodes[0]); +nodes[2].reconnect(nodes[1]); + +// Step up a lagged node. +assert.commandWorked(nodes[1].adminCommand({replSetStepUp: 1})); +replSet.awaitNodesAgreeOnPrimary(replSet.kDefaultTimeoutMS, nodes); +assert.eq(ReplSetTest.State.PRIMARY, + assert.commandWorked(nodes[1].adminCommand('replSetGetStatus')).myState, + nodes[1].host + " was not primary after step-up"); +jsTestLog('node 1 is now primary, but cannot accept writes'); + +// Confirm that the most up-to-date node becomes primary +// after the default catchup delay. +replSet.waitForState(0, ReplSetTest.State.PRIMARY, 60 * 1000); +jsTestLog('node 0 performed catchup takeover and is now primary'); + +// Wait until the old primary steps down. +replSet.awaitNodesAgreeOnPrimary(); + +// Let the nodes catchup. +restartServerReplication(nodes[1]); +restartServerReplication(nodes[2]); + +// Confirm that the highest priority node becomes primary +// after catching up. +replSet.waitForState(2, ReplSetTest.State.PRIMARY, 30 * 1000); +jsTestLog('node 2 performed priority takeover and is now primary'); + +// Wait until the old primary steps down so the connections won't be closed during stopSet(). +replSet.waitForState(0, ReplSetTest.State.SECONDARY, replSet.kDefaultTimeoutMS); + +replSet.stopSet(); })(); |