2023-08-09 13:06:34 +03:00
|
|
|
# nim-raft
|
|
|
|
# Copyright (c) 2023 Status Research & Development GmbH
|
|
|
|
# Licensed under either of
|
|
|
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
|
|
|
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT))
|
|
|
|
# at your option.
|
|
|
|
# This file may not be copied, modified, or distributed except according to
|
2023-08-14 23:49:21 +03:00
|
|
|
# those terms.
|
|
|
|
|
2023-09-03 06:27:27 +03:00
|
|
|
import types, protocol, log_ops
|
2023-08-14 23:49:21 +03:00
|
|
|
|
2023-09-03 20:52:35 +03:00
|
|
|
proc RaftNodeStartElection*[SmCommandType, SmStateType](node: RaftNode[SmCommandType, SmStateType]) {.async.} =
|
2023-09-03 06:27:27 +03:00
|
|
|
node.state = rnsCandidate
|
|
|
|
node.votedFor = node.id
|
|
|
|
|
|
|
|
for peer in node.peers:
|
2023-09-03 20:52:35 +03:00
|
|
|
peer.hasVoted = false
|
|
|
|
node.votesFuts.add(node.msgSendCallback(
|
|
|
|
RaftMessageRequestVote(lastLogTerm: RaftNodeLogEntryGet(node, RaftNodeLogIndexGet(node)).value.term, lastLogIndex: RaftNodeLogIndexGet(node), senderTerm: node.currentTerm)
|
2023-09-03 06:27:27 +03:00
|
|
|
)
|
|
|
|
)
|
|
|
|
|
2023-09-03 20:52:35 +03:00
|
|
|
# Process votes (if any)
|
|
|
|
for voteFut in node.votesFuts:
|
|
|
|
discard await voteFut
|
2023-09-03 06:27:27 +03:00
|
|
|
if voteFut.finished and not voteFut.failed:
|
|
|
|
for p in node.peers:
|
2023-09-03 20:52:35 +03:00
|
|
|
debugEcho repr(voteFut)
|
|
|
|
# if p.id == voteFut.senderId:
|
|
|
|
# p.hasVoted = voteFut.granted
|
|
|
|
|
|
|
|
# node.votesFuts.clear
|
2023-08-14 23:49:21 +03:00
|
|
|
|
2023-09-03 06:27:27 +03:00
|
|
|
proc RaftNodeAbortElection*[SmCommandType, SmStateType](node: RaftNode[SmCommandType, SmStateType]) =
|
2023-09-03 20:52:35 +03:00
|
|
|
for fut in node.voteFuts:
|
|
|
|
cancel(fut)
|
2023-08-14 23:49:21 +03:00
|
|
|
discard
|
|
|
|
|
2023-09-03 06:27:27 +03:00
|
|
|
proc RaftNodeProcessRequestVote*[SmCommandType, SmStateType](node: RaftNode[SmCommandType, SmStateType], msg: RaftMessageRequestVote): Future[RaftMessageRequestVoteResponse] =
|
|
|
|
if msg.senderTerm > node.term:
|
|
|
|
if msg.lastLogIndex >= RaftNodeLogIndexGet(node) and msg.lastLogTerm >= RaftNodeLogEntryGet(RaftNodeLogIndexGet(node)).term:
|
|
|
|
# grant vote
|
|
|
|
discard
|
|
|
|
|
|
|
|
proc RaftNodeProcessAppendEntries*[SmCommandType, SmStateType](node: RaftNode[SmCommandType, SmStateType], msg: RaftMessageAppendEntries): Future[RaftMessageAppendEntriesResponse] =
|
2023-09-01 05:55:55 +03:00
|
|
|
discard
|
|
|
|
|
2023-09-01 06:28:43 +03:00
|
|
|
proc RaftNodeQuorumMin[SmCommandType, SmStateType](node: RaftNode[SmCommandType, SmStateType]): bool =
|
|
|
|
discard
|
|
|
|
|
|
|
|
proc RaftNodeReplicateSmCommand*[SmCommandType, SmStateType](node: RaftNode[SmCommandType, SmStateType], cmd: SmCommandType) =
|
|
|
|
discard
|
|
|
|
|
2023-09-03 01:59:35 +03:00
|
|
|
proc RaftNodeScheduleRequestVotesCleanUpTimeout*[SmCommandType, SmStateType](node: RaftNode[SmCommandType, SmStateType]) =
|
2023-09-03 03:53:48 +03:00
|
|
|
discard
|
|
|
|
|
|
|
|
proc RaftNodeLogAppend[SmCommandType, SmStateType](node: RaftNode[SmCommandType, SmStateType], logEntry: RaftNodeLogEntry[SmCommandType]) =
|
|
|
|
discard
|
|
|
|
|
|
|
|
proc RaftNodeLogTruncate[SmCommandType, SmStateType](node: RaftNode[SmCommandType, SmStateType], truncateIndex: uint64) =
|
2023-08-14 23:49:21 +03:00
|
|
|
discard
|