Merge PR #2107: Fix iterator leak
This commit is contained in:
commit
0728bd995f
|
@ -71,5 +71,6 @@ BUG FIXES
|
||||||
|
|
||||||
* SDK
|
* SDK
|
||||||
* \#1988 Make us compile on OpenBSD (disable ledger) [#1988] (https://github.com/cosmos/cosmos-sdk/issues/1988)
|
* \#1988 Make us compile on OpenBSD (disable ledger) [#1988] (https://github.com/cosmos/cosmos-sdk/issues/1988)
|
||||||
|
* \#2105 Fix DB Iterator leak, which may leak a go routine.
|
||||||
|
|
||||||
* Tendermint
|
* Tendermint
|
||||||
|
|
|
@ -93,6 +93,7 @@ func (valset ValidatorSet) Dissociate(ctx sdk.Context, base sdk.AccAddress, asso
|
||||||
func (valset ValidatorSet) Associations(ctx sdk.Context, base sdk.AccAddress) (res []sdk.AccAddress) {
|
func (valset ValidatorSet) Associations(ctx sdk.Context, base sdk.AccAddress) (res []sdk.AccAddress) {
|
||||||
res = make([]sdk.AccAddress, valset.maxAssoc)
|
res = make([]sdk.AccAddress, valset.maxAssoc)
|
||||||
iter := sdk.KVStorePrefixIterator(valset.store, GetAssocPrefix(base))
|
iter := sdk.KVStorePrefixIterator(valset.store, GetAssocPrefix(base))
|
||||||
|
defer iter.Close()
|
||||||
i := 0
|
i := 0
|
||||||
for ; iter.Valid(); iter.Next() {
|
for ; iter.Valid(); iter.Next() {
|
||||||
key := iter.Key()
|
key := iter.Key()
|
||||||
|
|
|
@ -28,6 +28,7 @@ func (keeper Keeper) update(ctx sdk.Context, val sdk.Validator, valset sdk.Valid
|
||||||
prefix := GetSignPrefix(p, keeper.cdc)
|
prefix := GetSignPrefix(p, keeper.cdc)
|
||||||
store := ctx.KVStore(keeper.key)
|
store := ctx.KVStore(keeper.key)
|
||||||
iter := sdk.KVStorePrefixIterator(store, prefix)
|
iter := sdk.KVStorePrefixIterator(store, prefix)
|
||||||
|
defer iter.Close()
|
||||||
for ; iter.Valid(); iter.Next() {
|
for ; iter.Valid(); iter.Next() {
|
||||||
if valset.Validator(ctx, iter.Value()) != nil {
|
if valset.Validator(ctx, iter.Value()) != nil {
|
||||||
store.Delete(iter.Key())
|
store.Delete(iter.Key())
|
||||||
|
|
|
@ -168,6 +168,7 @@ func TestIAVLSubspaceIterator(t *testing.T) {
|
||||||
require.EqualValues(t, value, expectedKey)
|
require.EqualValues(t, value, expectedKey)
|
||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
|
iter.Close()
|
||||||
require.Equal(t, len(expected), i)
|
require.Equal(t, len(expected), i)
|
||||||
|
|
||||||
iter = sdk.KVStorePrefixIterator(iavlStore, []byte{byte(55), byte(255), byte(255)})
|
iter = sdk.KVStorePrefixIterator(iavlStore, []byte{byte(55), byte(255), byte(255)})
|
||||||
|
@ -183,6 +184,7 @@ func TestIAVLSubspaceIterator(t *testing.T) {
|
||||||
require.EqualValues(t, value, []byte("test4"))
|
require.EqualValues(t, value, []byte("test4"))
|
||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
|
iter.Close()
|
||||||
require.Equal(t, len(expected), i)
|
require.Equal(t, len(expected), i)
|
||||||
|
|
||||||
iter = sdk.KVStorePrefixIterator(iavlStore, []byte{byte(255), byte(255)})
|
iter = sdk.KVStorePrefixIterator(iavlStore, []byte{byte(255), byte(255)})
|
||||||
|
@ -198,6 +200,7 @@ func TestIAVLSubspaceIterator(t *testing.T) {
|
||||||
require.EqualValues(t, value, []byte("test4"))
|
require.EqualValues(t, value, []byte("test4"))
|
||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
|
iter.Close()
|
||||||
require.Equal(t, len(expected), i)
|
require.Equal(t, len(expected), i)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -87,6 +87,7 @@ func (am AccountMapper) SetAccount(ctx sdk.Context, acc Account) {
|
||||||
func (am AccountMapper) IterateAccounts(ctx sdk.Context, process func(Account) (stop bool)) {
|
func (am AccountMapper) IterateAccounts(ctx sdk.Context, process func(Account) (stop bool)) {
|
||||||
store := ctx.KVStore(am.key)
|
store := ctx.KVStore(am.key)
|
||||||
iter := sdk.KVStorePrefixIterator(store, []byte("account:"))
|
iter := sdk.KVStorePrefixIterator(store, []byte("account:"))
|
||||||
|
defer iter.Close()
|
||||||
for {
|
for {
|
||||||
if !iter.Valid() {
|
if !iter.Valid() {
|
||||||
return
|
return
|
||||||
|
|
|
@ -130,6 +130,7 @@ func TestDeposits(t *testing.T) {
|
||||||
require.Equal(t, fourSteak, deposit.Amount)
|
require.Equal(t, fourSteak, deposit.Amount)
|
||||||
depositsIterator.Next()
|
depositsIterator.Next()
|
||||||
require.False(t, depositsIterator.Valid())
|
require.False(t, depositsIterator.Valid())
|
||||||
|
depositsIterator.Close()
|
||||||
|
|
||||||
// Test Refund Deposits
|
// Test Refund Deposits
|
||||||
deposit, found = keeper.GetDeposit(ctx, proposalID, addrs[1])
|
deposit, found = keeper.GetDeposit(ctx, proposalID, addrs[1])
|
||||||
|
@ -196,6 +197,7 @@ func TestVotes(t *testing.T) {
|
||||||
require.Equal(t, OptionNoWithVeto, vote.Option)
|
require.Equal(t, OptionNoWithVeto, vote.Option)
|
||||||
votesIterator.Next()
|
votesIterator.Next()
|
||||||
require.False(t, votesIterator.Valid())
|
require.False(t, votesIterator.Valid())
|
||||||
|
votesIterator.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestProposalQueues(t *testing.T) {
|
func TestProposalQueues(t *testing.T) {
|
||||||
|
|
|
@ -36,6 +36,7 @@ func tally(ctx sdk.Context, keeper Keeper, proposal Proposal) (passes bool, tall
|
||||||
|
|
||||||
// iterate over all the votes
|
// iterate over all the votes
|
||||||
votesIterator := keeper.GetVotes(ctx, proposal.GetProposalID())
|
votesIterator := keeper.GetVotes(ctx, proposal.GetProposalID())
|
||||||
|
defer votesIterator.Close()
|
||||||
for ; votesIterator.Valid(); votesIterator.Next() {
|
for ; votesIterator.Valid(); votesIterator.Next() {
|
||||||
vote := &Vote{}
|
vote := &Vote{}
|
||||||
keeper.cdc.MustUnmarshalBinary(votesIterator.Value(), vote)
|
keeper.cdc.MustUnmarshalBinary(votesIterator.Value(), vote)
|
||||||
|
@ -64,7 +65,6 @@ func tally(ctx sdk.Context, keeper Keeper, proposal Proposal) (passes bool, tall
|
||||||
|
|
||||||
keeper.deleteVote(ctx, vote.ProposalID, vote.Voter)
|
keeper.deleteVote(ctx, vote.ProposalID, vote.Voter)
|
||||||
}
|
}
|
||||||
votesIterator.Close()
|
|
||||||
|
|
||||||
// Iterate over the validators again to tally their voting power and see who didn't vote
|
// Iterate over the validators again to tally their voting power and see who didn't vote
|
||||||
nonVoting = []sdk.AccAddress{}
|
nonVoting = []sdk.AccAddress{}
|
||||||
|
|
Loading…
Reference in New Issue