diff --git a/bigcache_test.go b/bigcache_test.go index 2840167f..b62a5a99 100644 --- a/bigcache_test.go +++ b/bigcache_test.go @@ -1091,3 +1091,44 @@ func (mc *mockedClock) set(value int64) { func blob(char byte, len int) []byte { return bytes.Repeat([]byte{char}, len) } + +// +func TestCache_RepeatedSetWithBiggerEntry(t *testing.T) { + + opt := DefaultConfig(time.Second) + opt.Shards = 2 << 10 + opt.MaxEntriesInWindow = 1024 + opt.MaxEntrySize = 1 + opt.HardMaxCacheSize = 1 + bc, _ := NewBigCache(opt) + + err := bc.Set("2225", make([]byte, 200)) + if nil != err { + t.Error(err) + t.FailNow() + } + err = bc.Set("8573", make([]byte, 100)) + if nil != err { + t.Error(err) + t.FailNow() + } + + err = bc.Set("8573", make([]byte, 450)) + if nil != err { + // occur error but go next + t.Logf("%v", err) + } + + err = bc.Set("7327", make([]byte, 300)) + if nil != err { + t.Error(err) + t.FailNow() + } + + err = bc.Set("8573", make([]byte, 200)) + if nil != err { + t.Error(err) + t.FailNow() + } + +} diff --git a/shard.go b/shard.go index cd352a18..37b09522 100644 --- a/shard.go +++ b/shard.go @@ -125,6 +125,8 @@ func (s *cacheShard) set(key string, hashedKey uint64, entry []byte) error { if previousIndex := s.hashmap[hashedKey]; previousIndex != 0 { if previousEntry, err := s.entries.Get(int(previousIndex)); err == nil { resetKeyFromEntry(previousEntry) + //remove hashkey + delete(s.hashmap, hashedKey) } }