Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(253)

Unified Diff: service/memcache/memcache.go

Issue 1269113005: A transparent cache for datastore, backed by memcache. (Closed) Base URL: https://github.com/luci/gae.git@add_meta
Patch Set: fix comments Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « service/datastore/serialize.go ('k') | service/memcache/raw_interface.go » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
+ 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
+ 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]
if !lme.Assign(i, err) {
items[i].SetAll(item)
}
- i++
+ j++
})
if err == nil {
err = lme.Get()
« no previous file with comments | « service/datastore/serialize.go ('k') | service/memcache/raw_interface.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698