diff --git a/store/list.go b/store/list.go index b38f11b80..542a77bf9 100644 --- a/store/list.go +++ b/store/list.go @@ -84,6 +84,7 @@ func (m List) Push(value interface{}) { // CONTRACT: No writes may happen within a domain while iterating over it. func (m List) Iterate(ptr interface{}, fn func(uint64) bool) { iter := sdk.KVStorePrefixIterator(m.store, []byte{0x01}) + defer iter.Close() for ; iter.Valid(); iter.Next() { v := iter.Value() m.cdc.MustUnmarshalBinaryLengthPrefixed(v, ptr) @@ -100,8 +101,6 @@ func (m List) Iterate(ptr interface{}, fn func(uint64) bool) { break } } - - iter.Close() } func subspace(prefix []byte) (start, end []byte) { diff --git a/x/gov/genesis.go b/x/gov/genesis.go index e06d79b21..9c44b2f00 100644 --- a/x/gov/genesis.go +++ b/x/gov/genesis.go @@ -184,12 +184,14 @@ func ExportGenesis(ctx sdk.Context, k Keeper) GenesisState { for _, proposal := range proposals { proposalID := proposal.GetProposalID() depositsIterator := k.GetDeposits(ctx, proposalID) + defer depositsIterator.Close() for ; depositsIterator.Valid(); depositsIterator.Next() { var deposit Deposit k.cdc.MustUnmarshalBinaryLengthPrefixed(depositsIterator.Value(), &deposit) deposits = append(deposits, DepositWithMetadata{proposalID, deposit}) } votesIterator := k.GetVotes(ctx, proposalID) + defer votesIterator.Close() for ; votesIterator.Valid(); votesIterator.Next() { var vote Vote k.cdc.MustUnmarshalBinaryLengthPrefixed(votesIterator.Value(), &vote) diff --git a/x/gov/keeper.go b/x/gov/keeper.go index 19fd65734..f59cdfd15 100644 --- a/x/gov/keeper.go +++ b/x/gov/keeper.go @@ -422,7 +422,7 @@ func (keeper Keeper) GetDeposits(ctx sdk.Context, proposalID uint64) sdk.Iterato func (keeper Keeper) RefundDeposits(ctx sdk.Context, proposalID uint64) { store := ctx.KVStore(keeper.storeKey) depositsIterator := keeper.GetDeposits(ctx, proposalID) - + defer depositsIterator.Close() for ; depositsIterator.Valid(); depositsIterator.Next() { deposit := &Deposit{} keeper.cdc.MustUnmarshalBinaryLengthPrefixed(depositsIterator.Value(), deposit) @@ -434,15 +434,13 @@ func (keeper Keeper) RefundDeposits(ctx sdk.Context, proposalID uint64) { store.Delete(depositsIterator.Key()) } - - depositsIterator.Close() } // Deletes all the deposits on a specific proposal without refunding them func (keeper Keeper) DeleteDeposits(ctx sdk.Context, proposalID uint64) { store := ctx.KVStore(keeper.storeKey) depositsIterator := keeper.GetDeposits(ctx, proposalID) - + defer depositsIterator.Close() for ; depositsIterator.Valid(); depositsIterator.Next() { deposit := &Deposit{} keeper.cdc.MustUnmarshalBinaryLengthPrefixed(depositsIterator.Value(), deposit) @@ -454,8 +452,6 @@ func (keeper Keeper) DeleteDeposits(ctx sdk.Context, proposalID uint64) { store.Delete(depositsIterator.Key()) } - - depositsIterator.Close() } // ===================================================== diff --git a/x/gov/querier.go b/x/gov/querier.go index bc4eb0d2b..b9f0fbf7f 100644 --- a/x/gov/querier.go +++ b/x/gov/querier.go @@ -181,6 +181,7 @@ func queryDeposits(ctx sdk.Context, path []string, req abci.RequestQuery, keeper var deposits []Deposit depositsIterator := keeper.GetDeposits(ctx, params.ProposalID) + defer depositsIterator.Close() for ; depositsIterator.Valid(); depositsIterator.Next() { deposit := Deposit{} keeper.cdc.MustUnmarshalBinaryLengthPrefixed(depositsIterator.Value(), &deposit) @@ -238,6 +239,7 @@ func queryVotes(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Ke var votes []Vote votesIterator := keeper.GetVotes(ctx, params.ProposalID) + defer votesIterator.Close() for ; votesIterator.Valid(); votesIterator.Next() { vote := Vote{} keeper.cdc.MustUnmarshalBinaryLengthPrefixed(votesIterator.Value(), &vote) diff --git a/x/staking/keeper/sdk_types.go b/x/staking/keeper/sdk_types.go index 7e610360a..8c5bad161 100644 --- a/x/staking/keeper/sdk_types.go +++ b/x/staking/keeper/sdk_types.go @@ -14,6 +14,7 @@ var _ sdk.ValidatorSet = Keeper{} func (k Keeper) IterateValidators(ctx sdk.Context, fn func(index int64, validator sdk.Validator) (stop bool)) { store := ctx.KVStore(k.storeKey) iterator := sdk.KVStorePrefixIterator(store, ValidatorsKey) + defer iterator.Close() i := int64(0) for ; iterator.Valid(); iterator.Next() { validator := types.MustUnmarshalValidator(k.cdc, iterator.Value()) @@ -23,7 +24,6 @@ func (k Keeper) IterateValidators(ctx sdk.Context, fn func(index int64, validato } i++ } - iterator.Close() } // iterate through the bonded validator set and perform the provided function @@ -52,6 +52,7 @@ func (k Keeper) IterateBondedValidatorsByPower(ctx sdk.Context, fn func(index in // iterate through the active validator set and perform the provided function func (k Keeper) IterateLastValidators(ctx sdk.Context, fn func(index int64, validator sdk.Validator) (stop bool)) { iterator := k.LastValidatorsIterator(ctx) + defer iterator.Close() i := int64(0) for ; iterator.Valid(); iterator.Next() { address := AddressFromLastValidatorPowerKey(iterator.Key()) @@ -66,7 +67,6 @@ func (k Keeper) IterateLastValidators(ctx sdk.Context, fn func(index int64, vali } i++ } - iterator.Close() } // get the sdk.validator for a particular address @@ -134,6 +134,7 @@ func (k Keeper) IterateDelegations(ctx sdk.Context, delAddr sdk.AccAddress, store := ctx.KVStore(k.storeKey) delegatorPrefixKey := GetDelegationsKey(delAddr) iterator := sdk.KVStorePrefixIterator(store, delegatorPrefixKey) //smallest to largest + defer iterator.Close() for i := int64(0); iterator.Valid(); iterator.Next() { del := types.MustUnmarshalDelegation(k.cdc, iterator.Value()) stop := fn(i, del) @@ -142,5 +143,4 @@ func (k Keeper) IterateDelegations(ctx sdk.Context, delAddr sdk.AccAddress, } i++ } - iterator.Close() } diff --git a/x/staking/keeper/test_common.go b/x/staking/keeper/test_common.go index 057b82a2a..b8c106bf8 100644 --- a/x/staking/keeper/test_common.go +++ b/x/staking/keeper/test_common.go @@ -215,6 +215,7 @@ func TestingUpdateValidator(keeper Keeper, ctx sdk.Context, validator types.Vali { // Remove any existing power key for validator. store := ctx.KVStore(keeper.storeKey) iterator := sdk.KVStorePrefixIterator(store, ValidatorsByPowerIndexKey) + defer iterator.Close() deleted := false for ; iterator.Valid(); iterator.Next() { valAddr := parseValidatorPowerRankKey(iterator.Key()) diff --git a/x/staking/keeper/val_state_change.go b/x/staking/keeper/val_state_change.go index 3ddb995fc..70ddb656b 100644 --- a/x/staking/keeper/val_state_change.go +++ b/x/staking/keeper/val_state_change.go @@ -36,6 +36,7 @@ func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []ab // Iterate over validators, highest power to lowest. iterator := sdk.KVStoreReversePrefixIterator(store, ValidatorsByPowerIndexKey) + defer iterator.Close() count := 0 for ; iterator.Valid() && count < int(maxValidators); iterator.Next() { @@ -254,6 +255,7 @@ func (k Keeper) getLastValidatorsByAddr(ctx sdk.Context) validatorsByAddr { last := make(validatorsByAddr) store := ctx.KVStore(k.storeKey) iterator := sdk.KVStorePrefixIterator(store, LastValidatorPowerKey) + defer iterator.Close() for ; iterator.Valid(); iterator.Next() { var valAddr [sdk.AddrLen]byte copy(valAddr[:], iterator.Key()[1:])