diff --git a/store/cachekv/store.go b/store/cachekv/store.go index 01ebf2f6..a82be0a0 100644 --- a/store/cachekv/store.go +++ b/store/cachekv/store.go @@ -381,6 +381,11 @@ func (store *Store) GetAllKeyStrsInRange(start, end []byte) (res []string) { keyStrs[pk] = struct{}{} } store.cache.Range(func(key, value any) bool { + kbz := []byte(key.(string)) + if bytes.Compare(kbz, start) < 0 || bytes.Compare(kbz, end) >= 0 { + // we don't want to break out of the iteration since cache isn't sorted + return true + } cv := value.(*types.CValue) if cv.Value() == nil { delete(keyStrs, key.(string)) diff --git a/store/cachekv/store_test.go b/store/cachekv/store_test.go index a3a40664..d174ec4c 100644 --- a/store/cachekv/store_test.go +++ b/store/cachekv/store_test.go @@ -70,12 +70,16 @@ func TestCacheKVStore(t *testing.T) { mem.Set(keyFmt(1), valFmt(1)) mem.Set(keyFmt(3), valFmt(4)) st = cachekv.NewStore(mem, types.NewKVStoreKey("CacheKvTest"), types.DefaultCacheSizeLimit) + st.Set(keyFmt(0), valFmt(0)) st.Set(keyFmt(1), valFmt(2)) st.Set(keyFmt(2), valFmt(3)) - require.Nil(t, st.DeleteAll(nil, nil)) + st.Set(keyFmt(5), valFmt(6)) + require.Nil(t, st.DeleteAll(keyFmt(1), keyFmt(5))) require.Nil(t, st.Get(keyFmt(1))) require.Nil(t, st.Get(keyFmt(2))) require.Nil(t, st.Get(keyFmt(3))) + require.NotNil(t, st.Get(keyFmt(0))) + require.NotNil(t, st.Get(keyFmt(5))) require.Equal(t, valFmt(1), mem.Get(keyFmt(1))) require.Equal(t, valFmt(4), mem.Get(keyFmt(3))) }