mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
clientv3: fix race on watch initial revision
The initial revision was being updated in the substream goroutine defer; this was racing with the resume path fetching the initial revision when the substream closes during resume. Instead, update the initial revision whenever the substream processes a new watch response. Since the substream cannot receive a watch response while it is resuming, the write to the initial revision is ordered to always happen after the resume read. Fixes #6586
This commit is contained in:
parent
98897b7603
commit
06d5cf2d52
@ -573,7 +573,6 @@ func (w *watchGrpcStream) serveSubstream(ws *watcherStream, resumec chan struct{
|
||||
if !resuming {
|
||||
ws.closing = true
|
||||
}
|
||||
ws.initReq.rev = nextRev
|
||||
close(ws.donec)
|
||||
if !resuming {
|
||||
w.closingc <- ws
|
||||
@ -619,6 +618,7 @@ func (w *watchGrpcStream) serveSubstream(ws *watcherStream, resumec chan struct{
|
||||
if len(wr.Events) > 0 {
|
||||
nextRev = wr.Events[len(wr.Events)-1].Kv.ModRevision + 1
|
||||
}
|
||||
ws.initReq.rev = nextRev
|
||||
case <-ws.initReq.ctx.Done():
|
||||
return
|
||||
case <-resumec:
|
||||
|
Loading…
x
Reference in New Issue
Block a user