Skip to content

Commit d3ac274

Browse files
committed
fix tree test
1 parent 604c54a commit d3ac274

File tree

3 files changed

+34
-57
lines changed

3 files changed

+34
-57
lines changed

metrics/metrics.go

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ type TreeMetrics struct {
3030
TreeUpdate int64
3131
TreeNewNode int64
3232
TreeDelete int64
33+
TreeHash int64
3334
}
3435

3536
type DbMetrics struct {

tree.go

+3
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,9 @@ func (tree *Tree) deepHash(node *Node, depth int8) {
258258
}
259259
}
260260

261+
if node.hash == nil {
262+
tree.metrics.TreeHash++
263+
}
261264
node._hash()
262265

263266
// when heightFilter > 0 remove the leaf nodes from memory.

tree_test.go

+30-57
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
package iavl
44

55
import (
6-
"context"
76
"crypto/sha256"
87
"encoding/hex"
98
"fmt"
@@ -64,16 +63,19 @@ func testTreeBuild(t *testing.T, multiTree *MultiTree, opts *testutil.TreeBuildO
6463
workingSize int64
6564
writeLeaves int64
6665
writeTime time.Duration
66+
hashCount int64
6767
)
6868
for _, tr := range multiTree.Trees {
6969
m := tr.sql.metrics
7070
workingBytes += tr.workingBytes
7171
workingSize += tr.workingSize
7272
writeLeaves += m.WriteLeaves
7373
writeTime += m.WriteTime
74+
hashCount += tr.metrics.TreeHash
7475
m.WriteDurations = nil
7576
m.WriteLeaves = 0
7677
m.WriteTime = 0
78+
tr.metrics.TreeHash = 0
7779
}
7880
fmt.Printf("leaves=%s time=%s last=%s μ=%s version=%d work-size=%s work-bytes=%s %s\n",
7981
humanize.Comma(cnt),
@@ -86,11 +88,12 @@ func testTreeBuild(t *testing.T, multiTree *MultiTree, opts *testutil.TreeBuildO
8688
MemUsage())
8789

8890
if writeTime > 0 {
89-
fmt.Printf("writes: cnt=%s wr/s=%s dur/wr=%s dur=%s\n",
91+
fmt.Printf("writes: cnt=%s wr/s=%s dur/wr=%s dur=%s hashes=%s\n",
9092
humanize.Comma(writeLeaves),
9193
humanize.Comma(int64(float64(writeLeaves)/writeTime.Seconds())),
9294
time.Duration(int64(writeTime)/writeLeaves),
9395
writeTime.Round(time.Millisecond),
96+
humanize.Comma(hashCount),
9497
)
9598
}
9699

@@ -158,7 +161,6 @@ func TestTree_Hash(t *testing.T) {
158161
var err error
159162

160163
tmpDir := t.TempDir()
161-
//tmpDir := "/tmp/iavl-test"
162164
t.Logf("levelDb tmpDir: %s\n", tmpDir)
163165

164166
require.NoError(t, err)
@@ -187,8 +189,7 @@ func TestTree_Hash(t *testing.T) {
187189

188190
func TestTree_Build_Load(t *testing.T) {
189191
// build the initial version of the tree with periodic checkpoints
190-
//tmpDir := t.TempDir()
191-
tmpDir := "/tmp/iavl-v2-test"
192+
tmpDir := t.TempDir()
192193
opts := testutil.NewTreeBuildOptions().With10_000()
193194
multiTree := NewMultiTree(tmpDir, TreeOptions{CheckpointInterval: 4000, HeightFilter: 0, StateStorage: false})
194195
itrs, ok := opts.Iterator.(*bench.ChangesetIterators)
@@ -215,86 +216,58 @@ func TestTree_Build_Load(t *testing.T) {
215216
opts.UntilHash = "3a037f8dd67a5e1a9ef83a53b81c619c9ac0233abee6f34a400fb9b9dfbb4f8d"
216217
testTreeBuild(t, mt, opts)
217218
require.NoError(t, mt.Close())
218-
219-
t.Log("export the tree at version 12,000 and import it into a sql db in pre-order")
220-
traverseOrder := PreOrder
221-
restorePreOrderMt := NewMultiTree(t.TempDir(), TreeOptions{CheckpointInterval: 4000})
222-
for sk, tree := range multiTree.Trees {
223-
require.NoError(t, restorePreOrderMt.MountTree(sk))
224-
exporter := tree.Export(traverseOrder)
225-
226-
restoreTree := restorePreOrderMt.Trees[sk]
227-
_, err := restoreTree.sql.WriteSnapshot(context.Background(), tree.Version(), exporter.Next, SnapshotOptions{WriteCheckpoint: true, TraverseOrder: traverseOrder})
228-
require.NoError(t, err)
229-
require.NoError(t, restoreTree.LoadSnapshot(tree.Version(), traverseOrder))
230-
}
231-
require.NoError(t, restorePreOrderMt.Close())
232-
233-
t.Log("export the tree at version 12,000 and import it into a sql db in post-order")
234-
traverseOrder = PostOrder
235-
restorePostOrderMt := NewMultiTree(t.TempDir(), TreeOptions{CheckpointInterval: 4000})
236-
for sk, tree := range multiTree.Trees {
237-
require.NoError(t, restorePostOrderMt.MountTree(sk))
238-
exporter := tree.Export(traverseOrder)
239-
240-
restoreTree := restorePostOrderMt.Trees[sk]
241-
_, err := restoreTree.sql.WriteSnapshot(context.Background(), tree.Version(), exporter.Next, SnapshotOptions{WriteCheckpoint: true, TraverseOrder: traverseOrder})
242-
require.NoError(t, err)
243-
require.NoError(t, restoreTree.LoadSnapshot(tree.Version(), traverseOrder))
244-
}
245-
require.Equal(t, restorePostOrderMt.Hash(), restorePreOrderMt.Hash())
246-
247-
t.Log("build tree to version 20,000 and verify hash")
248-
require.NoError(t, opts.Iterator.Next())
249-
require.Equal(t, int64(12_001), opts.Iterator.Version())
250-
opts.Until = 20_000
251-
opts.UntilHash = "25907b193c697903218d92fa70a87ef6cdd6fa5b9162d955a4d70a9d5d2c4824"
252-
testTreeBuild(t, restorePostOrderMt, opts)
253-
require.NoError(t, restorePostOrderMt.Close())
254219
}
255220

256221
// pre-requisites for the 2 tests below:
257222
// $ go run ./cmd gen tree --db /tmp/iavl-v2 --limit 1 --type osmo-like-many
258223
// $ go run ./cmd snapshot --db /tmp/iavl-v2 --version 1
259224
// mkdir -p /tmp/osmo-like-many/v2 && go run ./cmd gen emit --start 2 --limit 5000 --type osmo-like-many --out /tmp/osmo-like-many/v2
260225
func TestOsmoLike_HotStart(t *testing.T) {
261-
tmpDir := "/tmp/iavl-v2"
262-
// logDir := "/tmp/osmo-like-many-v2"
263-
logDir := "/Users/mattk/src/scratch/osmo-like-many/v2"
226+
tmpDir := "/Users/mattk/.costor/iavl-v2"
227+
logDir := "/Users/mattk/src/devmos/osmo-like-many/v2"
228+
264229
pool := NewNodePool()
265-
multiTree, err := ImportMultiTree(pool, 1, tmpDir, TreeOptions{HeightFilter: 0, StateStorage: false})
230+
multiTree, err := ImportMultiTree(pool, 1, tmpDir, TreeOptions{
231+
HeightFilter: 0,
232+
StateStorage: false,
233+
CheckpointInterval: 1001,
234+
})
266235
require.NoError(t, err)
267236
require.NotNil(t, multiTree)
268237
opts := testutil.CompactedChangelogs(logDir)
269238
opts.SampleRate = 250_000
270239

271-
opts.Until = 1_000
272-
opts.UntilHash = "557663181d9ab97882ecfc6538e3b4cfe31cd805222fae905c4b4f4403ca5cda"
240+
// opts.Until = 1_000
241+
// opts.UntilHash = "557663181d9ab97882ecfc6538e3b4cfe31cd805222fae905c4b4f4403ca5cda"
242+
opts.Until = 500
243+
opts.UntilHash = "2670bd5767e70f2bf9e4f723b5f205759e39afdb5d8cfb6b54a4a3ecc27a1377"
273244

274245
testTreeBuild(t, multiTree, opts)
275246
}
276247

277248
func TestOsmoLike_ColdStart(t *testing.T) {
278-
tmpDir := "/tmp/iavl-v2"
249+
tmpDir := "/Users/mattk/.costor/iavl-v2"
250+
logDir := "/Users/mattk/src/devmos/osmo-like-many/v2"
279251

280252
treeOpts := DefaultTreeOptions()
281-
treeOpts.CheckpointInterval = -1
282-
treeOpts.CheckpointMemory = 1.5 * 1024 * 1024 * 1024
283-
treeOpts.StateStorage = false
253+
treeOpts.CheckpointInterval = 50
254+
// treeOpts.CheckpointMemory = 1.5 * 1024 * 1024 * 1024
255+
treeOpts.StateStorage = true
284256
treeOpts.HeightFilter = 1
285-
treeOpts.EvictionDepth = 16
257+
// treeOpts.EvictionDepth = 22
286258
treeOpts.MetricsProxy = newPrometheusMetricsProxy()
287259
multiTree := NewMultiTree(tmpDir, treeOpts)
288260
require.NoError(t, multiTree.MountTrees())
289261
require.NoError(t, multiTree.LoadVersion(1))
290-
// require.NoError(t, multiTree.WarmLeaves())
262+
require.NoError(t, multiTree.WarmLeaves())
291263

292-
// logDir := "/tmp/osmo-like-many-v2"
293-
opts := testutil.CompactedChangelogs("/Users/mattk/src/scratch/osmo-like-many/v2")
264+
opts := testutil.CompactedChangelogs(logDir)
294265
opts.SampleRate = 250_000
295266

296-
opts.Until = 1_000
297-
opts.UntilHash = "557663181d9ab97882ecfc6538e3b4cfe31cd805222fae905c4b4f4403ca5cda"
267+
// opts.Until = 1_000
268+
// opts.UntilHash = "557663181d9ab97882ecfc6538e3b4cfe31cd805222fae905c4b4f4403ca5cda"
269+
opts.Until = 500
270+
opts.UntilHash = "2670bd5767e70f2bf9e4f723b5f205759e39afdb5d8cfb6b54a4a3ecc27a1377"
298271

299272
testTreeBuild(t, multiTree, opts)
300273
}

0 commit comments

Comments
 (0)