From a8029994778d2f577493a5dd54cce7abea47b055 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Tue, 8 Aug 2023 00:34:15 +0800 Subject: [PATCH] fix: rootKey empty check by len equals 0 (#801) Co-authored-by: Marko (cherry picked from commit 06f5be141653e56e130aac8082d0484e0039f2f5) # Conflicts: # CHANGELOG.md # iterator_test.go --- CHANGELOG.md | 24 ++++++++++++++++++++++++ iterator.go | 2 +- iterator_test.go | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea382ddef..4de0de0b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,31 @@ - [#654](https://github.com/cosmos/iavl/pull/654) Add API `TraverseStateChanges` to extract state changes from iavl versions. - [#726](https://github.com/cosmos/iavl/pull/726) Make `KVPair` and `ChangeSet` serializable with protobuf. +<<<<<<< HEAD - [#795](https://github.com/cosmos/iavl/pull/795) Use gogofaster buf plugin. +======= +- [#718](https://github.com/cosmos/iavl/pull/718) Fix `traverseNodes` unexpected behaviour +- [#770](https://github.com/cosmos/iavl/pull/770) Add `WorkingVersion()int64` API. + +### Bug Fixes + +- [#773](https://github.com/cosmos/iavl/pull/773) Fix memory leak in `Import`. +- [#795](https://github.com/cosmos/iavl/pull/795) Fix plugin used for buf generate. +- [#801](https://github.com/cosmos/iavl/pull/801) Fix rootKey empty check by len equals 0. + +### Breaking Changes + +- [#735](https://github.com/cosmos/iavl/pull/735) Pass logger to `NodeDB`, `MutableTree` and `ImmutableTree` + +- [#646](https://github.com/cosmos/iavl/pull/646) Remove the `orphans` from the storage + +- [#777](https://github.com/cosmos/iavl/pull/777) Don't return errors from ImmutableTree.Hash, NewImmutableTree, NewImmutableTreeWIthOpts + +### API Changes + +- [#646](https://github.com/cosmos/iavl/pull/646) Remove the `DeleteVersion`, `DeleteVersions`, `DeleteVersionsRange` and introduce a new endpoint of `DeleteVersionsTo` instead +- [#695](https://github.com/cosmos/iavl/pull/695) Add API `SaveChangeSet` to save the changeset as a new version. +>>>>>>> 06f5be1 (fix: rootKey empty check by len equals 0 (#801)) ## 0.20.0 (March 14, 2023) diff --git a/iterator.go b/iterator.go index e2f128216..63a7d0b60 100644 --- a/iterator.go +++ b/iterator.go @@ -269,7 +269,7 @@ type NodeIterator struct { // NewNodeIterator returns a new NodeIterator to traverse the tree of the root node. func NewNodeIterator(rootKey []byte, ndb *nodeDB) (*NodeIterator, error) { - if rootKey == nil { + if len(rootKey) == 0 { return &NodeIterator{ nodesToVisit: []*Node{}, ndb: ndb, diff --git a/iterator_test.go b/iterator_test.go index 0eefed302..f31398691 100644 --- a/iterator_test.go +++ b/iterator_test.go @@ -330,3 +330,52 @@ func setupUnsavedFastIterator(t *testing.T, config *iteratorTestConfig) (dbm.Ite itr := NewUnsavedFastIterator(config.startIterate, config.endIterate, config.ascending, tree.ndb, tree.unsavedFastNodeAdditions, tree.unsavedFastNodeRemovals) return itr, mirror } +<<<<<<< HEAD +======= + +func TestNodeIterator_Success(t *testing.T) { + tree, mirror := getRandomizedTreeAndMirror(t) + + _, _, err := tree.SaveVersion() + require.NoError(t, err) + + randomizeTreeAndMirror(t, tree, mirror) + + _, _, err = tree.SaveVersion() + require.NoError(t, err) + + // check if the iterating count is same with the entire node count of the tree + itr, err := NewNodeIterator(tree.root.GetKey(), tree.ndb) + require.NoError(t, err) + nodeCount := 0 + for ; itr.Valid(); itr.Next(false) { + nodeCount++ + } + require.Equal(t, int64(nodeCount), tree.Size()*2-1) + + // check if the skipped node count is right + itr, err = NewNodeIterator(tree.root.GetKey(), tree.ndb) + require.NoError(t, err) + updateCount := 0 + skipCount := 0 + for itr.Valid() { + node := itr.GetNode() + updateCount++ + if node.nodeKey.version < tree.Version() { + skipCount += int(node.size*2 - 2) // the size of the subtree without the root + } + itr.Next(node.nodeKey.version < tree.Version()) + } + require.Equal(t, nodeCount, updateCount+skipCount) +} + +func TestNodeIterator_WithEmptyRoot(t *testing.T) { + itr, err := NewNodeIterator(nil, newNodeDB(dbm.NewMemDB(), 0, nil, log.NewNopLogger())) + require.NoError(t, err) + require.False(t, itr.Valid()) + + itr, err = NewNodeIterator([]byte{}, newNodeDB(dbm.NewMemDB(), 0, nil, log.NewNopLogger())) + require.NoError(t, err) + require.False(t, itr.Valid()) +} +>>>>>>> 06f5be1 (fix: rootKey empty check by len equals 0 (#801))