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:
Yicheng Qin
2014-04-30 16:04:58 -07:00
parent 997e7d3bf4
commit ba36a16bc5
3 changed files with 38 additions and 7 deletions

View File

@@ -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 {