mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
etcdserver: stop raft node goroutine before stop server
Stop raftNode goroutine before stopping server goroutine, so server.Stop does stop all underlying stuffs elegantly now. This fixes the problem that previous-round lock on WAL may not be released when etcd is restarted.
This commit is contained in:
parent
2c7a8c2216
commit
9e5743c816
@ -101,9 +101,15 @@ type raftNode struct {
|
|||||||
index uint64
|
index uint64
|
||||||
term uint64
|
term uint64
|
||||||
lead uint64
|
lead uint64
|
||||||
|
|
||||||
|
stopped chan struct{}
|
||||||
|
done chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *raftNode) run() {
|
func (r *raftNode) run() {
|
||||||
|
r.stopped = make(chan struct{})
|
||||||
|
r.done = make(chan struct{})
|
||||||
|
|
||||||
var syncC <-chan time.Time
|
var syncC <-chan time.Time
|
||||||
|
|
||||||
defer r.stop()
|
defer r.stop()
|
||||||
@ -134,7 +140,7 @@ func (r *raftNode) run() {
|
|||||||
|
|
||||||
select {
|
select {
|
||||||
case r.applyc <- apply:
|
case r.applyc <- apply:
|
||||||
case <-r.s.done:
|
case <-r.stopped:
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -156,7 +162,7 @@ func (r *raftNode) run() {
|
|||||||
r.Advance()
|
r.Advance()
|
||||||
case <-syncC:
|
case <-syncC:
|
||||||
r.s.sync(defaultSyncTimeout)
|
r.s.sync(defaultSyncTimeout)
|
||||||
case <-r.s.done:
|
case <-r.stopped:
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -172,6 +178,7 @@ func (r *raftNode) stop() {
|
|||||||
if err := r.storage.Close(); err != nil {
|
if err := r.storage.Close(); err != nil {
|
||||||
log.Panicf("etcdraft: close storage error: %v", err)
|
log.Panicf("etcdraft: close storage error: %v", err)
|
||||||
}
|
}
|
||||||
|
close(r.done)
|
||||||
}
|
}
|
||||||
|
|
||||||
// for testing
|
// for testing
|
||||||
|
@ -341,7 +341,11 @@ func (s *EtcdServer) run() {
|
|||||||
s.r.s = s
|
s.r.s = s
|
||||||
s.r.applyc = make(chan apply)
|
s.r.applyc = make(chan apply)
|
||||||
go s.r.run()
|
go s.r.run()
|
||||||
defer close(s.done)
|
defer func() {
|
||||||
|
s.r.stopped <- struct{}{}
|
||||||
|
<-s.r.done
|
||||||
|
close(s.done)
|
||||||
|
}()
|
||||||
|
|
||||||
var shouldstop bool
|
var shouldstop bool
|
||||||
for {
|
for {
|
||||||
@ -404,7 +408,6 @@ func (s *EtcdServer) run() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// TODO: wait for the stop of raft node routine?
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop stops the server gracefully, and shuts down the running goroutine.
|
// Stop stops the server gracefully, and shuts down the running goroutine.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user