-
Notifications
You must be signed in to change notification settings - Fork 6
/
server.go
70 lines (57 loc) · 1.51 KB
/
server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package graft
const (
Candidate = "candidate"
Follower = "follower"
Leader = "leader"
)
type NullTimer struct{}
func (timer NullTimer) Reset() {}
func (timer NullTimer) StartTimer() {}
type Timable interface {
Reset()
StartTimer()
}
type Commiter interface {
Commit(string)
}
type Server struct {
FollowerServer
}
func New(id string) *Server {
serverBase := ServerBase{
Id: id,
Log: []LogEntry{},
Term: 0,
VotedFor: "",
VotesGranted: 0,
State: Follower,
Peers: []Peer{},
ElectionTimer: NullTimer{},
}
return &Server{FollowerServer{LeaderServer{Voter{CandidateServer{Persister{serverBase}}}}}}
}
func NewFromConfiguration(config ServerConfiguration) *Server {
server := New(config.Id)
server.PersistenceLocation = config.PersistenceLocation
for _, peerLocation := range config.Peers {
server.AddPeers(HttpPeer{URL: peerLocation})
}
return server
}
func (server *Server) Start() {
server.LoadPersistedState()
server.LoadPersistedLog()
server.ElectionTimer.StartTimer()
}
func (server *Server) stepDown() {
server.State = Follower
}
func (server *Server) invalidLog(message AppendEntriesMessage) bool {
if message.PrevLogIndex == 0 {
return false
}
return len(server.Log) < message.PrevLogIndex || server.Log[message.PrevLogIndex-1].Term != message.PrevLogTerm
}
func (server *Server) logUpToDate(message RequestVoteMessage) bool {
return server.LastLogIndex() <= message.LastLogIndex && server.lastLogTerm() <= message.LastLogTerm
}