Skip to content

Commit 49ee92a

Browse files
authored
Merge pull request #792 from albertchon/b/close-iterators
fix: close iterators
2 parents 16ea5b0 + 1c9a1e1 commit 49ee92a

File tree

5 files changed

+31
-6
lines changed

5 files changed

+31
-6
lines changed

x/wasm/keeper/genesis.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ func ExportGenesis(ctx sdk.Context, keeper *Keeper) *types.GenesisState {
119119
ContractState: state,
120120
})
121121

122+
contractStateIterator.Close()
123+
122124
return false
123125
})
124126

x/wasm/keeper/genesis_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,14 +113,17 @@ func TestGenesisExportImport(t *testing.T) {
113113
wasmKeeper.IterateContractInfo(srcCtx, func(address sdk.AccAddress, info wasmTypes.ContractInfo) bool {
114114
wasmKeeper.removeFromContractCodeSecondaryIndex(srcCtx, address, wasmKeeper.getLastContractHistoryEntry(srcCtx, address))
115115
prefixStore := prefix.NewStore(srcCtx.KVStore(wasmKeeper.storeKey), types.GetContractCodeHistoryElementPrefix(address))
116-
for iter := prefixStore.Iterator(nil, nil); iter.Valid(); iter.Next() {
116+
iter := prefixStore.Iterator(nil, nil)
117+
118+
for ; iter.Valid(); iter.Next() {
117119
prefixStore.Delete(iter.Key())
118120
}
119121
x := &info
120122
newHistory := x.ResetFromGenesis(dstCtx)
121123
wasmKeeper.storeContractInfo(srcCtx, address, x)
122124
wasmKeeper.addToContractCodeSecondaryIndex(srcCtx, address, newHistory)
123125
wasmKeeper.appendToContractHistory(srcCtx, address, newHistory)
126+
iter.Close()
124127
return false
125128
})
126129

@@ -145,6 +148,8 @@ func TestGenesisExportImport(t *testing.T) {
145148
if !assert.False(t, dstIT.Valid()) {
146149
t.Fatalf("dest Iterator still has key :%X", dstIT.Key())
147150
}
151+
srcIT.Close()
152+
dstIT.Close()
148153
}
149154
}
150155

x/wasm/keeper/keeper.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -524,7 +524,10 @@ func (k Keeper) removeFromContractCodeSecondaryIndex(ctx sdk.Context, contractAd
524524
// IterateContractsByCode iterates over all contracts with given codeID ASC on code update time.
525525
func (k Keeper) IterateContractsByCode(ctx sdk.Context, codeID uint64, cb func(address sdk.AccAddress) bool) {
526526
prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), types.GetContractByCodeIDSecondaryIndexPrefix(codeID))
527-
for iter := prefixStore.Iterator(nil, nil); iter.Valid(); iter.Next() {
527+
iter := prefixStore.Iterator(nil, nil)
528+
defer iter.Close()
529+
530+
for ; iter.Valid(); iter.Next() {
528531
key := iter.Key()
529532
if cb(key[types.AbsoluteTxPositionLen:]) {
530533
return
@@ -550,7 +553,10 @@ func (k Keeper) appendToContractHistory(ctx sdk.Context, contractAddr sdk.AccAdd
550553
// find last element position
551554
var pos uint64
552555
prefixStore := prefix.NewStore(store, types.GetContractCodeHistoryElementPrefix(contractAddr))
553-
if iter := prefixStore.ReverseIterator(nil, nil); iter.Valid() {
556+
iter := prefixStore.ReverseIterator(nil, nil)
557+
defer iter.Close()
558+
559+
if iter.Valid() {
554560
pos = sdk.BigEndianToUint64(iter.Value())
555561
}
556562
// then store with incrementing position
@@ -565,6 +571,8 @@ func (k Keeper) GetContractHistory(ctx sdk.Context, contractAddr sdk.AccAddress)
565571
prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), types.GetContractCodeHistoryElementPrefix(contractAddr))
566572
r := make([]types.ContractCodeHistoryEntry, 0)
567573
iter := prefixStore.Iterator(nil, nil)
574+
defer iter.Close()
575+
568576
for ; iter.Valid(); iter.Next() {
569577
var e types.ContractCodeHistoryEntry
570578
k.cdc.MustUnmarshal(iter.Value(), &e)
@@ -577,6 +585,8 @@ func (k Keeper) GetContractHistory(ctx sdk.Context, contractAddr sdk.AccAddress)
577585
func (k Keeper) getLastContractHistoryEntry(ctx sdk.Context, contractAddr sdk.AccAddress) types.ContractCodeHistoryEntry {
578586
prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), types.GetContractCodeHistoryElementPrefix(contractAddr))
579587
iter := prefixStore.ReverseIterator(nil, nil)
588+
defer iter.Close()
589+
580590
var r types.ContractCodeHistoryEntry
581591
if !iter.Valid() {
582592
// all contracts have a history
@@ -666,6 +676,8 @@ func (k Keeper) storeContractInfo(ctx sdk.Context, contractAddress sdk.AccAddres
666676
func (k Keeper) IterateContractInfo(ctx sdk.Context, cb func(sdk.AccAddress, types.ContractInfo) bool) {
667677
prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), types.ContractKeyPrefix)
668678
iter := prefixStore.Iterator(nil, nil)
679+
defer iter.Close()
680+
669681
for ; iter.Valid(); iter.Next() {
670682
var contract types.ContractInfo
671683
k.cdc.MustUnmarshal(iter.Value(), &contract)
@@ -716,6 +728,8 @@ func (k Keeper) containsCodeInfo(ctx sdk.Context, codeID uint64) bool {
716728
func (k Keeper) IterateCodeInfos(ctx sdk.Context, cb func(uint64, types.CodeInfo) bool) {
717729
prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), types.CodeKeyPrefix)
718730
iter := prefixStore.Iterator(nil, nil)
731+
defer iter.Close()
732+
719733
for ; iter.Valid(); iter.Next() {
720734
var c types.CodeInfo
721735
k.cdc.MustUnmarshal(iter.Value(), &c)
@@ -788,6 +802,8 @@ func (k Keeper) IsPinnedCode(ctx sdk.Context, codeID uint64) bool {
788802
func (k Keeper) InitializePinnedCodes(ctx sdk.Context) error {
789803
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.PinnedCodeIndexPrefix)
790804
iter := store.Iterator(nil, nil)
805+
defer iter.Close()
806+
791807
for ; iter.Valid(); iter.Next() {
792808
codeInfo := k.GetCodeInfo(ctx, types.ParsePinnedCodeIndex(iter.Key()))
793809
if codeInfo == nil {

x/wasm/keeper/legacy_querier.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,10 @@ func queryContractState(ctx sdk.Context, bech, queryMethod string, data []byte,
9393
case QueryMethodContractStateAll:
9494
resultData := make([]types.Model, 0)
9595
// this returns a serialized json object (which internally encoded binary fields properly)
96-
for iter := keeper.GetContractState(ctx, contractAddr); iter.Valid(); iter.Next() {
96+
iter := keeper.GetContractState(ctx, contractAddr)
97+
defer iter.Close()
98+
99+
for ; iter.Valid(); iter.Next() {
97100
resultData = append(resultData, types.Model{
98101
Key: iter.Key(),
99102
Value: iter.Value(),

x/wasm/types/iavl_range_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ func TestIavlRangeBounds(t *testing.T) {
6363
}
6464
items := consume(iter)
6565
require.Equal(t, tc.expected, items)
66+
iter.Close()
6667
})
6768
}
6869
}
@@ -73,8 +74,6 @@ type KV struct {
7374
}
7475

7576
func consume(itr store.Iterator) []KV {
76-
defer itr.Close()
77-
7877
var res []KV
7978
for ; itr.Valid(); itr.Next() {
8079
k, v := itr.Key(), itr.Value()

0 commit comments

Comments
 (0)