From 7e11ac247736b9ba210399ae2ef96058f41d42e4 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Fri, 29 Sep 2023 00:52:47 +0300 Subject: [PATCH] Make node join existing quorum when seeing a VOTE message for larger term Fixes testAdd and testRestart (with initialTerm = 1000) --- tinyraft.js | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/tinyraft.js b/tinyraft.js index a59aaae..e2219f6 100644 --- a/tinyraft.js +++ b/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 as voter for 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)) {