From 313f960746cc0c4971935cb0ceb8882342b29611 Mon Sep 17 00:00:00 2001 From: JimboJ <40345116+jimjbrettj@users.noreply.github.com> Date: Wed, 11 Sep 2024 21:48:40 +0900 Subject: [PATCH] fix(lib/runtime): Remove duplicate keys from storageDiff.clearPrefix (#4147) --- lib/runtime/storage/storagediff.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/runtime/storage/storagediff.go b/lib/runtime/storage/storagediff.go index 25e5b64962..d2d3dddf44 100644 --- a/lib/runtime/storage/storagediff.go +++ b/lib/runtime/storage/storagediff.go @@ -141,13 +141,17 @@ func (cs *storageDiff) clearPrefixInChild(keyToChild string, prefix []byte, // optional limit. It returns the number of keys deleted and a boolean // indicating if all keys with the prefix were removed. func (cs *storageDiff) clearPrefix(prefix []byte, trieKeys []string, limit int) (deleted uint32, allDeleted bool) { - allKeys := slices.Clone(trieKeys) newKeys := maps.Keys(cs.upserts) - allKeys = append(allKeys, newKeys...) + keysToClear := maps.Keys(cs.upserts) + for _, k := range trieKeys { + if _, ok := cs.upserts[k]; !ok { + keysToClear = append(keysToClear, k) + } + } deleted = 0 - sort.Strings(allKeys) - for _, k := range allKeys { + sort.Strings(keysToClear) + for _, k := range keysToClear { if limit == 0 { break } @@ -161,7 +165,7 @@ func (cs *storageDiff) clearPrefix(prefix []byte, trieKeys []string, limit int) } } - return deleted, deleted == uint32(len(allKeys)) + return deleted, deleted == uint32(len(keysToClear)) } // getFromChild attempts to retrieve a value associated with a specific key