From 3da1e578270eb040a4e30ed5e476eeda94b9d358 Mon Sep 17 00:00:00 2001 From: flisky Date: Wed, 1 Apr 2020 22:07:04 +0800 Subject: [PATCH] give a way to access the stale cache --- bigcache.go | 7 +++---- bigcache_test.go | 8 +++++++- shard.go | 8 +++----- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/bigcache.go b/bigcache.go index d6b00f66..d5de8144 100644 --- a/bigcache.go +++ b/bigcache.go @@ -32,14 +32,13 @@ type Response struct { type RemoveReason uint32 const ( - _ RemoveReason = iota // Expired means the key is past its LifeWindow. - Expired + Expired = RemoveReason(1) // NoSpace means the key is the oldest and the cache size was at its maximum when Set was called, or the // entry exceeded the maximum shard size. - NoSpace + NoSpace = RemoveReason(2) // Deleted means Delete was called and this key was removed as a result. - Deleted + Deleted = RemoveReason(3) ) // NewBigCache initialize new instance of BigCache diff --git a/bigcache_test.go b/bigcache_test.go index 65c2eb15..4bf28a5d 100644 --- a/bigcache_test.go +++ b/bigcache_test.go @@ -995,14 +995,20 @@ func TestBigCache_GetWithInfo(t *testing.T) { // when data, resp, err := cache.GetWithInfo(key) + + // then assertEqual(t, []byte(value), data) noError(t, err) assertEqual(t, Response{}, resp) + + // when clock.set(5) data, resp, err = cache.GetWithInfo(key) + + // then assertEqual(t, err, nil) assertEqual(t, Response{EntryStatus: Expired}, resp) - assertEqual(t, []byte(nil), data) + assertEqual(t, []byte(value), data) } type mockedLogger struct { diff --git a/shard.go b/shard.go index 2d6ba621..a3c8c097 100644 --- a/shard.go +++ b/shard.go @@ -49,15 +49,13 @@ func (s *cacheShard) getWithInfo(key string, hashedKey uint64) (entry []byte, re return nil, resp, ErrEntryNotFound } + entry = readEntry(wrappedEntry) oldestTimeStamp := readTimestampFromEntry(wrappedEntry) + s.lock.RUnlock() + s.hit(hashedKey) if currentTime-oldestTimeStamp >= s.lifeWindow { - s.lock.RUnlock() resp.EntryStatus = Expired - return nil, resp, nil } - entry = readEntry(wrappedEntry) - s.lock.RUnlock() - s.hit(hashedKey) return entry, resp, nil }