From 836c8159f625accd9a3068e8124b2240fc501baf Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Thu, 7 Jul 2016 15:01:05 -0700 Subject: [PATCH] v3rpc: lock progress and prevKV map correctly --- etcdserver/api/v3rpc/watch.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/etcdserver/api/v3rpc/watch.go b/etcdserver/api/v3rpc/watch.go index a109314b9..53f29d76b 100644 --- a/etcdserver/api/v3rpc/watch.go +++ b/etcdserver/api/v3rpc/watch.go @@ -178,6 +178,7 @@ func (sws *serverWatchStream) recvLoop() error { } id := sws.watchStream.Watch(creq.Key, creq.RangeEnd, rev) if id != -1 { + sws.mu.Lock() if creq.ProgressNotify { sws.mu.Lock() sws.progress[id] = true @@ -188,6 +189,7 @@ func (sws *serverWatchStream) recvLoop() error { sws.prevKV[id] = true sws.mu.Unlock() } + sws.mu.Unlock() } wr := &pb.WatchResponse{ Header: sws.newResponseHeader(wsrev), @@ -259,7 +261,9 @@ func (sws *serverWatchStream) sendLoop() { // or define protocol buffer with []mvccpb.Event. evs := wresp.Events events := make([]*mvccpb.Event, len(evs)) + sws.mu.Lock() needPrevKV := sws.prevKV[wresp.WatchID] + sws.mu.Unlock() for i := range evs { events[i] = &evs[i]