mirror of
https://github.com/EchoVault/SugarDB.git
synced 2025-10-15 04:20:57 +08:00
Capture cancel signal to gracefully shut down server
This commit is contained in:
@@ -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()
|
||||||
}
|
}
|
||||||
|
@@ -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.")
|
||||||
}
|
}
|
||||||
|
@@ -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.")
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user