From cc1f1d3cb4a90d8966c5252a924609f5784d676e Mon Sep 17 00:00:00 2001 From: Robert Pirtle Date: Fri, 24 May 2024 10:30:07 -0700 Subject: [PATCH 1/3] feat: expose nodeDB's DeleteVersionsFrom method --- mutable_tree.go | 10 ++++++++++ mutable_tree_test.go | 29 ++++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/mutable_tree.go b/mutable_tree.go index 614979690..17498cc27 100644 --- a/mutable_tree.go +++ b/mutable_tree.go @@ -868,6 +868,16 @@ func (tree *MutableTree) DeleteVersionsTo(toVersion int64) error { return tree.ndb.Commit() } +// DeleteVersionsFrom removes from the given version upwards from the MutableTree. +// It will not block the SaveVersion() call, instead it will be queued and executed deferred. +func (tree *MutableTree) DeleteVersionsFrom(fromVersion int64) error { + if err := tree.ndb.DeleteVersionsFrom(fromVersion); err != nil { + return err + } + + return tree.ndb.Commit() +} + // Rotate right and return the new node and orphan. func (tree *MutableTree) rotateRight(node *Node) (*Node, error) { var err error diff --git a/mutable_tree_test.go b/mutable_tree_test.go index 6e58843ff..523ba199a 100644 --- a/mutable_tree_test.go +++ b/mutable_tree_test.go @@ -112,7 +112,7 @@ func TestNewIteratorConcurrency(t *testing.T) { } } -func TestDelete(t *testing.T) { +func TestDeleteVersionsTo(t *testing.T) { tree := setupMutableTree(false) _, err := tree.set([]byte("k1"), []byte("Fred")) @@ -133,6 +133,33 @@ func TestDelete(t *testing.T) { require.Equal(t, 0, bytes.Compare([]byte("Fred"), proof.GetExist().Value)) } +func TestDeleteVersionsFrom(t *testing.T) { + tree := setupMutableTree(false) + + _, err := tree.set([]byte("k1"), []byte("Wilma")) + require.NoError(t, err) + _, version, err := tree.SaveVersion() + require.NoError(t, err) + _, _, err = tree.SaveVersion() + require.NoError(t, err) + _, _, err = tree.SaveVersion() + require.NoError(t, err) + + require.NoError(t, tree.DeleteVersionsFrom(version+1)) + + proof, err := tree.GetVersionedProof([]byte("k1"), version) + require.Nil(t, err) + require.Equal(t, 0, bytes.Compare([]byte("Wilma"), proof.GetExist().Value)) + + proof, err = tree.GetVersionedProof([]byte("k1"), version+1) + require.EqualError(t, err, ErrVersionDoesNotExist.Error()) + require.Nil(t, proof) + + proof, err = tree.GetVersionedProof([]byte("k1"), version+2) + require.EqualError(t, err, ErrVersionDoesNotExist.Error()) + require.Nil(t, proof) +} + func TestGetRemove(t *testing.T) { require := require.New(t) tree := setupMutableTree(false) From 7908810e3364094a89513cab6caabd0402fec26c Mon Sep 17 00:00:00 2001 From: Robert Pirtle Date: Wed, 29 May 2024 12:06:28 -0700 Subject: [PATCH 2/3] rebase & update changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5adc9e76..00a9f2ec5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## Unreleased + +### Improvements +- [#952](https://github.com/cosmos/iavl/pull/952) Add `DeleteVersionsFrom(int64)` API. + ## v1.2.0 May 13, 2024 ### Improvements From c628e7034097b62761818afd00ce86fea4a04a81 Mon Sep 17 00:00:00 2001 From: Robert Pirtle Date: Wed, 29 May 2024 16:19:13 -0700 Subject: [PATCH 3/3] fix changelog whitespace --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00a9f2ec5..72144bd98 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Unreleased ### Improvements + - [#952](https://github.com/cosmos/iavl/pull/952) Add `DeleteVersionsFrom(int64)` API. ## v1.2.0 May 13, 2024