| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package memcache | 5 package memcache |
| 6 | 6 |
| 7 import ( | 7 import ( |
| 8 "github.com/luci/luci-go/common/errors" | 8 "github.com/luci/luci-go/common/errors" |
| 9 "golang.org/x/net/context" | 9 "golang.org/x/net/context" |
| 10 ) | 10 ) |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 } | 26 } |
| 27 | 27 |
| 28 func (m *memcacheImpl) Delete(key string) error { | 28 func (m *memcacheImpl) Delete(key string) error { |
| 29 return errors.SingleError(m.DeleteMulti([]string{key})) | 29 return errors.SingleError(m.DeleteMulti([]string{key})) |
| 30 } | 30 } |
| 31 | 31 |
| 32 func (m *memcacheImpl) CompareAndSwap(item Item) error { | 32 func (m *memcacheImpl) CompareAndSwap(item Item) error { |
| 33 return errors.SingleError(m.CompareAndSwapMulti([]Item{item})) | 33 return errors.SingleError(m.CompareAndSwapMulti([]Item{item})) |
| 34 } | 34 } |
| 35 | 35 |
| 36 func filterItems(lme *errors.LazyMultiError, items []Item, nilErr error) ([]Item
, []int) { | 36 func filterItems(lme errors.LazyMultiError, items []Item, nilErr error) ([]Item,
[]int) { |
| 37 idxMap := make([]int, 0, len(items)) | 37 idxMap := make([]int, 0, len(items)) |
| 38 retItems := make([]Item, 0, len(items)) | 38 retItems := make([]Item, 0, len(items)) |
| 39 for i, itm := range items { | 39 for i, itm := range items { |
| 40 if itm != nil { | 40 if itm != nil { |
| 41 idxMap = append(idxMap, i) | 41 idxMap = append(idxMap, i) |
| 42 retItems = append(retItems, itm) | 42 retItems = append(retItems, itm) |
| 43 } else { | 43 } else { |
| 44 lme.Assign(i, nilErr) | 44 lme.Assign(i, nilErr) |
| 45 } | 45 } |
| 46 } | 46 } |
| 47 return retItems, idxMap | 47 return retItems, idxMap |
| 48 } | 48 } |
| 49 | 49 |
| 50 func multiCall(items []Item, nilErr error, inner func(items []Item, cb RawCB) er
ror) error { | 50 func multiCall(items []Item, nilErr error, inner func(items []Item, cb RawCB) er
ror) error { |
| 51 » lme := errors.LazyMultiError{Size: len(items)} | 51 » lme := errors.NewLazyMultiError(len(items)) |
| 52 » realItems, idxMap := filterItems(&lme, items, nilErr) | 52 » realItems, idxMap := filterItems(lme, items, nilErr) |
| 53 j := 0 | 53 j := 0 |
| 54 err := inner(realItems, func(err error) { | 54 err := inner(realItems, func(err error) { |
| 55 lme.Assign(idxMap[j], err) | 55 lme.Assign(idxMap[j], err) |
| 56 j++ | 56 j++ |
| 57 }) | 57 }) |
| 58 if err == nil { | 58 if err == nil { |
| 59 err = lme.Get() | 59 err = lme.Get() |
| 60 } | 60 } |
| 61 return err | 61 return err |
| 62 } | 62 } |
| 63 | 63 |
| 64 func (m *memcacheImpl) AddMulti(items []Item) error { | 64 func (m *memcacheImpl) AddMulti(items []Item) error { |
| 65 return multiCall(items, ErrNotStored, m.RawInterface.AddMulti) | 65 return multiCall(items, ErrNotStored, m.RawInterface.AddMulti) |
| 66 } | 66 } |
| 67 | 67 |
| 68 func (m *memcacheImpl) SetMulti(items []Item) error { | 68 func (m *memcacheImpl) SetMulti(items []Item) error { |
| 69 return multiCall(items, ErrNotStored, m.RawInterface.SetMulti) | 69 return multiCall(items, ErrNotStored, m.RawInterface.SetMulti) |
| 70 } | 70 } |
| 71 | 71 |
| 72 func (m *memcacheImpl) CompareAndSwapMulti(items []Item) error { | 72 func (m *memcacheImpl) CompareAndSwapMulti(items []Item) error { |
| 73 return multiCall(items, ErrNotStored, m.RawInterface.CompareAndSwapMulti
) | 73 return multiCall(items, ErrNotStored, m.RawInterface.CompareAndSwapMulti
) |
| 74 } | 74 } |
| 75 | 75 |
| 76 func (m *memcacheImpl) DeleteMulti(keys []string) error { | 76 func (m *memcacheImpl) DeleteMulti(keys []string) error { |
| 77 » lme := errors.LazyMultiError{Size: len(keys)} | 77 » lme := errors.NewLazyMultiError(len(keys)) |
| 78 i := 0 | 78 i := 0 |
| 79 err := m.RawInterface.DeleteMulti(keys, func(err error) { | 79 err := m.RawInterface.DeleteMulti(keys, func(err error) { |
| 80 lme.Assign(i, err) | 80 lme.Assign(i, err) |
| 81 i++ | 81 i++ |
| 82 }) | 82 }) |
| 83 if err == nil { | 83 if err == nil { |
| 84 err = lme.Get() | 84 err = lme.Get() |
| 85 } | 85 } |
| 86 return err | 86 return err |
| 87 } | 87 } |
| 88 | 88 |
| 89 func (m *memcacheImpl) GetMulti(items []Item) error { | 89 func (m *memcacheImpl) GetMulti(items []Item) error { |
| 90 » lme := errors.LazyMultiError{Size: len(items)} | 90 » lme := errors.NewLazyMultiError(len(items)) |
| 91 » realItems, idxMap := filterItems(&lme, items, ErrCacheMiss) | 91 » realItems, idxMap := filterItems(lme, items, ErrCacheMiss) |
| 92 if len(realItems) == 0 { | 92 if len(realItems) == 0 { |
| 93 return lme.Get() | 93 return lme.Get() |
| 94 } | 94 } |
| 95 | 95 |
| 96 keys := make([]string, len(realItems)) | 96 keys := make([]string, len(realItems)) |
| 97 for i, itm := range realItems { | 97 for i, itm := range realItems { |
| 98 keys[i] = itm.Key() | 98 keys[i] = itm.Key() |
| 99 } | 99 } |
| 100 | 100 |
| 101 j := 0 | 101 j := 0 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 119 func (m *memcacheImpl) IncrementExisting(key string, delta int64) (newValue uint
64, err error) { | 119 func (m *memcacheImpl) IncrementExisting(key string, delta int64) (newValue uint
64, err error) { |
| 120 return m.RawInterface.Increment(key, delta, nil) | 120 return m.RawInterface.Increment(key, delta, nil) |
| 121 } | 121 } |
| 122 | 122 |
| 123 func (m *memcacheImpl) Raw() RawInterface { return m.RawInterface } | 123 func (m *memcacheImpl) Raw() RawInterface { return m.RawInterface } |
| 124 | 124 |
| 125 // Get gets the current memcache implementation from the context. | 125 // Get gets the current memcache implementation from the context. |
| 126 func Get(c context.Context) Interface { | 126 func Get(c context.Context) Interface { |
| 127 return &memcacheImpl{GetRaw(c)} | 127 return &memcacheImpl{GetRaw(c)} |
| 128 } | 128 } |
| OLD | NEW |