67 lines
2.6 KiB
Nim
67 lines
2.6 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
|
|
# Raft Node Messages OPs
|
|
RaftMessageOps* = enum
|
|
rmoRequestVote = 0,
|
|
rmoAppendLogEntry = 1,
|
|
rmoInstallSnapshot = 2 # For dynamic adding of new Raft Nodes
|
|
|
|
RaftMessageRespoonseError* = enum # Raft message response errors
|
|
rmreSuccess = 0,
|
|
rmreFail = 1
|
|
|
|
RaftMessageResponseBase* = ref object of RootObj
|
|
msgId*: RaftMessageId # Original Message ID
|
|
senderId*: RaftNodeId # Sender Raft Node ID
|
|
respondentId: RaftNodeId # Responding RaftNodeId
|
|
senderTerm*: RaftNodeTerm # Sender Raft Node Term
|
|
|
|
RaftMessageRequestVote* = ref object of RaftMessageBase
|
|
lastLogTerm*: RaftNodeTerm
|
|
lastLogIndex*: RaftLogIndex
|
|
|
|
RaftMessageRequestVoteResponse* = ref object of RaftMessageResponseBase
|
|
granted*: bool
|
|
|
|
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
|
|
|
|
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
|
|
payload*: Option[SmCommandType] # Optional RaftMessagePayload carrying a Log Entry
|
|
|
|
RaftNodeClientResponse*[SmStateType] = ref object
|
|
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 |