impl/memory: Fix memcache stats race.
Fix a race in memcache stats that was caused by modification of common
stats varibles while holding a possibly-shared RLock. This fix switches
locking from RWMutex to Mutex, since potentially every access contains
mutations to the shared state.
BUG=None
TEST=local
- Re-ran external test with fix, race no longer triggered.
R=iannucci@chromium.org
Review-Url: https://codereview.chromium.org/2554793002
diff --git a/impl/memory/memcache.go b/impl/memory/memcache.go
index 9e2d55c..624617b 100644
--- a/impl/memory/memcache.go
+++ b/impl/memory/memcache.go
@@ -78,7 +78,7 @@
}
type memcacheData struct {
- lock sync.RWMutex
+ lock sync.Mutex
items map[string]*mcDataItem
casID uint64
@@ -258,8 +258,8 @@
for i, k := range keys {
itms[i], errs[i] = func() (mc.Item, error) {
- m.data.lock.RLock()
- defer m.data.lock.RUnlock()
+ m.data.lock.Lock()
+ defer m.data.lock.Unlock()
val, err := m.data.retrieveLocked(now, k)
if err != nil {
return nil, err
@@ -345,8 +345,8 @@
}
func (m *memcacheImpl) Stats() (*mc.Statistics, error) {
- m.data.lock.RLock()
- defer m.data.lock.RUnlock()
+ m.data.lock.Lock()
+ defer m.data.lock.Unlock()
ret := m.data.stats
return &ret, nil