Skip to content

Commit a3e0980

Browse files
authored
Merge pull request #1 from yihuang/pruning/reformatted_node_get-backport
get the node reformatted by pruning
2 parents 594b181 + 56b160b commit a3e0980

File tree

3 files changed

+42
-0
lines changed

3 files changed

+42
-0
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# Changelog
22

33

4+
### Bug Fixes
5+
6+
- [#1007](https://github.com/cosmos/iavl/pull/1007) Add the extra check for the reformatted root node in `GetNode`
7+
48
### Improvements
59

610
- [#961](https://github.com/cosmos/iavl/pull/961) Add new `GetLatestVersion` API to get the latest version.

mutable_tree_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1453,3 +1453,27 @@ func TestMutableTreeClose(t *testing.T) {
14531453

14541454
require.NoError(t, tree.Close())
14551455
}
1456+
1457+
func TestReferenceRootPruning(t *testing.T) {
1458+
memDB := dbm.NewMemDB()
1459+
tree := NewMutableTree(memDB, 0, true, NewNopLogger())
1460+
1461+
_, err := tree.Set([]byte("foo"), []byte("bar"))
1462+
require.NoError(t, err)
1463+
_, _, err = tree.SaveVersion()
1464+
require.NoError(t, err)
1465+
1466+
_, _, err = tree.SaveVersion()
1467+
require.NoError(t, err)
1468+
1469+
_, err = tree.Set([]byte("foo1"), []byte("bar"))
1470+
require.NoError(t, err)
1471+
_, _, err = tree.SaveVersion()
1472+
require.NoError(t, err)
1473+
1474+
err = tree.DeleteVersionsTo(1)
1475+
require.NoError(t, err)
1476+
1477+
_, err = tree.Set([]byte("foo"), []byte("bar*"))
1478+
require.NoError(t, err)
1479+
}

nodedb.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,20 @@ func (ndb *nodeDB) GetNode(nk []byte) (*Node, error) {
159159
if err != nil {
160160
return nil, fmt.Errorf("can't get node %v: %v", nk, err)
161161
}
162+
if buf == nil && !isLegcyNode {
163+
// if the node is reformatted by pruning, check against (version, 0)
164+
nKey := GetNodeKey(nk)
165+
if nKey.nonce == 1 {
166+
nodeKey = ndb.nodeKey((&NodeKey{
167+
version: nKey.version,
168+
nonce: 0,
169+
}).GetKey())
170+
buf, err = ndb.db.Get(nodeKey)
171+
if err != nil {
172+
return nil, fmt.Errorf("can't get the reformatted node %v: %v", nk, err)
173+
}
174+
}
175+
}
162176
if buf == nil {
163177
return nil, fmt.Errorf("Value missing for key %v corresponding to nodeKey %x", nk, nodeKey)
164178
}

0 commit comments

Comments
 (0)