mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
feat(peer_server): stop service when removed
It doesn't modify the exit logic, but makes external code know when removal happens and be able to determine what it should do.
This commit is contained in:
@@ -62,6 +62,8 @@ type PeerServer struct {
|
||||
store store.Store
|
||||
snapConf *snapshotConf
|
||||
|
||||
stopNotify chan bool
|
||||
removeNotify chan bool
|
||||
closeChan chan bool
|
||||
routineGroup sync.WaitGroup
|
||||
timeoutThresholdChan chan interface{}
|
||||
@@ -261,6 +263,8 @@ func (s *PeerServer) Start(snapshot bool, discoverURL string, peers []string) er
|
||||
|
||||
s.findCluster(discoverURL, peers)
|
||||
|
||||
s.stopNotify = make(chan bool)
|
||||
s.removeNotify = make(chan bool)
|
||||
s.closeChan = make(chan bool)
|
||||
|
||||
s.startRoutine(s.monitorSync)
|
||||
@@ -279,13 +283,33 @@ func (s *PeerServer) Start(snapshot bool, discoverURL string, peers []string) er
|
||||
func (s *PeerServer) Stop() {
|
||||
s.Lock()
|
||||
defer s.Unlock()
|
||||
|
||||
if s.closeChan != nil {
|
||||
close(s.closeChan)
|
||||
}
|
||||
close(s.closeChan)
|
||||
// TODO(yichengq): it should also call async stop for raft server,
|
||||
// but this functionality has not been implemented.
|
||||
s.raftServer.Stop()
|
||||
s.routineGroup.Wait()
|
||||
s.closeChan = nil
|
||||
close(s.stopNotify)
|
||||
}
|
||||
|
||||
func (s *PeerServer) asyncRemove() {
|
||||
s.Lock()
|
||||
close(s.closeChan)
|
||||
// TODO(yichengq): it should also call async stop for raft server,
|
||||
// but this functionality has not been implemented.
|
||||
go func() {
|
||||
defer s.Unlock()
|
||||
s.raftServer.Stop()
|
||||
s.routineGroup.Wait()
|
||||
close(s.removeNotify)
|
||||
}()
|
||||
}
|
||||
|
||||
func (s *PeerServer) StopNotify() <-chan bool {
|
||||
return s.stopNotify
|
||||
}
|
||||
|
||||
func (s *PeerServer) RemoveNotify() <-chan bool {
|
||||
return s.removeNotify
|
||||
}
|
||||
|
||||
func (s *PeerServer) HTTPHandler() http.Handler {
|
||||
|
||||
@@ -2,7 +2,6 @@ package server
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"os"
|
||||
|
||||
"github.com/coreos/etcd/log"
|
||||
"github.com/coreos/etcd/third_party/github.com/goraft/raft"
|
||||
@@ -65,7 +64,7 @@ func applyRemove(c *RemoveCommand, context raft.Context) (uint64, error) {
|
||||
// command and need to be removed
|
||||
if context.CommitIndex() > ps.joinIndex && ps.joinIndex != 0 {
|
||||
log.Debugf("server [%s] is removed", context.Server().Name())
|
||||
os.Exit(0)
|
||||
ps.asyncRemove()
|
||||
} else {
|
||||
// else ignore remove
|
||||
log.Debugf("ignore previous remove command.")
|
||||
|
||||
Reference in New Issue
Block a user