@@ -5,12 +5,14 @@ import (
55 "context"
66 "github.com/RealFax/RedQueen/internal/rqd/store"
77 "github.com/RealFax/RedQueen/pkg/dlocker"
8+ "github.com/hashicorp/raft"
89 "github.com/pkg/errors"
910 "net"
11+ "os"
12+ "path/filepath"
1013 "sync"
1114 "time"
1215
13- "github.com/hashicorp/raft"
1416 "google.golang.org/grpc"
1517
1618 "github.com/RealFax/RedQueen/api/serverpb"
2426)
2527
2628type Server struct {
27- clusterID string
29+ ctx context.Context
30+ cancel context.CancelCauseFunc
2831
2932 cfg * config.Config
3033
@@ -38,6 +41,8 @@ type Server struct {
3841
3942 stateNotify sync.Map // map[string]chan bool
4043
44+ clusterID string
45+
4146 serverpb.UnimplementedKVServer
4247 serverpb.UnimplementedLockerServer
4348 serverpb.UnimplementedRedQueenServer
@@ -77,6 +82,8 @@ func (s *Server) applyLog(ctx context.Context, p *serverpb.RaftLogPayload, timeo
7782func (s * Server ) _stateUpdater () {
7883 for {
7984 select {
85+ case <- s .ctx .Done ():
86+ return
8087 case state := <- s .raft .LeaderCh ():
8188 s .stateNotify .Range (func (_ , val any ) bool {
8289 val .(chan bool ) <- state
@@ -95,6 +102,8 @@ func (s *Server) ListenAndServe() error {
95102}
96103
97104func (s * Server ) Close () (err error ) {
105+ s .cancel (errors .New ("server close" ))
106+
98107 if err = s .raft .Shutdown ().Error (); err != nil {
99108 return
100109 }
@@ -108,12 +117,13 @@ func (s *Server) Close() (err error) {
108117
109118func NewServer (cfg * config.Config ) (* Server , error ) {
110119 var (
111- server = Server {
120+ err error
121+ server = & Server {
112122 clusterID : cfg .Node .ID ,
113123 cfg : cfg ,
114124 }
115- err error
116125 )
126+ server .ctx , server .cancel = context .WithCancelCause (context .Background ())
117127
118128 if cfg .Misc .PPROF {
119129 server .pprofServer , err = newPprofServer ()
@@ -130,33 +140,44 @@ func NewServer(cfg *config.Config) (*Server, error) {
130140
131141 // init server grpc
132142 server .grpcServer = grpc .NewServer ()
133- serverpb .RegisterKVServer (server .grpcServer , & server )
134- serverpb .RegisterLockerServer (server .grpcServer , & server )
135- serverpb .RegisterRedQueenServer (server .grpcServer , & server )
143+ serverpb .RegisterKVServer (server .grpcServer , server )
144+ serverpb .RegisterLockerServer (server .grpcServer , server )
145+ serverpb .RegisterRedQueenServer (server .grpcServer , server )
136146
137147 // init server raft
138- if server .raft , err = NewRaft (RaftConfig {
139- Bootstrap : cfg .Env ().FirstRun (),
140- MaxSnapshots : int (cfg .Node .MaxSnapshots ),
141- ServerID : cfg .Node .ID ,
142- Addr : cfg .Node .ListenPeerAddr ,
143- DataDir : cfg .Node .DataDir ,
144- Store : server .store ,
145- Clusters : func () []raft.Server {
148+ if server .raft , err = NewRaftWithOptions (
149+ RaftWithStdFSM (server .store ),
150+ RaftWithBoltLogStore (filepath .Join (cfg .Node .DataDir , RaftLog )),
151+ RaftWithStdStableStore (server .store ),
152+ RaftWithFileSnapshotStore (cfg .Node .DataDir , int (cfg .Node .MaxSnapshots ), os .Stderr ),
153+ RaftWithTCPTransport (cfg .Node .ListenPeerAddr , 32 , 3 * time .Second , os .Stderr ),
154+ RaftWithConfig (func () * raft.Config {
155+ c := raft .DefaultConfig ()
156+ c .LocalID = raft .ServerID (cfg .Node .ID )
157+ c .LogLevel = "INFO"
158+ return c
159+ }()),
160+ func () RaftServerOption {
161+ if cfg .Env ().FirstRun () {
162+ return RaftWithBootstrap ()
163+ }
164+ return RaftWithEmpty ()
165+ }(),
166+ RaftWithClusters (func () []raft.Server {
146167 if ! cfg .Env ().FirstRun () {
147168 return nil
148169 }
149- clusters := make ([]raft.Server , 0 , len (cfg .Cluster .Bootstrap ))
170+ cluster := make ([]raft.Server , 0 , len (cfg .Cluster .Bootstrap ))
150171 for _ , node := range cfg .Cluster .Bootstrap {
151- clusters = append (clusters , raft.Server {
172+ cluster = append (cluster , raft.Server {
152173 Suffrage : raft .Voter ,
153174 ID : raft .ServerID (node .Name ),
154175 Address : raft .ServerAddress (node .PeerAddr ),
155176 })
156177 }
157- return clusters
158- }(),
159- } ); err != nil {
178+ return cluster
179+ }()) ,
180+ ); err != nil {
160181 return nil , errors .Wrap (err , "NewServer" )
161182 }
162183
@@ -170,8 +191,8 @@ func NewServer(cfg *config.Config) (*Server, error) {
170191 server .logApplyer = NewRaftMultipleLogApply (
171192 context .Background (),
172193 64 ,
173- time .Millisecond * 300 ,
174- time .Second * 3 ,
194+ 300 * time .Millisecond ,
195+ 3 * time .Second ,
175196 server .raft .Apply ,
176197 )
177198 } else {
@@ -181,5 +202,5 @@ func NewServer(cfg *config.Config) (*Server, error) {
181202 // start daemon service
182203 go server ._stateUpdater ()
183204
184- return & server , nil
205+ return server , nil
185206}
0 commit comments