Make node join existing quorum when seeing a VOTE message for larger term

Fixes testAdd and testRestart (with initialTerm = 1000)
de64
Vitaliy Filippov 2023-09-29 00:52:47 +03:00
parent b1da201d76
commit 7e11ac2477
1 changed files with 23 additions and 3 deletions

View File

@ -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))
{