Capture cancel signal to gracefully shut down server

This commit is contained in:
Kelvin Clement Mwinuka
2023-07-24 06:11:33 +08:00
parent 69a86e4588
commit 044edff4e8
3 changed files with 31 additions and 17 deletions

View File

@@ -7,8 +7,11 @@ import (
"io" "io"
"net" "net"
"net/http" "net/http"
"os"
"os/signal"
"strings" "strings"
"sync" "sync"
"syscall"
"github.com/hashicorp/memberlist" "github.com/hashicorp/memberlist"
"github.com/hashicorp/raft" "github.com/hashicorp/raft"
@@ -25,6 +28,7 @@ type Server struct {
commands []Command commands []Command
raft *raft.Raft raft *raft.Raft
memberList *memberlist.Memberlist memberList *memberlist.Memberlist
cancelCh *chan (os.Signal)
} }
func (server *Server) Lock() { func (server *Server) Lock() {
@@ -161,6 +165,7 @@ func (server *Server) Start() {
} }
server.MemberListInit() server.MemberListInit()
server.RaftInit()
if conf.HTTP { if conf.HTTP {
server.StartHTTP() server.StartHTTP()
@@ -169,16 +174,31 @@ func (server *Server) Start() {
} }
} }
func (server *Server) ShutDown() {
fmt.Println("Shutting down...")
server.RaftShutdown()
server.MemberListShutdown()
}
func main() { func main() {
config := GetConfig() config := GetConfig()
cancelCh := make(chan (os.Signal), 1)
signal.Notify(cancelCh, syscall.SIGINT, syscall.SIGTERM)
server := &Server{ server := &Server{
config: config, cancelCh: &cancelCh,
config: config,
commands: []Command{ commands: []Command{
NewPingCommand(), NewPingCommand(),
NewSetGetCommand(), NewSetGetCommand(),
NewListCommand(), NewListCommand(),
}, },
} }
server.Start()
go server.Start()
<-cancelCh
server.ShutDown()
} }

View File

@@ -3,7 +3,6 @@ package main
import ( import (
"fmt" "fmt"
"log" "log"
"time"
"github.com/hashicorp/memberlist" "github.com/hashicorp/memberlist"
) )
@@ -30,17 +29,11 @@ func (server *Server) MemberListInit() {
fmt.Printf("Joined cluster. Contacted %d nodes.\n", n) 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 // Triggered after RaftShutdown
// Gracefully leave memberlist cluster // Gracefully leave memberlist cluster
// Broadcast message to remove current node from raft cluster // Broadcast message to remove current node from raft cluster
fmt.Println("Shutting down memberlist.")
} }

View File

@@ -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 // Implement raft.FSM interface
func (server *Server) Apply(log *raft.Log) interface{} { func (server *Server) Apply(log *raft.Log) interface{} {
return nil return nil
@@ -113,3 +107,10 @@ func (server *Server) SetUint64(key []byte, val uint64) error {
func (server *Server) GetUint64(key []byte) (uint64, error) { func (server *Server) GetUint64(key []byte) (uint64, error) {
return 0, nil 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.")
}