Make node join existing quorum when seeing a VOTE message for larger term
Fixes testAdd and testRestart (with initialTerm = 1000)de64
parent
b1da201d76
commit
7e11ac2477
26
tinyraft.js
26
tinyraft.js
|
@ -156,13 +156,33 @@ class TinyRaft extends EventEmitter
|
|||
|
||||
onReceiveVote(from, msg)
|
||||
{
|
||||
if (msg.term != this.term)
|
||||
if (!msg.leader || msg.term < this.term)
|
||||
{
|
||||
return;
|
||||
}
|
||||
this.voted++;
|
||||
if (msg.term > this.term)
|
||||
{
|
||||
this.term = msg.term;
|
||||
this.leader = msg.leader;
|
||||
// Repeat VOTE to the leader to join it
|
||||
this.send(this.leader, { type: VOTE, term: this.term, leader: this.leader });
|
||||
}
|
||||
// add <from> as voter for <msg.leader>
|
||||
this.votes[msg.leader] = this.votes[msg.leader] || [];
|
||||
this.votes[msg.leader].push(from);
|
||||
let found = false;
|
||||
for (const voter of this.votes[msg.leader])
|
||||
{
|
||||
if (voter == from)
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
{
|
||||
this.voted++;
|
||||
this.votes[msg.leader].push(from);
|
||||
}
|
||||
const n = this.votes[msg.leader].length;
|
||||
if (n == 1 + (0 | this.nodes.length/2))
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue