mirror of
https://github.com/mongodb/mongo.git
synced 2024-12-01 09:32:32 +01:00
35 lines
1.5 KiB
JavaScript
35 lines
1.5 KiB
JavaScript
/**
|
|
* In a 2 (or 3) node replica set, a new candidate should be able to overtake a current primary with
|
|
* a single round of election votes. This is enabled by the ability of a current primary to both
|
|
* step down *and* cast its vote for a new primary in a single step, in response to a vote request
|
|
* from a higher term than its own. This test verifies that an old primary is able to do this
|
|
* successfully.
|
|
*/
|
|
(function() {
|
|
"use strict";
|
|
|
|
let name = "primary_casts_vote_on_stepdown";
|
|
let replTest = new ReplSetTest({name: name, nodes: 2});
|
|
|
|
let nodes = replTest.startSet();
|
|
replTest.initiate();
|
|
|
|
// Make sure node 0 is initially primary, and then step up node 1 and make sure it is able to
|
|
// become primary in one election, gathering the vote of node 0, who will be forced to step
|
|
// down in the act of granting its vote to node 1.
|
|
jsTestLog("Make sure node 0 (" + nodes[0] + ") is primary.");
|
|
replTest.waitForState(nodes[0], ReplSetTest.State.PRIMARY);
|
|
let res = assert.commandWorked(nodes[0].adminCommand("replSetGetStatus"));
|
|
let firstPrimaryTerm = res.term;
|
|
|
|
jsTestLog("Stepping up node 1 (" + nodes[1] + ").");
|
|
replTest.stepUp(nodes[1]);
|
|
replTest.waitForState(nodes[1], ReplSetTest.State.PRIMARY);
|
|
// The election should have happened in a single attempt, so the term of the new primary should
|
|
// be exactly 1 greater than the old primary.
|
|
res = assert.commandWorked(nodes[1].adminCommand("replSetGetStatus"));
|
|
assert.eq(firstPrimaryTerm + 1, res.term);
|
|
|
|
replTest.stopSet();
|
|
})();
|