mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
Merge pull request #14262 from mind1949/update-server-etcdserver-raft
server/etcdserver: check whether raftNode has stopped
This commit is contained in:
commit
4f0e92d94c
@ -377,7 +377,14 @@ func (r *raftNode) apply() chan toApply {
|
||||
}
|
||||
|
||||
func (r *raftNode) stop() {
|
||||
r.stopped <- struct{}{}
|
||||
select {
|
||||
case r.stopped <- struct{}{}:
|
||||
// Not already stopped, so trigger it
|
||||
case <-r.done:
|
||||
// Has already been stopped - no need to do anything
|
||||
return
|
||||
}
|
||||
// Block until the stop has been acknowledged by start()
|
||||
<-r.done
|
||||
}
|
||||
|
||||
|
@ -285,3 +285,29 @@ func TestExpvarWithNoRaftStatus(t *testing.T) {
|
||||
_ = kv.Value.String()
|
||||
})
|
||||
}
|
||||
|
||||
func TestStopRaftNodeMoreThanOnce(t *testing.T) {
|
||||
n := newNopReadyNode()
|
||||
r := newRaftNode(raftNodeConfig{
|
||||
lg: zaptest.NewLogger(t),
|
||||
Node: n,
|
||||
storage: mockstorage.NewStorageRecorder(""),
|
||||
raftStorage: raft.NewMemoryStorage(),
|
||||
transport: newNopTransporter(),
|
||||
})
|
||||
r.start(&raftReadyHandler{})
|
||||
|
||||
for i := 0; i < 2; i++ {
|
||||
stopped := make(chan struct{})
|
||||
go func() {
|
||||
r.stop()
|
||||
close(stopped)
|
||||
}()
|
||||
|
||||
select {
|
||||
case <-stopped:
|
||||
case <-time.After(time.Second):
|
||||
t.Errorf("*raftNode.stop() is blocked !")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user