diff --git a/store/cache/benchmark_test.go b/store/cache/benchmark_test.go new file mode 100644 index 0000000000..cf8206272c --- /dev/null +++ b/store/cache/benchmark_test.go @@ -0,0 +1,48 @@ +package cache + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/store/types" +) + +func freshMgr() *CommitKVStoreCacheManager { + return &CommitKVStoreCacheManager{ + caches: map[string]types.CommitKVStore{ + "a1": nil, + "alalalalalal": nil, + }, + } +} + +func populate(mgr *CommitKVStoreCacheManager) { + mgr.caches["this one"] = (types.CommitKVStore)(nil) + mgr.caches["those ones are the ones"] = (types.CommitKVStore)(nil) + mgr.caches["very huge key right here and there are we going to ones are the ones"] = (types.CommitKVStore)(nil) +} + +func BenchmarkReset(b *testing.B) { + mgr := freshMgr() + + b.ResetTimer() + b.ReportAllocs() + + for i := 0; i < b.N; i++ { + mgr.Reset() + if len(mgr.caches) != 0 { + b.Fatal("Reset failed") + } + populate(mgr) + if len(mgr.caches) == 0 { + b.Fatal("populate failed") + } + mgr.Reset() + if len(mgr.caches) != 0 { + b.Fatal("Reset failed") + } + } + + if mgr == nil { + b.Fatal("Impossible condition") + } +} diff --git a/store/cache/cache.go b/store/cache/cache.go index 9eea90ad94..b58f0531fc 100644 --- a/store/cache/cache.go +++ b/store/cache/cache.go @@ -81,7 +81,12 @@ func (cmgr *CommitKVStoreCacheManager) Unwrap(key types.StoreKey) types.CommitKV // Reset resets in the internal caches. func (cmgr *CommitKVStoreCacheManager) Reset() { - cmgr.caches = make(map[string]types.CommitKVStore) + // Clear the map. + // Please note that we are purposefully using the map clearing idiom. + // See https://github.com/cosmos/cosmos-sdk/issues/6681. + for key := range cmgr.caches { + delete(cmgr.caches, key) + } } // CacheWrap returns the inter-block cache as a cache-wrapped CommitKVStore.