From 7509976cdd282f0ebc9a49f8f4db0e2186529dc4 Mon Sep 17 00:00:00 2001 From: Raycho Mukelov Date: Fri, 20 Oct 2023 09:31:58 +0300 Subject: [PATCH] fix --- raft/consensus_module.nim | 9 ++++++++- tests/basic_cluster.nim | 2 +- tests/test_basic_cluster_election.nim | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/raft/consensus_module.nim b/raft/consensus_module.nim index 4106f54..38accc7 100644 --- a/raft/consensus_module.nim +++ b/raft/consensus_module.nim @@ -82,6 +82,7 @@ proc raftNodeStartElection*[SmCommandType, SmStateType](node: RaftNode[SmCommand return if node.state == rnsLeader and not node.hrtBtSuccess: + raftNodeCancelTimers(node) debug "Raft Node transition to follower - unsuccsessful heart beat rounds", node_id=node.id node.state = rnsFollower node.currentLeaderId = DefaultUUID @@ -89,6 +90,8 @@ proc raftNodeStartElection*[SmCommandType, SmStateType](node: RaftNode[SmCommand raftNodeScheduleElectionTimeout(node) return + raftNodeScheduleElectionTimeout(node) + while node.votesFuts.len > 0: discard node.votesFuts.pop @@ -127,10 +130,14 @@ proc raftNodeStartElection*[SmCommandType, SmStateType](node: RaftNode[SmCommand if node.state == rnsCandidate: if raftNodeQuorumMin(node): await cancelAndWait(node.electionTimeoutTimer) + raftNodeScheduleElectionTimeout(node) debug "Raft Node transition to leader", node_id=node.id node.state = rnsLeader # Transition to leader state and send Heart-Beat to establish this node as the cluster leader - raftNodeScheduleElectionTimeout(node) asyncSpawn raftNodeSendHeartBeat(node) + else: + node.state = rnsFollower + node.currentLeaderId = DefaultUUID + node.votedFor = DefaultUUID proc raftNodeHandleAppendEntries*[SmCommandType, SmStateType](node: RaftNode[SmCommandType, SmStateType], msg: RaftMessage[SmCommandType, SmStateType]): RaftMessageResponse[SmCommandType, SmStateType] = diff --git a/tests/basic_cluster.nim b/tests/basic_cluster.nim index 4609420..be456f6 100644 --- a/tests/basic_cluster.nim +++ b/tests/basic_cluster.nim @@ -48,7 +48,7 @@ proc basicRaftClusterClientRequest*(cluster: BasicRaftCluster, req: RaftNodeClie of rncroExecSmCommand: discard -proc basicRaftClusterInit*(nodesIds: seq[RaftNodeId], networkDelay: int=25, electionTimeout: int=150, heartBeatTimeout: int=150, appendEntriesRespTimeout: int=20, votingRespTimeout: int=20, +proc basicRaftClusterInit*(nodesIds: seq[RaftNodeId], networkDelay: int=10, electionTimeout: int=150, heartBeatTimeout: int=150, appendEntriesRespTimeout: int=20, votingRespTimeout: int=20, heartBeatRespTimeout: int=10): BasicRaftCluster = new(result) for nodeId in nodesIds: diff --git a/tests/test_basic_cluster_election.nim b/tests/test_basic_cluster_election.nim index 7d37f37..7aef729 100644 --- a/tests/test_basic_cluster_election.nim +++ b/tests/test_basic_cluster_election.nim @@ -20,7 +20,7 @@ proc basicClusterElectionMain*() = test "Basic Raft Cluster Init (5 nodes)": for i in 0..4: nodesIds[i] = genUUID() - cluster = basicRaftClusterInit(nodesIds, 25, 150, 150, 20, 20, 10) + cluster = basicRaftClusterInit(nodesIds, 15, 150, 150, 20, 20, 10) check cluster != nil test "Start Basic Raft Cluster and wait it to converge for a 2 seconds interval (Elect a Leader)":