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
release-3.1
Anthony Romano 2016-10-05 09:36:06 -07:00
parent 98897b7603
commit 06d5cf2d52
1 changed files with 1 additions and 1 deletions

View File

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