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

Side by Side Diff: impl/memory/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: add test for per-model expiration 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 unified diff | Download patch
OLDNEW
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 memory 5 package memory
6 6
7 import ( 7 import (
8 "encoding/binary" 8 "encoding/binary"
9 "sync" 9 "sync"
10 "time" 10 "time"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 func (m *mcItem) SetFlags(flg uint32) mc.Item { 43 func (m *mcItem) SetFlags(flg uint32) mc.Item {
44 m.flags = flg 44 m.flags = flg
45 return m 45 return m
46 } 46 }
47 func (m *mcItem) SetExpiration(exp time.Duration) mc.Item { 47 func (m *mcItem) SetExpiration(exp time.Duration) mc.Item {
48 m.expiration = exp 48 m.expiration = exp
49 return m 49 return m
50 } 50 }
51 51
52 func (m *mcItem) SetAll(other mc.Item) { 52 func (m *mcItem) SetAll(other mc.Item) {
53 » *m = *other.(*mcItem) 53 » if other == nil {
54 » » *m = mcItem{key: m.key}
55 » } else {
56 » » k := m.key
57 » » *m = *other.(*mcItem)
58 » » m.key = k
59 » }
54 } 60 }
55 61
56 type mcDataItem struct { 62 type mcDataItem struct {
57 value []byte 63 value []byte
58 flags uint32 64 flags uint32
59 expiration time.Time 65 expiration time.Time
60 casID uint64 66 casID uint64
61 } 67 }
62 68
63 func (m *mcDataItem) toUserItem(key string) *mcItem { 69 func (m *mcDataItem) toUserItem(key string) *mcItem {
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 199
194 func (m *memcacheImpl) AddMulti(items []mc.Item, cb mc.RawCB) error { 200 func (m *memcacheImpl) AddMulti(items []mc.Item, cb mc.RawCB) error {
195 now := clock.Now(m.ctx) 201 now := clock.Now(m.ctx)
196 doCBs(items, cb, func(itm mc.Item) error { 202 doCBs(items, cb, func(itm mc.Item) error {
197 m.data.lock.Lock() 203 m.data.lock.Lock()
198 defer m.data.lock.Unlock() 204 defer m.data.lock.Unlock()
199 if !m.data.hasItemLocked(now, itm.Key()) { 205 if !m.data.hasItemLocked(now, itm.Key()) {
200 m.data.setItemLocked(now, itm) 206 m.data.setItemLocked(now, itm)
201 return nil 207 return nil
202 } else { 208 } else {
203 » » » return (mc.ErrNotStored) 209 » » » return mc.ErrNotStored
204 } 210 }
205 }) 211 })
206 return nil 212 return nil
207 } 213 }
208 214
209 func (m *memcacheImpl) CompareAndSwapMulti(items []mc.Item, cb mc.RawCB) error { 215 func (m *memcacheImpl) CompareAndSwapMulti(items []mc.Item, cb mc.RawCB) error {
210 now := clock.Now(m.ctx) 216 now := clock.Now(m.ctx)
211 doCBs(items, cb, func(itm mc.Item) error { 217 doCBs(items, cb, func(itm mc.Item) error {
212 m.data.lock.Lock() 218 m.data.lock.Lock()
213 defer m.data.lock.Unlock() 219 defer m.data.lock.Unlock()
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 return cur, nil 341 return cur, nil
336 } 342 }
337 343
338 func (m *memcacheImpl) Stats() (*mc.Statistics, error) { 344 func (m *memcacheImpl) Stats() (*mc.Statistics, error) {
339 m.data.lock.RLock() 345 m.data.lock.RLock()
340 defer m.data.lock.RUnlock() 346 defer m.data.lock.RUnlock()
341 347
342 ret := m.data.stats 348 ret := m.data.stats
343 return &ret, nil 349 return &ret, nil
344 } 350 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698