diff --git a/store/iavlstore.go b/store/iavlstore.go index 2911598033..16fb8e4f04 100644 --- a/store/iavlstore.go +++ b/store/iavlstore.go @@ -15,7 +15,8 @@ import ( const ( defaultIAVLCacheSize = 10000 - defaultIAVLNumHistory = 1<<53 - 1 // DEPRECATED + defaultIAVLNumRecent = 1000 + defaultIAVLStoreEvery = 10000 ) // load the iavl store @@ -25,7 +26,7 @@ func LoadIAVLStore(db dbm.DB, id CommitID) (CommitStore, error) { if err != nil { return nil, err } - store := newIAVLStore(tree, defaultIAVLNumHistory) + store := newIAVLStore(tree, defaultIAVLNumRecent, defaultIAVLStoreEvery) return store, nil } @@ -43,16 +44,17 @@ type iavlStore struct { // How many old versions we hold onto. // A value of 0 means keep all history. - numHistory int64 + numRecent int64 + + storeEvery int64 } // CONTRACT: tree should be fully loaded. -// TODO: use more numHistory's, so the below nolint can be removed -// nolint: unparam -func newIAVLStore(tree *iavl.VersionedTree, numHistory int64) *iavlStore { +func newIAVLStore(tree *iavl.VersionedTree, numRecent int64, storeEvery int64) *iavlStore { st := &iavlStore{ tree: tree, - numHistory: numHistory, + numRecent: numRecent, + storeEvery: storeEvery, } return st } @@ -67,13 +69,14 @@ func (st *iavlStore) Commit() CommitID { panic(err) } - // Release an old version of history - if st.numHistory > 0 && (st.numHistory < st.tree.Version64()) { - toRelease := version - st.numHistory - err := st.tree.DeleteVersion(toRelease) - if err != nil { - // TODO: Handle with #870 - panic(err) + // Release an old version of history, if not a sync waypoint + if st.numRecent < st.tree.Version64() { + toRelease := version - st.numRecent + if toRelease%st.storeEvery != 0 { + err := st.tree.DeleteVersion(toRelease) + if err != nil { + panic(err) + } } } diff --git a/store/iavlstore_test.go b/store/iavlstore_test.go index 50d690d908..adae84f1ab 100644 --- a/store/iavlstore_test.go +++ b/store/iavlstore_test.go @@ -15,7 +15,8 @@ import ( var ( cacheSize = 100 - numHistory int64 = 5 + numRecent int64 = 5 + storeEvery int64 = 3 ) var ( @@ -45,7 +46,7 @@ func newTree(t *testing.T, db dbm.DB) (*iavl.VersionedTree, CommitID) { func TestIAVLStoreGetSetHasDelete(t *testing.T) { db := dbm.NewMemDB() tree, _ := newTree(t, db) - iavlStore := newIAVLStore(tree, numHistory) + iavlStore := newIAVLStore(tree, numRecent, storeEvery) key := "hello" @@ -70,7 +71,7 @@ func TestIAVLStoreGetSetHasDelete(t *testing.T) { func TestIAVLIterator(t *testing.T) { db := dbm.NewMemDB() tree, _ := newTree(t, db) - iavlStore := newIAVLStore(tree, numHistory) + iavlStore := newIAVLStore(tree, numRecent, storeEvery) iter := iavlStore.Iterator([]byte("aloha"), []byte("hellz")) expected := []string{"aloha", "hello"} var i int @@ -143,7 +144,7 @@ func TestIAVLIterator(t *testing.T) { func TestIAVLSubspaceIterator(t *testing.T) { db := dbm.NewMemDB() tree, _ := newTree(t, db) - iavlStore := newIAVLStore(tree, numHistory) + iavlStore := newIAVLStore(tree, numRecent, storeEvery) iavlStore.Set([]byte("test1"), []byte("test1")) iavlStore.Set([]byte("test2"), []byte("test2")) @@ -202,7 +203,7 @@ func TestIAVLSubspaceIterator(t *testing.T) { func TestIAVLReverseSubspaceIterator(t *testing.T) { db := dbm.NewMemDB() tree, _ := newTree(t, db) - iavlStore := newIAVLStore(tree, numHistory) + iavlStore := newIAVLStore(tree, numRecent, storeEvery) iavlStore.Set([]byte("test1"), []byte("test1")) iavlStore.Set([]byte("test2"), []byte("test2")) @@ -261,7 +262,7 @@ func TestIAVLReverseSubspaceIterator(t *testing.T) { func TestIAVLStoreQuery(t *testing.T) { db := dbm.NewMemDB() tree := iavl.NewVersionedTree(db, cacheSize) - iavlStore := newIAVLStore(tree, numHistory) + iavlStore := newIAVLStore(tree, numRecent, storeEvery) k1, v1 := []byte("key1"), []byte("val1") k2, v2 := []byte("key2"), []byte("val2") diff --git a/store/prefixstore_test.go b/store/prefixstore_test.go index f57ab20e40..1961bb4bb0 100644 --- a/store/prefixstore_test.go +++ b/store/prefixstore_test.go @@ -66,7 +66,7 @@ func testPrefixStore(t *testing.T, baseStore KVStore, prefix []byte) { func TestIAVLStorePrefix(t *testing.T) { db := dbm.NewMemDB() tree := iavl.NewVersionedTree(db, cacheSize) - iavlStore := newIAVLStore(tree, numHistory) + iavlStore := newIAVLStore(tree, numRecent, storeEvery) testPrefixStore(t, iavlStore, []byte("test")) }