59 lines
2.4 KiB
Nim
59 lines
2.4 KiB
Nim
# 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
|
|
# those terms.
|
|
|
|
# **************************** #
|
|
# Raft Protocol definition #
|
|
# **************************** #
|
|
import types
|
|
|
|
type
|
|
RaftMessageRespoonseError* = enum # Raft message response errors
|
|
rmreSuccess = 0,
|
|
rmreFail = 1
|
|
|
|
RaftMessageRequestVote* = ref object of RaftMessageBase
|
|
lastLogTerm*: RaftNodeTerm
|
|
lastLogIndex*: RaftLogIndex
|
|
senderTerm*: RaftNodeTerm # Sender Raft Node Term
|
|
|
|
RaftMessageRequestVoteResponse* = ref object of RaftMessageResponseBase
|
|
granted*: bool # Is vote granted by the Raft node, from we requested vote?
|
|
|
|
RaftMessageAppendEntries*[SmCommandType] = ref object of RaftMessageBase
|
|
prevLogIndex*: RaftLogIndex
|
|
prevLogTerm*: RaftNodeTerm
|
|
commitIndex*: RaftLogIndex
|
|
logEntries*: Option[seq[RaftNodeLogEntry[SmCommandType]]] # Optional log entry(ies). Will be empty for a Heart-Beat
|
|
senderTerm*: RaftNodeTerm # Sender Raft Node Term
|
|
|
|
RaftMessageAppendEntriesResponse*[SmStateType] = ref object of RaftMessageResponseBase
|
|
success*: bool
|
|
lastLogIndex*: RaftLogIndex
|
|
state*: Option[SmStateType] # Optional Raft Abstract State Machine State
|
|
|
|
# Raft Node Client Request/Response definitions
|
|
RaftNodeClientRequestOps* = enum
|
|
rncroRequestSmState = 0,
|
|
rncroExecSmCommand = 1
|
|
|
|
RaftNodeClientResponseError* = enum
|
|
rncreSuccess = 0,
|
|
rncreFail = 1,
|
|
rncreNotLeader = 2
|
|
|
|
RaftNodeClientRequest*[SmCommandType] = ref object
|
|
op*: RaftNodeClientRequestOps
|
|
nodeId*: RaftNodeId
|
|
payload*: Option[SmCommandType] # Optional RaftMessagePayload carrying a Log Entry
|
|
|
|
RaftNodeClientResponse*[SmStateType] = ref object
|
|
nodeId*: RaftNodeId
|
|
error*: RaftNodeClientResponseError
|
|
state*: Option[SmStateType] # Optional Raft Abstract State Machine State
|
|
raftNodeRedirectId*: Option[RaftNodeId] # Optional Raft Node ID to redirect the request to in case of failure |