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