diff --git a/server/main.go b/server/main.go index d13ae82..8045f22 100644 --- a/server/main.go +++ b/server/main.go @@ -7,8 +7,11 @@ import ( "io" "net" "net/http" + "os" + "os/signal" "strings" "sync" + "syscall" "github.com/hashicorp/memberlist" "github.com/hashicorp/raft" @@ -25,6 +28,7 @@ type Server struct { commands []Command raft *raft.Raft memberList *memberlist.Memberlist + cancelCh *chan (os.Signal) } func (server *Server) Lock() { @@ -161,6 +165,7 @@ func (server *Server) Start() { } server.MemberListInit() + server.RaftInit() if conf.HTTP { server.StartHTTP() @@ -169,16 +174,31 @@ func (server *Server) Start() { } } +func (server *Server) ShutDown() { + fmt.Println("Shutting down...") + server.RaftShutdown() + server.MemberListShutdown() +} + func main() { config := GetConfig() + cancelCh := make(chan (os.Signal), 1) + signal.Notify(cancelCh, syscall.SIGINT, syscall.SIGTERM) + server := &Server{ - config: config, + cancelCh: &cancelCh, + config: config, commands: []Command{ NewPingCommand(), NewSetGetCommand(), NewListCommand(), }, } - server.Start() + + go server.Start() + + <-cancelCh + + server.ShutDown() } diff --git a/server/memberlist.go b/server/memberlist.go index 82e7438..a1f3d7c 100644 --- a/server/memberlist.go +++ b/server/memberlist.go @@ -3,7 +3,6 @@ package main import ( "fmt" "log" - "time" "github.com/hashicorp/memberlist" ) @@ -30,17 +29,11 @@ func (server *Server) MemberListInit() { fmt.Printf("Joined cluster. Contacted %d nodes.\n", n) } - - go func() { - for { - fmt.Println(server.memberList.NumMembers()) - time.Sleep(2 * time.Second) - } - }() } -func (server *Server) ShutdownMemberList() { +func (server *Server) MemberListShutdown() { // Triggered after RaftShutdown // Gracefully leave memberlist cluster // Broadcast message to remove current node from raft cluster + fmt.Println("Shutting down memberlist.") } diff --git a/server/raft.go b/server/raft.go index a638862..3e2a2e0 100644 --- a/server/raft.go +++ b/server/raft.go @@ -73,12 +73,6 @@ func (server *Server) RaftInit() { } } -func (server *Server) RaftShutdown() { - // Triggered before MemberListShutdown - // Leadership transfer if current node is the leader - // Shutdown of the raft server -} - // Implement raft.FSM interface func (server *Server) Apply(log *raft.Log) interface{} { return nil @@ -113,3 +107,10 @@ func (server *Server) SetUint64(key []byte, val uint64) error { func (server *Server) GetUint64(key []byte) (uint64, error) { return 0, nil } + +func (server *Server) RaftShutdown() { + // Triggered before MemberListShutdown + // Leadership transfer if current node is the leader + // Shutdown of the raft server + fmt.Println("Shutting down raft.") +}