148 lines
3.9 KiB
Go

package transport
import (
pb "github.com/Jille/raft-grpc-transport/proto"
"github.com/hashicorp/raft"
"google.golang.org/protobuf/types/known/timestamppb"
)
func encodeAppendEntriesRequest(s *raft.AppendEntriesRequest) *pb.AppendEntriesRequest {
return &pb.AppendEntriesRequest{
RpcHeader: encodeRPCHeader(s.RPCHeader),
Term: s.Term,
Leader: s.Leader,
PrevLogEntry: s.PrevLogEntry,
PrevLogTerm: s.PrevLogTerm,
Entries: encodeLogs(s.Entries),
LeaderCommitIndex: s.LeaderCommitIndex,
}
}
func encodeRPCHeader(s raft.RPCHeader) *pb.RPCHeader {
return &pb.RPCHeader{
ProtocolVersion: int64(s.ProtocolVersion),
Id: s.ID,
Addr: s.Addr,
}
}
func encodeLogs(s []*raft.Log) []*pb.Log {
ret := make([]*pb.Log, len(s))
for i, l := range s {
ret[i] = encodeLog(l)
}
return ret
}
func encodeLog(s *raft.Log) *pb.Log {
return &pb.Log{
Index: s.Index,
Term: s.Term,
Type: encodeLogType(s.Type),
Data: s.Data,
Extensions: s.Extensions,
AppendedAt: timestamppb.New(s.AppendedAt),
}
}
func encodeLogType(s raft.LogType) pb.Log_LogType {
switch s {
case raft.LogCommand:
return pb.Log_LOG_COMMAND
case raft.LogNoop:
return pb.Log_LOG_NOOP
case raft.LogAddPeerDeprecated:
return pb.Log_LOG_ADD_PEER_DEPRECATED
case raft.LogRemovePeerDeprecated:
return pb.Log_LOG_REMOVE_PEER_DEPRECATED
case raft.LogBarrier:
return pb.Log_LOG_BARRIER
case raft.LogConfiguration:
return pb.Log_LOG_CONFIGURATION
default:
panic("invalid LogType")
}
}
func encodeAppendEntriesResponse(s *raft.AppendEntriesResponse) *pb.AppendEntriesResponse {
return &pb.AppendEntriesResponse{
RpcHeader: encodeRPCHeader(s.RPCHeader),
Term: s.Term,
LastLog: s.LastLog,
Success: s.Success,
NoRetryBackoff: s.NoRetryBackoff,
}
}
func encodeRequestVoteRequest(s *raft.RequestVoteRequest) *pb.RequestVoteRequest {
return &pb.RequestVoteRequest{
RpcHeader: encodeRPCHeader(s.RPCHeader),
Term: s.Term,
Candidate: s.Candidate,
LastLogIndex: s.LastLogIndex,
LastLogTerm: s.LastLogTerm,
LeadershipTransfer: s.LeadershipTransfer,
}
}
func encodeRequestVoteResponse(s *raft.RequestVoteResponse) *pb.RequestVoteResponse {
return &pb.RequestVoteResponse{
RpcHeader: encodeRPCHeader(s.RPCHeader),
Term: s.Term,
Peers: s.Peers,
Granted: s.Granted,
}
}
func encodeInstallSnapshotRequest(s *raft.InstallSnapshotRequest) *pb.InstallSnapshotRequest {
return &pb.InstallSnapshotRequest{
RpcHeader: encodeRPCHeader(s.RPCHeader),
SnapshotVersion: int64(s.SnapshotVersion),
Term: s.Term,
Leader: s.Leader,
LastLogIndex: s.LastLogIndex,
LastLogTerm: s.LastLogTerm,
Peers: s.Peers,
Configuration: s.Configuration,
ConfigurationIndex: s.ConfigurationIndex,
Size: s.Size,
}
}
func encodeInstallSnapshotResponse(s *raft.InstallSnapshotResponse) *pb.InstallSnapshotResponse {
return &pb.InstallSnapshotResponse{
RpcHeader: encodeRPCHeader(s.RPCHeader),
Term: s.Term,
Success: s.Success,
}
}
func encodeTimeoutNowRequest(s *raft.TimeoutNowRequest) *pb.TimeoutNowRequest {
return &pb.TimeoutNowRequest{
RpcHeader: encodeRPCHeader(s.RPCHeader),
}
}
func encodeTimeoutNowResponse(s *raft.TimeoutNowResponse) *pb.TimeoutNowResponse {
return &pb.TimeoutNowResponse{
RpcHeader: encodeRPCHeader(s.RPCHeader),
}
}
func encodeRequestPreVoteRequest(s *raft.RequestPreVoteRequest) *pb.RequestPreVoteRequest {
return &pb.RequestPreVoteRequest{
RpcHeader: encodeRPCHeader(s.RPCHeader),
Term: s.Term,
LastLogIndex: s.LastLogIndex,
LastLogTerm: s.LastLogTerm,
}
}
func encodeRequestPreVoteResponse(s *raft.RequestPreVoteResponse) *pb.RequestPreVoteResponse {
return &pb.RequestPreVoteResponse{
RpcHeader: encodeRPCHeader(s.RPCHeader),
Term: s.Term,
Granted: s.Granted,
}
}