Index: service/memcache/memcache.go |
diff --git a/service/memcache/memcache.go b/service/memcache/memcache.go |
index e9a1e40bd77ffc08e0440b43156c64ceb32af267..e2ba498d7d6cdb4cba339ecae697c7df42e32f28 100644 |
--- a/service/memcache/memcache.go |
+++ b/service/memcache/memcache.go |
@@ -33,12 +33,27 @@ func (m *memcacheImpl) CompareAndSwap(item Item) error { |
return errors.SingleError(m.CompareAndSwapMulti([]Item{item})) |
} |
-func multiCall(items []Item, inner func(items []Item, cb RawCB) error) error { |
+func filterItems(lme *errors.LazyMultiError, items []Item, nilErr error) ([]Item, []int) { |
dnj
2015/08/05 18:32:18
We can catch duplicate "set" here, too, by working
iannucci
2015/08/06 01:54:02
uuuuggggggghhhhh :(
|
+ idxMap := make([]int, 0, len(items)) |
+ retItems := make([]Item, 0, len(items)) |
+ for i, itm := range items { |
+ if itm != nil { |
+ idxMap = append(idxMap, i) |
+ retItems = append(retItems, itm) |
+ } else { |
+ lme.Assign(i, nilErr) |
+ } |
+ } |
+ return retItems, idxMap |
+} |
+ |
+func multiCall(items []Item, nilErr error, inner func(items []Item, cb RawCB) error) error { |
lme := errors.LazyMultiError{Size: len(items)} |
- i := 0 |
- err := inner(items, func(err error) { |
- lme.Assign(i, err) |
- i++ |
+ realItems, idxMap := filterItems(&lme, items, nilErr) |
+ j := 0 |
dnj
2015/08/05 18:32:18
What was wrong with "i"?
iannucci
2015/08/06 01:54:02
b/c I'm using i for the index into the input map a
|
+ err := inner(realItems, func(err error) { |
+ lme.Assign(idxMap[j], err) |
+ j++ |
}) |
if err == nil { |
err = lme.Get() |
@@ -47,15 +62,15 @@ func multiCall(items []Item, inner func(items []Item, cb RawCB) error) error { |
} |
func (m *memcacheImpl) AddMulti(items []Item) error { |
- return multiCall(items, m.RawInterface.AddMulti) |
+ return multiCall(items, ErrNotStored, m.RawInterface.AddMulti) |
} |
func (m *memcacheImpl) SetMulti(items []Item) error { |
- return multiCall(items, m.RawInterface.SetMulti) |
+ return multiCall(items, ErrNotStored, m.RawInterface.SetMulti) |
} |
func (m *memcacheImpl) CompareAndSwapMulti(items []Item) error { |
- return multiCall(items, m.RawInterface.CompareAndSwapMulti) |
+ return multiCall(items, ErrNotStored, m.RawInterface.CompareAndSwapMulti) |
} |
func (m *memcacheImpl) DeleteMulti(keys []string) error { |
@@ -73,16 +88,23 @@ func (m *memcacheImpl) DeleteMulti(keys []string) error { |
func (m *memcacheImpl) GetMulti(items []Item) error { |
lme := errors.LazyMultiError{Size: len(items)} |
- i := 0 |
- keys := make([]string, len(items)) |
- for i, itm := range items { |
+ realItems, idxMap := filterItems(&lme, items, ErrCacheMiss) |
+ if len(realItems) == 0 { |
+ return lme.Get() |
+ } |
+ |
+ keys := make([]string, len(realItems)) |
+ for i, itm := range realItems { |
keys[i] = itm.Key() |
} |
+ |
+ j := 0 |
err := m.RawInterface.GetMulti(keys, func(item Item, err error) { |
+ i := idxMap[j] |
iannucci
2015/08/06 01:54:02
like right here!
|
if !lme.Assign(i, err) { |
items[i].SetAll(item) |
} |
- i++ |
+ j++ |
}) |
if err == nil { |
err = lme.Get() |