mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
rafthttp: return err if stopped before setting cancel in dial()
The original workflow may fail to cancel if stop() cancels the finished request just before dial() assigning a new cancel. This commit checks streamReader status before setting cancel to avoid this problem. It is tested at travis for 300 times. go 1.5 always works well, while go 1.4 fails to stop once.
This commit is contained in:
parent
fc95ec0cc6
commit
6fc638673c
@ -427,6 +427,12 @@ func (cr *streamReader) dial(t streamType) (io.ReadCloser, error) {
|
||||
}
|
||||
|
||||
cr.mu.Lock()
|
||||
select {
|
||||
case <-cr.stopc:
|
||||
cr.mu.Unlock()
|
||||
return nil, fmt.Errorf("stream reader is stopped")
|
||||
default:
|
||||
}
|
||||
cr.cancel = httputil.RequestCanceler(cr.tr, req)
|
||||
cr.mu.Unlock()
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user