Merge pull request #14262 from mind1949/update-server-etcdserver-raft

server/etcdserver: check whether raftNode has stopped
This commit is contained in:
Benjamin Wang 2022-08-02 05:58:30 +08:00 committed by GitHub
commit 4f0e92d94c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 34 additions and 1 deletions

View File

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

View File

@ -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 !")
}
}
}