Skip to content

Commit

Permalink
add minimal test case
Browse files Browse the repository at this point in the history
  • Loading branch information
erikgrinaker committed Jun 15, 2020
1 parent 3a06cec commit 60acfb1
Showing 1 changed file with 66 additions and 0 deletions.
66 changes: 66 additions & 0 deletions mutable_tree_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -332,3 +332,69 @@ func TestDeleteVersion_issue261(t *testing.T) {
// 9 is about to be created.
makeVersions(t, levelDB, 9, 4)
}

func TestDeleteVersion_issue261_minimal(t *testing.T) {
// Use the same on-disk database for all runs.
tempdir, err := ioutil.TempDir("", "iavl")
require.NoError(t, err)
defer os.RemoveAll(tempdir)

levelDB, err := db.NewGoLevelDB("leveldb", tempdir)
require.NoError(t, err)

// Create a new tree that persists data to disk every 2 versions. KeepRecent: 1 mirrors
// SDK behavior.
tree, err := NewMutableTreeWithOpts(levelDB, db.NewMemDB(), 0, &Options{
KeepEvery: 2,
KeepRecent: 1,
})
require.NoError(t, err)
version, err := tree.Load()
require.NoError(t, err)
require.EqualValues(t, 0, version)

// Write two versions, where the second is persisted to disk.
tree.Set([]byte{1}, []byte{1})
tree.Set([]byte{2}, []byte{2})
_, _, err = tree.SaveVersion()
require.NoError(t, err)

tree.Set([]byte{3}, []byte{3})
tree.Set([]byte{4}, []byte{4})
_, version, err = tree.SaveVersion()
require.NoError(t, err)

// Now, make a single version that is only persisted in memory. This will cause the previous
// node to become orphaned, and the orphaning incorrectly persisted to disk.
tree.Set([]byte{4}, []byte{0})
_, _, err = tree.SaveVersion()
require.NoError(t, err)

// Close the tree, and set up a new one which loads the persisted version 2.
tree, err = NewMutableTreeWithOpts(levelDB, db.NewMemDB(), 0, &Options{
KeepEvery: 2,
KeepRecent: 1,
})
require.NoError(t, err)
version, err = tree.Load()
require.NoError(t, err)
require.EqualValues(t, 2, version)

// If we now write two other versions, which do not touch the branch of key 4, and then
// delete version 2 (following SDK behavior), this will cause key 4 to go missing because the
// incorrect orphan written during in-memory version 3 has scheduled it for deletion, even
// though the change that caused it to be orphaned now hasn't happened.
tree.Set([]byte{1}, []byte{0})
_, _, err = tree.SaveVersion()
require.NoError(t, err)

tree.Set([]byte{2}, []byte{0})
_, _, err = tree.SaveVersion()
require.NoError(t, err)

err = tree.DeleteVersion(2)
require.NoError(t, err)

v, _ := tree.Get([]byte{4})
assert.Equal(t, []byte{4}, v)
}

0 comments on commit 60acfb1

Please sign in to comment.