Index: go/src/infra/gae/libs/gae/memory/memcache.go |
diff --git a/go/src/infra/gae/libs/gae/memory/memcache.go b/go/src/infra/gae/libs/gae/memory/memcache.go |
index 616c11d909539b07c2841ed09eff3267019741c3..bbc3811ea7ab3e9ecdc28d86df2a867dc8de74b6 100644 |
--- a/go/src/infra/gae/libs/gae/memory/memcache.go |
+++ b/go/src/infra/gae/libs/gae/memory/memcache.go |
@@ -63,8 +63,6 @@ func (m *mcItem) duplicate() *mcItem { |
} |
type memcacheData struct { |
- gae.BrokenFeatures |
- |
lock sync.Mutex |
items map[string]*mcItem |
casID uint64 |
@@ -79,10 +77,7 @@ type memcacheImpl struct { |
ctx context.Context |
} |
-var ( |
- _ = gae.Memcache((*memcacheImpl)(nil)) |
- _ = gae.Testable((*memcacheImpl)(nil)) |
-) |
+var _ gae.Memcache = (*memcacheImpl)(nil) |
// useMC adds a gae.Memcache implementation to context, accessible |
// by gae.GetMC(c) |
@@ -97,10 +92,7 @@ func useMC(c context.Context) context.Context { |
ns := curGID(ic).namespace |
mcd, ok := mcdMap[ns] |
if !ok { |
- mcd = &memcacheData{ |
- BrokenFeatures: gae.BrokenFeatures{ |
- DefaultError: gae.ErrMCServerError}, |
- items: map[string]*mcItem{}} |
+ mcd = &memcacheData{items: map[string]*mcItem{}} |
mcdMap[ns] = mcd |
} |
@@ -129,93 +121,74 @@ func (m *memcacheImpl) mkItemLocked(i gae.MCItem) (ret *mcItem) { |
return newItem.duplicate() |
} |
-func (m *memcacheImpl) BreakFeatures(err error, features ...string) { |
- m.data.BreakFeatures(err, features...) |
-} |
- |
-func (m *memcacheImpl) UnbreakFeatures(features ...string) { |
- m.data.UnbreakFeatures(features...) |
-} |
- |
func (m *memcacheImpl) NewItem(key string) gae.MCItem { |
return &mcItem{key: key} |
} |
// Add implements context.MCSingleReadWriter.Add. |
func (m *memcacheImpl) Add(i gae.MCItem) error { |
- return m.data.RunIfNotBroken(func() error { |
- m.data.lock.Lock() |
- defer m.data.lock.Unlock() |
+ m.data.lock.Lock() |
+ defer m.data.lock.Unlock() |
- if _, ok := m.retrieveLocked(i.Key()); !ok { |
- m.data.items[i.Key()] = m.mkItemLocked(i) |
- return nil |
- } |
- return gae.ErrMCNotStored |
- }) |
+ if _, ok := m.retrieveLocked(i.Key()); !ok { |
+ m.data.items[i.Key()] = m.mkItemLocked(i) |
+ return nil |
+ } |
+ return gae.ErrMCNotStored |
} |
// CompareAndSwap implements context.MCSingleReadWriter.CompareAndSwap. |
func (m *memcacheImpl) CompareAndSwap(item gae.MCItem) error { |
- return m.data.RunIfNotBroken(func() error { |
- m.data.lock.Lock() |
- defer m.data.lock.Unlock() |
- |
- if cur, ok := m.retrieveLocked(item.Key()); ok { |
- casid := uint64(0) |
- if mi, ok := item.(*mcItem); ok && mi != nil { |
- casid = mi.CasID |
- } |
- |
- if cur.CasID == casid { |
- m.data.items[item.Key()] = m.mkItemLocked(item) |
- } else { |
- return gae.ErrMCCASConflict |
- } |
+ m.data.lock.Lock() |
+ defer m.data.lock.Unlock() |
+ |
+ if cur, ok := m.retrieveLocked(item.Key()); ok { |
+ casid := uint64(0) |
+ if mi, ok := item.(*mcItem); ok && mi != nil { |
+ casid = mi.CasID |
+ } |
+ |
+ if cur.CasID == casid { |
+ m.data.items[item.Key()] = m.mkItemLocked(item) |
} else { |
- return gae.ErrMCNotStored |
+ return gae.ErrMCCASConflict |
} |
- return nil |
- }) |
+ } else { |
+ return gae.ErrMCNotStored |
+ } |
+ return nil |
} |
// Set implements context.MCSingleReadWriter.Set. |
func (m *memcacheImpl) Set(i gae.MCItem) error { |
- return m.data.RunIfNotBroken(func() error { |
- m.data.lock.Lock() |
- defer m.data.lock.Unlock() |
- m.data.items[i.Key()] = m.mkItemLocked(i) |
- return nil |
- }) |
+ m.data.lock.Lock() |
+ defer m.data.lock.Unlock() |
+ m.data.items[i.Key()] = m.mkItemLocked(i) |
+ return nil |
} |
// Get implements context.MCSingleReadWriter.Get. |
func (m *memcacheImpl) Get(key string) (itm gae.MCItem, err error) { |
- err = m.data.RunIfNotBroken(func() (err error) { |
- m.data.lock.Lock() |
- defer m.data.lock.Unlock() |
- if val, ok := m.retrieveLocked(key); ok { |
- itm = val.duplicate().SetExpiration(0) |
- } else { |
- err = gae.ErrMCCacheMiss |
- } |
- return |
- }) |
+ m.data.lock.Lock() |
+ defer m.data.lock.Unlock() |
+ if val, ok := m.retrieveLocked(key); ok { |
+ itm = val.duplicate().SetExpiration(0) |
+ } else { |
+ err = gae.ErrMCCacheMiss |
+ } |
return |
} |
// Delete implements context.MCSingleReadWriter.Delete. |
func (m *memcacheImpl) Delete(key string) error { |
- return m.data.RunIfNotBroken(func() error { |
- m.data.lock.Lock() |
- defer m.data.lock.Unlock() |
+ m.data.lock.Lock() |
+ defer m.data.lock.Unlock() |
- if _, ok := m.retrieveLocked(key); ok { |
- delete(m.data.items, key) |
- return nil |
- } |
- return gae.ErrMCCacheMiss |
- }) |
+ if _, ok := m.retrieveLocked(key); ok { |
+ delete(m.data.items, key) |
+ return nil |
+ } |
+ return gae.ErrMCCacheMiss |
} |
func (m *memcacheImpl) retrieveLocked(key string) (*mcItem, bool) { |