From 533941daa843b64495fe123e8b768eb5fc6a956a Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Fri, 10 Jan 2025 17:43:01 +0100 Subject: [PATCH 1/4] refactor(v2): use non global logger --- v2/logger.go | 34 +++++++++++++++++++++++++ v2/multitree.go | 2 +- v2/snapshot.go | 37 ++++++++++++++-------------- v2/sqlite.go | 60 +++++++++++++++++++++++++-------------------- v2/sqlite_batch.go | 11 ++++----- v2/sqlite_test.go | 10 ++++---- v2/sqlite_writer.go | 46 +++++++++++++++++----------------- v2/tree.go | 12 --------- 8 files changed, 119 insertions(+), 93 deletions(-) create mode 100644 v2/logger.go diff --git a/v2/logger.go b/v2/logger.go new file mode 100644 index 000000000..2a66a7752 --- /dev/null +++ b/v2/logger.go @@ -0,0 +1,34 @@ +package iavl + +// Logger defines basic logger that IAVL expects. +// It is a subset of the cosmossdk.io/core/log.Logger interface. +// cosmossdk.io/log/log.Logger implements this interface. +type Logger interface { + // Info takes a message and a set of key/value pairs and logs with level INFO. + // The key of the tuple must be a string. + Info(msg string, keyVals ...any) + + // Warn takes a message and a set of key/value pairs and logs with level WARN. + // The key of the tuple must be a string. + Warn(msg string, keyVals ...any) + + // Error takes a message and a set of key/value pairs and logs with level ERR. + // The key of the tuple must be a string. + Error(msg string, keyVals ...any) + + // Debug takes a message and a set of key/value pairs and logs with level DEBUG. + // The key of the tuple must be a string. + Debug(msg string, keyVals ...any) +} + +// NewNopLogger returns a new logger that does nothing. +func NewNopLogger() Logger { + return &noopLogger{} +} + +type noopLogger struct{} + +func (l *noopLogger) Info(string, ...any) {} +func (l *noopLogger) Warn(string, ...any) {} +func (l *noopLogger) Error(string, ...any) {} +func (l *noopLogger) Debug(string, ...any) {} diff --git a/v2/multitree.go b/v2/multitree.go index ccfbcd4c9..c6d809588 100644 --- a/v2/multitree.go +++ b/v2/multitree.go @@ -9,6 +9,7 @@ import ( "github.com/cosmos/iavl/v2/metrics" "github.com/dustin/go-humanize" + "github.com/rs/zerolog/log" "golang.org/x/exp/slices" ) @@ -108,7 +109,6 @@ func (mt *MultiTree) MountTrees() error { prefix := filepath.Base(dbPath) sqlOpts := defaultSqliteDbOptions(SqliteDbOptions{}) sqlOpts.Path = dbPath - log.Info().Msgf("mounting %s; opts %v", prefix, sqlOpts) sql, err := NewSqliteDb(mt.pool, sqlOpts) if err != nil { return err diff --git a/v2/snapshot.go b/v2/snapshot.go index 861a95a8a..303a030f7 100644 --- a/v2/snapshot.go +++ b/v2/snapshot.go @@ -14,7 +14,6 @@ import ( "github.com/dustin/go-humanize" api "github.com/kocubinski/costor-api" "github.com/kocubinski/costor-api/logz" - "github.com/rs/zerolog" ) type sqliteSnapshot struct { @@ -35,7 +34,7 @@ type sqliteSnapshot struct { version int64 getLeft func(*Node) *Node getRight func(*Node) *Node - log zerolog.Logger + log Logger } func (sql *SqliteDb) Snapshot(ctx context.Context, tree *Tree) error { @@ -51,7 +50,7 @@ func (sql *SqliteDb) Snapshot(ctx context.Context, tree *Tree) error { sql: sql, batchSize: 200_000, version: version, - log: log.With().Str("path", filepath.Base(sql.opts.Path)).Logger(), + log: sql.logger, getLeft: func(node *Node) *Node { return node.left(tree) }, @@ -68,7 +67,7 @@ func (sql *SqliteDb) Snapshot(ctx context.Context, tree *Tree) error { if err = snapshot.flush(); err != nil { return err } - log.Info().Str("path", sql.opts.Path).Msgf("creating index on snapshot_%d", version) + sql.logger.Info(fmt.Sprintf("creating index on snapshot_%d", version), "path", sql.opts.Path) err = sql.leafWrite.Exec(fmt.Sprintf("CREATE INDEX snapshot_%d_idx ON snapshot_%d (ordinal);", version, version)) return err } @@ -89,11 +88,11 @@ func NewIngestSnapshotConnection(snapshotDbPath string) (*sqlite3.Conn, error) { } pageSize := os.Getpagesize() if newDb { - log.Info().Msgf("setting page size to %s", humanize.Bytes(uint64(pageSize))) err = conn.Exec(fmt.Sprintf("PRAGMA page_size=%d; VACUUM;", pageSize)) if err != nil { return nil, err } + err = conn.Exec("PRAGMA journal_mode=WAL;") if err != nil { return nil, err @@ -243,7 +242,7 @@ func (sql *SqliteDb) WriteSnapshot( batchSize: 400_000, version: version, lastWrite: time.Now(), - log: log.With().Str("path", filepath.Base(sql.opts.Path)).Logger(), + log: sql.logger, writeTree: true, } if opts.WriteCheckpoint { @@ -277,7 +276,7 @@ func (sql *SqliteDb) WriteSnapshot( return nil, err } - var versions []int64 + var versions []int64 // where is this used? for v := range uniqueVersions { versions = append(versions, v) } @@ -286,7 +285,7 @@ func (sql *SqliteDb) WriteSnapshot( return nil, err } - log.Info().Str("path", sql.opts.Path).Msg("creating table indexes") + sql.logger.Info("creating table indexes") err = sql.leafWrite.Exec(fmt.Sprintf("CREATE INDEX snapshot_%d_idx ON snapshot_%d (ordinal);", version, version)) if err != nil { return nil, err @@ -329,7 +328,7 @@ func (sql *SqliteDb) ImportSnapshotFromTable(version int64, traverseOrder Traver defer func(q *sqlite3.Stmt) { err = q.Close() if err != nil { - log.Error().Err(err).Msg("error closing import query") + sql.logger.Error("error closing import query", "error", err) } }(q) @@ -338,7 +337,7 @@ func (sql *SqliteDb) ImportSnapshotFromTable(version int64, traverseOrder Traver pool: sql.pool, loadLeaves: loadLeaves, since: time.Now(), - log: log.With().Str("path", sql.opts.Path).Logger(), + log: sql.logger, } var root *Node if traverseOrder == PostOrder { @@ -372,7 +371,7 @@ func (sql *SqliteDb) ImportMostRecentSnapshot(targetVersion int64, traverseOrder defer func(q *sqlite3.Stmt) { err = q.Close() if err != nil { - log.Error().Err(err).Msg("error closing import query") + sql.logger.Error("error closing import query", "error", err) } }(q) if err != nil { @@ -474,7 +473,7 @@ func (snap *sqliteSnapshot) writeStep(node *Node) error { func (snap *sqliteSnapshot) flush() error { select { case <-snap.ctx.Done(): - snap.log.Info().Msgf("snapshot cancelled at ordinal=%s", humanize.Comma(int64(snap.ordinal))) + snap.log.Info(fmt.Sprintf("snapshot cancelled at ordinal=%s", humanize.Comma(int64(snap.ordinal)))) errs := errors.Join( snap.snapshotInsert.Reset(), snap.snapshotInsert.Close(), @@ -510,12 +509,12 @@ func (snap *sqliteSnapshot) flush() error { default: } - snap.log.Info().Msgf("flush total=%s size=%s dur=%s wr/s=%s", + snap.log.Info(fmt.Sprintf("flush total=%s size=%s dur=%s wr/s=%s", humanize.Comma(int64(snap.ordinal)), humanize.Comma(int64(snap.batchSize)), time.Since(snap.lastWrite).Round(time.Millisecond), humanize.Comma(int64(float64(snap.batchSize)/time.Since(snap.lastWrite).Seconds())), - ) + )) err := errors.Join( snap.sql.leafWrite.Commit(), @@ -745,16 +744,16 @@ type sqliteImport struct { i int64 since time.Time - log zerolog.Logger + log Logger } func (sqlImport *sqliteImport) queryStepPreOrder() (node *Node, err error) { sqlImport.i++ if sqlImport.i%1_000_000 == 0 { - sqlImport.log.Debug().Msgf("import: nodes=%s, node/s=%s", + sqlImport.log.Debug(fmt.Sprintf("import: nodes=%s, node/s=%s", humanize.Comma(sqlImport.i), humanize.Comma(int64(float64(1_000_000)/time.Since(sqlImport.since).Seconds())), - ) + )) sqlImport.since = time.Now() } @@ -799,10 +798,10 @@ func (sqlImport *sqliteImport) queryStepPreOrder() (node *Node, err error) { func (sqlImport *sqliteImport) queryStepPostOrder() (node *Node, err error) { sqlImport.i++ if sqlImport.i%1_000_000 == 0 { - sqlImport.log.Debug().Msgf("import: nodes=%s, node/s=%s", + sqlImport.log.Debug(fmt.Sprintf("import: nodes=%s, node/s=%s", humanize.Comma(sqlImport.i), humanize.Comma(int64(float64(1_000_000)/time.Since(sqlImport.since).Seconds())), - ) + )) sqlImport.since = time.Now() } diff --git a/v2/sqlite.go b/v2/sqlite.go index 7aef44576..3db493dd7 100644 --- a/v2/sqlite.go +++ b/v2/sqlite.go @@ -12,7 +12,6 @@ import ( "github.com/cosmos/iavl/v2/metrics" "github.com/dustin/go-humanize" api "github.com/kocubinski/costor-api" - "github.com/rs/zerolog" ) const defaultSQLitePath = "/tmp/iavl-v2" @@ -26,6 +25,8 @@ type SqliteDbOptions struct { ConnArgs string ShardTrees bool + Logger Logger + walPages int } @@ -51,7 +52,7 @@ type SqliteDb struct { shardQueries map[int64]*sqlite3.Stmt metrics *metrics.DbMetrics - logger zerolog.Logger + logger Logger } func defaultSqliteDbOptions(opts SqliteDbOptions) SqliteDbOptions { @@ -65,6 +66,9 @@ func defaultSqliteDbOptions(opts SqliteDbOptions) SqliteDbOptions { opts.WalSize = 1024 * 1024 * 100 } opts.walPages = opts.WalSize / os.Getpagesize() + + opts.Logger = NewNopLogger() + return opts } @@ -84,9 +88,8 @@ func (opts SqliteDbOptions) treeConnectionString() string { } func (opts SqliteDbOptions) EstimateMmapSize() (uint64, error) { - logger := log.With().Str("path", opts.Path).Logger() - logger.Info().Msgf("calculate mmap size") - logger.Info().Msgf("leaf connection string: %s", opts.leafConnectionString()) + opts.Logger.Info("calculate mmap size") + opts.Logger.Info(fmt.Sprintf("leaf connection string: %s", opts.leafConnectionString())) conn, err := sqlite3.Open(opts.leafConnectionString()) if err != nil { return 0, err @@ -114,7 +117,7 @@ func (opts SqliteDbOptions) EstimateMmapSize() (uint64, error) { return 0, err } mmapSize := uint64(float64(leafSize) * 1.3) - logger.Info().Msgf("leaf mmap size: %s", humanize.Bytes(mmapSize)) + opts.Logger.Info(fmt.Sprintf("leaf mmap size: %s", humanize.Bytes(mmapSize))) return mmapSize, nil } @@ -126,7 +129,6 @@ func NewInMemorySqliteDb(pool *NodePool) (*SqliteDb, error) { func NewSqliteDb(pool *NodePool, opts SqliteDbOptions) (*SqliteDb, error) { opts = defaultSqliteDbOptions(opts) - logger := log.With().Str("module", "sqlite").Str("path", opts.Path).Logger() sql := &SqliteDb{ shards: &VersionRange{}, shardQueries: make(map[int64]*sqlite3.Stmt), @@ -134,7 +136,7 @@ func NewSqliteDb(pool *NodePool, opts SqliteDbOptions) (*SqliteDb, error) { opts: opts, pool: pool, metrics: &metrics.DbMetrics{}, - logger: logger, + logger: opts.Logger, } if !api.IsFileExistent(opts.Path) { @@ -180,7 +182,7 @@ CREATE TABLE root ( } pageSize := os.Getpagesize() - log.Info().Msgf("setting page size to %s", humanize.Bytes(uint64(pageSize))) + sql.logger.Info(fmt.Sprintf("setting page size to %s", humanize.Bytes(uint64(pageSize)))) err = sql.treeWrite.Exec(fmt.Sprintf("PRAGMA page_size=%d; VACUUM;", pageSize)) if err != nil { return err @@ -210,7 +212,7 @@ CREATE INDEX leaf_orphan_idx ON leaf_orphan (at);`) } pageSize := os.Getpagesize() - log.Info().Msgf("setting page size to %s", humanize.Bytes(uint64(pageSize))) + sql.logger.Info(fmt.Sprintf("setting page size to %s", humanize.Bytes(uint64(pageSize)))) err = sql.leafWrite.Exec(fmt.Sprintf("PRAGMA page_size=%d; VACUUM;", pageSize)) if err != nil { return err @@ -430,7 +432,7 @@ func (sql *SqliteDb) nextShard(version int64) (int64, error) { } } - sql.logger.Info().Msgf("creating shard %d", version) + sql.logger.Info(fmt.Sprintf("creating shard %d", version)) err := sql.treeWrite.Exec(fmt.Sprintf("CREATE TABLE tree_%d (version int, sequence int, bytes blob, orphaned bool);", version)) if err != nil { return version, err @@ -598,7 +600,7 @@ func (sql *SqliteDb) getShardQuery(version int64) (*sqlite3.Stmt, error) { return nil, err } sql.shardQueries[v] = q - sql.logger.Debug().Msgf("added shard query: %s", sqlQuery) + sql.logger.Debug(fmt.Sprintf("added shard query: %s", sqlQuery)) return q, nil } @@ -676,7 +678,7 @@ func (sql *SqliteDb) WarmLeaves() error { return err } if cnt%5_000_000 == 0 { - sql.logger.Info().Msgf("warmed %s leaves", humanize.Comma(cnt)) + sql.logger.Info(fmt.Sprintf("warmed %s leaves", humanize.Comma(cnt))) } } if err = stmt.Close(); err != nil { @@ -700,11 +702,11 @@ func (sql *SqliteDb) WarmLeaves() error { return err } if cnt%5_000_000 == 0 { - sql.logger.Info().Msgf("warmed %s leaves", humanize.Comma(cnt)) + sql.logger.Info(fmt.Sprintf("warmed %s leaves", humanize.Comma(cnt))) } } - sql.logger.Info().Msgf("warmed %s leaves in %s", humanize.Comma(cnt), time.Since(start)) + sql.logger.Info(fmt.Sprintf("warmed %s leaves in %s", humanize.Comma(cnt), time.Since(start))) return stmt.Close() } @@ -863,7 +865,7 @@ func (sql *SqliteDb) GetLatestLeaf(key []byte) ([]byte, error) { func (sql *SqliteDb) closeHangingIterators() error { for idx, stmt := range sql.iterators { - sql.logger.Warn().Msgf("closing hanging iterator idx=%d", idx) + sql.logger.Warn(fmt.Sprintf("closing hanging iterator idx=%d", idx)) if err := stmt.Close(); err != nil { return err } @@ -941,20 +943,20 @@ func (sql *SqliteDb) replayChangelog(tree *Tree, toVersion int64, targetHash []b key []byte count int64 start = time.Now() - lg = log.With().Str("path", sql.opts.Path).Logger() since = time.Now() + logPath = []interface{}{"path", sql.opts.Path} ) tree.isReplaying = true defer func() { tree.isReplaying = false }() - lg.Info().Msgf("ensure leaf_delete_index exists...") + sql.opts.Logger.Info("ensure leaf_delete_index exists...", logPath...) if err := sql.leafWrite.Exec("CREATE UNIQUE INDEX IF NOT EXISTS leaf_delete_idx ON leaf_delete (version, sequence)"); err != nil { return err } - lg.Info().Msg("...done") - lg.Info().Msgf("replaying changelog from=%d to=%d", tree.version, toVersion) + sql.opts.Logger.Info("...done", logPath...) + sql.opts.Logger.Info(fmt.Sprintf("replaying changelog from=%d to=%d", tree.version, toVersion), logPath...) conn, err := sql.getReadConn() if err != nil { return err @@ -1015,8 +1017,8 @@ func (sql *SqliteDb) replayChangelog(tree *Tree, toVersion int64, targetHash []b } } if count%250_000 == 0 { - lg.Info().Msgf("replayed changelog to version=%d count=%s node/s=%s", - version, humanize.Comma(count), humanize.Comma(int64(250_000/time.Since(since).Seconds()))) + sql.opts.Logger.Info(fmt.Sprintf("replayed changelog to version=%d count=%s node/s=%s", + version, humanize.Comma(count), humanize.Comma(int64(250_000/time.Since(since).Seconds()))), logPath) since = time.Now() } } @@ -1027,8 +1029,8 @@ func (sql *SqliteDb) replayChangelog(tree *Tree, toVersion int64, targetHash []b tree.leaves, tree.branches, tree.leafOrphans, tree.deletes = nil, nil, nil, nil tree.sequence = 0 tree.version = toVersion - lg.Info().Msgf("replayed changelog to version=%d count=%s dur=%s root=%v", - tree.version, humanize.Comma(count), time.Since(start).Round(time.Millisecond), tree.root) + sql.opts.Logger.Info(fmt.Sprintf("replayed changelog to version=%d count=%s dur=%s root=%v", + tree.version, humanize.Comma(count), time.Since(start).Round(time.Millisecond), tree.root), logPath) return q.Close() } @@ -1038,7 +1040,7 @@ func (sql *SqliteDb) WriteLatestLeaves(tree *Tree) (err error) { batchSize = 200_000 count = 0 step func(node *Node) error - lg = log.With().Str("path", sql.opts.Path).Logger() + logPath = []string{"path", sql.opts.Path} latestInsert *sqlite3.Stmt ) prepare := func() error { @@ -1065,11 +1067,11 @@ func (sql *SqliteDb) WriteLatestLeaves(tree *Tree) (err error) { } else { rate = "n/a" } - lg.Info().Msgf("latest flush; count=%s dur=%s wr/s=%s", + sql.logger.Info(fmt.Sprintf("latest flush; count=%s dur=%s wr/s=%s", humanize.Comma(int64(count)), time.Since(since).Round(time.Millisecond), rate, - ) + ), logPath) since = time.Now() return nil } @@ -1118,3 +1120,7 @@ func (sql *SqliteDb) WriteLatestLeaves(tree *Tree) (err error) { return latestInsert.Close() } + +func (sql *SqliteDb) Logger() Logger { + return sql.logger +} diff --git a/v2/sqlite_batch.go b/v2/sqlite_batch.go index 304ca44fd..743ed9b71 100644 --- a/v2/sqlite_batch.go +++ b/v2/sqlite_batch.go @@ -6,14 +6,13 @@ import ( "github.com/bvinc/go-sqlite-lite/sqlite3" "github.com/dustin/go-humanize" - "github.com/rs/zerolog" ) type sqliteBatch struct { tree *Tree sql *SqliteDb size int64 - logger zerolog.Logger + logger Logger treeCount int64 treeSince time.Time @@ -126,11 +125,11 @@ func (b *sqliteBatch) treeBatchCommit() error { if batchSize == 0 { batchSize = b.size } - b.logger.Debug().Msgf("db=tree count=%s dur=%s batch=%d rate=%s", + b.logger.Debug(fmt.Sprintf("db=tree count=%s dur=%s batch=%d rate=%s", humanize.Comma(b.treeCount), time.Since(b.treeSince).Round(time.Millisecond), batchSize, - humanize.Comma(int64(float64(batchSize)/time.Since(b.treeSince).Seconds()))) + humanize.Comma(int64(float64(batchSize)/time.Since(b.treeSince).Seconds())))) } return nil } @@ -245,8 +244,8 @@ func (b *sqliteBatch) saveBranches() (n int64, err error) { if err != nil { return 0, err } - b.logger.Debug().Msgf("checkpoint db=tree version=%d shard=%d orphans=%s", - tree.version, shardID, humanize.Comma(int64(len(tree.branchOrphans)))) + b.logger.Debug(fmt.Sprintf("checkpoint db=tree version=%d shard=%d orphans=%s", + tree.version, shardID, humanize.Comma(int64(len(tree.branchOrphans))))) if err = b.newTreeBatch(shardID); err != nil { return 0, err diff --git a/v2/sqlite_test.go b/v2/sqlite_test.go index 1468e6868..9906ae88d 100644 --- a/v2/sqlite_test.go +++ b/v2/sqlite_test.go @@ -123,7 +123,7 @@ func TestBuildSqlite(t *testing.T) { //stmt, err = newBatch() //require.NoError(t, err) require.NoError(t, sql.leafWrite.Begin()) - log.Info().Msgf("nodes=%s dur=%s; rate=%s", + t.Logf("nodes=%s dur=%s; rate=%s", humanize.Comma(int64(count)), time.Since(since).Round(time.Millisecond), humanize.Comma(int64(float64(batchSize)/time.Since(since).Seconds()))) @@ -133,9 +133,9 @@ func TestBuildSqlite(t *testing.T) { require.NoError(t, err) } - log.Info().Msg("final commit") + t.Log("final commit") require.NoError(t, sql.leafWrite.Commit()) - log.Info().Msgf("total dur=%s rate=%s", + t.Logf("total dur=%s rate=%s", time.Since(startTime).Round(time.Millisecond), humanize.Comma(int64(40_000_000/time.Since(startTime).Seconds())), ) @@ -172,7 +172,7 @@ func TestReadSqlite_Trie(t *testing.T) { if i%100_000 == 0 { i++ - log.Info().Msgf("nodes=%s dur=%s; rate=%s", + t.Logf("nodes=%s dur=%s; rate=%s", humanize.Comma(i), time.Since(since), humanize.Comma(int64(float64(100_000)/time.Since(since).Seconds()))) @@ -228,7 +228,7 @@ func TestReadSqlite(t *testing.T) { require.NoError(t, stmt.Scan(&hash, &key, &height, &size, &lSeq, &lVersion, &rSeq, &rVersion)) if i%100_000 == 0 { - log.Info().Msgf("nodes=%s dur=%s; rate=%s", + t.Logf("nodes=%s dur=%s; rate=%s", humanize.Comma(int64(i)), time.Since(since), humanize.Comma(int64(float64(100_000)/time.Since(since).Seconds()))) diff --git a/v2/sqlite_writer.go b/v2/sqlite_writer.go index 0a49b1055..218b1c279 100644 --- a/v2/sqlite_writer.go +++ b/v2/sqlite_writer.go @@ -8,7 +8,6 @@ import ( "github.com/bvinc/go-sqlite-lite/sqlite3" "github.com/dustin/go-humanize" - "github.com/rs/zerolog" ) type pruneSignal struct { @@ -30,7 +29,7 @@ type saveResult struct { type sqlWriter struct { sql *SqliteDb - logger zerolog.Logger + logger Logger treePruneCh chan *pruneSignal treeCh chan *saveSignal @@ -44,13 +43,13 @@ type sqlWriter struct { func (sql *SqliteDb) newSQLWriter() *sqlWriter { return &sqlWriter{ sql: sql, + logger: sql.logger, leafPruneCh: make(chan *pruneSignal), treePruneCh: make(chan *pruneSignal), leafCh: make(chan *saveSignal), treeCh: make(chan *saveSignal), leafResult: make(chan *saveResult), treeResult: make(chan *saveResult), - logger: sql.logger.With().Str("module", "write").Logger(), } } @@ -58,13 +57,13 @@ func (w *sqlWriter) start(ctx context.Context) { go func() { err := w.treeLoop(ctx) if err != nil { - w.logger.Fatal().Err(err).Msg("tree loop failed") + w.logger.Error("tree loop failed", "error", err) } }() go func() { err := w.leafLoop(ctx) if err != nil { - w.logger.Fatal().Err(err).Msg("leaf loop failed") + w.logger.Error("leaf loop failed", "error", err) } }() } @@ -109,14 +108,14 @@ func (w *sqlWriter) leafLoop(ctx context.Context) error { // startPruningVersion = 50; do nothing pruneTo := checkpoints.FindPrevious(startPruningVersion) if pruneTo == -1 { - w.logger.Debug().Msgf("skipping leaf prune: requested prune version %d < first checkpoint", startPruningVersion) + w.logger.Debug(fmt.Sprintf("skipping leaf prune: requested prune version %d < first checkpoint", startPruningVersion)) return nil } pruneVersion = pruneTo pruneCount = 0 pruneStartTime = time.Now() - w.logger.Debug().Msgf("leaf prune starting requested=%d pruneTo=%d", startPruningVersion, pruneTo) + w.logger.Debug(fmt.Sprintf("leaf prune starting requested=%d pruneTo=%d", startPruningVersion, pruneTo)) if err = beginPruneBatch(pruneVersion); err != nil { return err } @@ -130,7 +129,7 @@ func (w *sqlWriter) leafLoop(ctx context.Context) error { if err = w.sql.leafWrite.Commit(); err != nil { return err } - w.logger.Debug().Msgf("commit leaf prune count=%s", humanize.Comma(pruneCount)) + w.logger.Debug(fmt.Sprintf("commit leaf prune count=%s", humanize.Comma(pruneCount))) if err = w.sql.leafWrite.Exec("PRAGMA wal_checkpoint(RESTART)"); err != nil { return fmt.Errorf("failed to checkpoint; %w", err) } @@ -182,11 +181,11 @@ func (w *sqlWriter) leafLoop(ctx context.Context) error { if err != nil { return fmt.Errorf("failed to prune leaf_delete; %w", err) } - w.logger.Debug().Msgf("done leaf prune count=%s dur=%s to=%d", + w.logger.Debug(fmt.Sprintf("done leaf prune count=%s dur=%s to=%d", humanize.Comma(pruneCount), time.Since(pruneStartTime).Round(time.Millisecond), pruneVersion, - ) + )) if nextPruneVersion != 0 { if err = startPrune(nextPruneVersion); err != nil { return err @@ -204,7 +203,7 @@ func (w *sqlWriter) leafLoop(ctx context.Context) error { res.n, res.err = sig.batch.saveLeaves() if sig.batch.isCheckpoint() { if err = w.sql.leafWrite.Exec("PRAGMA wal_checkpoint(TRUNCATE)"); err != nil { - w.logger.Err(err).Msg("failed leaf wal_checkpoint") + w.logger.Error("failed leaf wal_checkpoint", "error", err) } } w.leafResult <- res @@ -221,7 +220,7 @@ func (w *sqlWriter) leafLoop(ctx context.Context) error { return fmt.Errorf("interrupt leaf prune failed in begin; %w", err) } case sig := <-w.leafPruneCh: - w.logger.Warn().Msgf("leaf prune signal received while pruning version=%d next=%d", pruneVersion, sig.pruneVersion) + w.logger.Warn(fmt.Sprintf("leaf prune signal received while pruning version=%d next=%d", pruneVersion, sig.pruneVersion)) checkpoints = sig.checkpoints nextPruneVersion = sig.pruneVersion case <-ctx.Done(): @@ -293,7 +292,7 @@ func (w *sqlWriter) treeLoop(ctx context.Context) error { if err = w.sql.treeWrite.Commit(); err != nil { return err } - w.logger.Debug().Msgf("commit tree prune count=%s", humanize.Comma(pruneCount)) + w.logger.Debug(fmt.Sprintf("commit tree prune count=%s", humanize.Comma(pruneCount))) if err = w.sql.treeWrite.Exec("PRAGMA wal_checkpoint(RESTART)"); err != nil { return fmt.Errorf("failed to checkpoint; %w", err) } @@ -316,7 +315,7 @@ func (w *sqlWriter) treeLoop(ctx context.Context) error { w.treeResult <- res } startPrune := func(startPruningVersion int64) error { - w.logger.Debug().Msgf("tree prune to version=%d", startPruningVersion) + w.logger.Debug(fmt.Sprintf("tree prune to version=%d", startPruningVersion)) pruneStartTime = time.Now() pruneCount = 0 pruneVersion = startPruningVersion @@ -371,11 +370,11 @@ func (w *sqlWriter) treeLoop(ctx context.Context) error { return err } - w.logger.Debug().Msgf("done tree prune count=%s dur=%s to=%d", + w.logger.Debug(fmt.Sprintf("done tree prune count=%s dur=%s to=%d", humanize.Comma(pruneCount), time.Since(pruneStartTime).Round(time.Millisecond), prevCheckpoint, - ) + )) if nextPruneVersion != 0 { if err = startPrune(nextPruneVersion); err != nil { return err @@ -406,7 +405,7 @@ func (w *sqlWriter) treeLoop(ctx context.Context) error { saveTree(sig) } case sig := <-w.treePruneCh: - w.logger.Warn().Msgf("tree prune signal received while pruning version=%d next=%d", pruneVersion, sig.pruneVersion) + w.logger.Warn(fmt.Sprintf("tree prune signal received while pruning version=%d next=%d", pruneVersion, sig.pruneVersion)) checkpoints = sig.checkpoints nextPruneVersion = sig.pruneVersion case <-ctx.Done(): @@ -439,12 +438,13 @@ func (w *sqlWriter) saveTree(tree *Tree) error { saveStart := time.Now() batch := &sqliteBatch{ - sql: tree.sql, - tree: tree, - size: 200_000, - logger: log.With(). - Str("module", "sqlite-batch"). - Str("path", tree.sql.opts.Path).Logger(), + sql: tree.sql, + tree: tree, + size: 200_000, + logger: w.sql.logger, + // logger: log.With(). + // Str("module", "sqlite-batch"). + // Str("path", tree.sql.opts.Path).Logger(), } saveSig := &saveSignal{batch: batch, root: tree.root, version: tree.version, wantCheckpoint: tree.shouldCheckpoint} w.treeCh <- saveSig diff --git a/v2/tree.go b/v2/tree.go index 89263585c..5c4800838 100644 --- a/v2/tree.go +++ b/v2/tree.go @@ -6,19 +6,11 @@ import ( "crypto/sha256" "errors" "fmt" - "os" "time" "github.com/cosmos/iavl/v2/metrics" - "github.com/rs/zerolog" - zlog "github.com/rs/zerolog/log" ) -var log = zlog.Output(zerolog.ConsoleWriter{ - Out: os.Stderr, - TimeFormat: time.Stamp, -}) - type nodeDelete struct { // the sequence in which this deletion was processed deleteKey NodeKey @@ -493,10 +485,6 @@ func (tree *Tree) recursiveRemove(node *Node, key []byte) (newSelf *Node, newKey return node, nil, nil, false, nil } - if err != nil { - return nil, nil, nil, false, err - } - // node.key < key; we go to the left to find the key: if bytes.Compare(key, node.key) < 0 { newLeftNode, newKey, value, removed, err := tree.recursiveRemove(node.left(tree), key) From b014d2cd55a977e71e529704ce15eecc40423dc9 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Tue, 14 Jan 2025 09:58:01 +0100 Subject: [PATCH 2/4] updates --- v2/cmd/gen/gen.go | 26 +++++++++++--------------- v2/cmd/rollback/rollback.go | 12 +++--------- v2/cmd/snapshot/snapshot.go | 12 +++--------- v2/go.mod | 6 +++--- v2/go.sum | 16 +++++++--------- v2/logger.go | 21 +++++++++++++++++++++ v2/multitree.go | 17 +++++++++-------- v2/tree_test.go | 16 ++++++++-------- 8 files changed, 65 insertions(+), 61 deletions(-) diff --git a/v2/cmd/gen/gen.go b/v2/cmd/gen/gen.go index 9eb8631ec..a9872e63e 100644 --- a/v2/cmd/gen/gen.go +++ b/v2/cmd/gen/gen.go @@ -12,15 +12,10 @@ import ( "github.com/dustin/go-humanize" "github.com/kocubinski/costor-api/compact" "github.com/kocubinski/costor-api/core" - "github.com/rs/zerolog" - zlog "github.com/rs/zerolog/log" "github.com/spf13/cobra" ) -var log = zlog.Output(zerolog.ConsoleWriter{ - Out: os.Stderr, - TimeFormat: time.Stamp, -}) +var log = iavl.NewTestLogger() func Command() *cobra.Command { cmd := &cobra.Command{ @@ -75,9 +70,10 @@ func emitCommand() *cobra.Command { go func() { stats, err := stream.Compact() if err != nil { - log.Fatal().Err(err).Msg("failed to compact") + log.Error("failed to compact", "error", err) + os.Exit(1) } - log.Info().Msgf(stats.Report()) + log.Info(stats.Report()) wg.Done() }() @@ -95,13 +91,13 @@ func emitCommand() *cobra.Command { if itr.Version() < int64(start) { if cnt%5_000_000 == 0 { - log.Info().Msgf("fast forward version=%d nodes=%s", itr.Version(), humanize.Comma(cnt)) + log.Info(fmt.Sprintf("fast forward version=%d nodes=%s", itr.Version(), humanize.Comma(cnt))) } continue } if cnt%500_000 == 0 { - log.Info().Msgf("version=%d nodes=%s", itr.Version(), humanize.Comma(cnt)) + log.Info(fmt.Sprintf("version=%d nodes=%s", itr.Version(), humanize.Comma(cnt))) } select { @@ -149,11 +145,11 @@ func treeCommand() *cobra.Command { Use: "tree", Short: "build and save a Tree to disk, taking generated changesets as input", RunE: func(cmd *cobra.Command, args []string) error { - multiTree := iavl.NewMultiTree(dbPath, iavl.TreeOptions{StateStorage: true}) + multiTree := iavl.NewMultiTree(iavl.NewTestLogger(), dbPath, iavl.TreeOptions{StateStorage: true}) defer func(mt *iavl.MultiTree) { err := mt.Close() if err != nil { - log.Error().Err(err).Msg("failed to close db") + log.Error("failed to close db", "error", err) } }(multiTree) @@ -203,12 +199,12 @@ func treeCommand() *cobra.Command { i++ if i%100_000 == 0 { - log.Info().Msgf("leaves=%s dur=%s rate=%s version=%d", + log.Info(fmt.Sprintf("leaves=%s dur=%s rate=%s version=%d", humanize.Comma(i), time.Since(start), humanize.Comma(int64(100_000/time.Since(start).Seconds())), itr.Version(), - ) + )) start = time.Now() } } @@ -219,7 +215,7 @@ func treeCommand() *cobra.Command { } } - log.Info().Msgf("last version=%d hash=%x", lastVersion, lastHash) + log.Info(fmt.Sprintf("last version=%d hash=%x", lastVersion, lastHash)) return nil }, diff --git a/v2/cmd/rollback/rollback.go b/v2/cmd/rollback/rollback.go index 1a76ad2f9..3688e28be 100644 --- a/v2/cmd/rollback/rollback.go +++ b/v2/cmd/rollback/rollback.go @@ -1,19 +1,13 @@ package rollback import ( - "os" - "time" + "fmt" "github.com/cosmos/iavl/v2" - "github.com/rs/zerolog" - zlog "github.com/rs/zerolog/log" "github.com/spf13/cobra" ) -var log = zlog.Output(zerolog.ConsoleWriter{ - Out: os.Stderr, - TimeFormat: time.Stamp, -}) +var log = iavl.NewTestLogger() func Command() *cobra.Command { var ( @@ -29,7 +23,7 @@ func Command() *cobra.Command { return err } for _, dbPath := range dbPaths { - log.Info().Msgf("revert db %s to version %d", dbPath, version) + log.Info(fmt.Sprintf("revert db %s to version %d", dbPath, version)) sql, err := iavl.NewSqliteDb(iavl.NewNodePool(), iavl.SqliteDbOptions{Path: dbPath}) if err != nil { return err diff --git a/v2/cmd/snapshot/snapshot.go b/v2/cmd/snapshot/snapshot.go index 27e10b64f..6e1976618 100644 --- a/v2/cmd/snapshot/snapshot.go +++ b/v2/cmd/snapshot/snapshot.go @@ -1,19 +1,13 @@ package snapshot import ( - "os" - "time" + "fmt" "github.com/cosmos/iavl/v2" - "github.com/rs/zerolog" - zlog "github.com/rs/zerolog/log" "github.com/spf13/cobra" ) -var log = zlog.Output(zerolog.ConsoleWriter{ - Out: os.Stderr, - TimeFormat: time.Stamp, -}) +var log = iavl.NewTestLogger() func Command() *cobra.Command { var ( @@ -28,7 +22,7 @@ func Command() *cobra.Command { if err != nil { return err } - log.Info().Msgf("found db paths: %v", paths) + log.Info(fmt.Sprintf("found db paths: %v", paths)) var ( pool = iavl.NewNodePool() diff --git a/v2/go.mod b/v2/go.mod index b08f3ec20..ba7bc4841 100644 --- a/v2/go.mod +++ b/v2/go.mod @@ -10,7 +10,6 @@ require ( github.com/emicklei/dot v1.6.0 github.com/kocubinski/costor-api v1.1.1 github.com/prometheus/client_golang v1.16.0 - github.com/rs/zerolog v1.30.0 github.com/spf13/cobra v1.7.0 github.com/stretchr/testify v1.8.4 golang.org/x/exp v0.0.0-20231006140011-7918f672742d @@ -23,14 +22,15 @@ require ( github.com/golang/protobuf v1.5.3 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.3.0 // indirect github.com/prometheus/common v0.42.0 // indirect github.com/prometheus/procfs v0.10.1 // indirect + github.com/rs/zerolog v1.33.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/sys v0.22.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/v2/go.sum b/v2/go.sum index 9a008cd50..f081ddc81 100644 --- a/v2/go.sum +++ b/v2/go.sum @@ -30,13 +30,12 @@ github.com/kocubinski/costor-api v1.1.1 h1:sgfJA7T/8IfZ59zxiMrED0xdjerAFuPNBTqyO github.com/kocubinski/costor-api v1.1.1/go.mod h1:ESMBMDkKfN+9vvvhhNVdKLhbOmzI3O/i16iXvRM9Tuc= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -52,8 +51,8 @@ github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+Pymzi github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c= -github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= @@ -64,12 +63,11 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= diff --git a/v2/logger.go b/v2/logger.go index 2a66a7752..2bfe1a401 100644 --- a/v2/logger.go +++ b/v2/logger.go @@ -1,5 +1,7 @@ package iavl +import "log/slog" + // Logger defines basic logger that IAVL expects. // It is a subset of the cosmossdk.io/core/log.Logger interface. // cosmossdk.io/log/log.Logger implements this interface. @@ -32,3 +34,22 @@ func (l *noopLogger) Info(string, ...any) {} func (l *noopLogger) Warn(string, ...any) {} func (l *noopLogger) Error(string, ...any) {} func (l *noopLogger) Debug(string, ...any) {} + +func NewTestLogger() Logger { + return &testLogger{} +} + +type testLogger struct{} + +func (l *testLogger) Info(msg string, keys ...any) { + slog.Info(msg, keys...) +} +func (l *testLogger) Warn(msg string, keys ...any) { + slog.Warn(msg, keys...) +} +func (l *testLogger) Error(msg string, keys ...any) { + slog.Error(msg, keys...) +} +func (l *testLogger) Debug(msg string, keys ...any) { + slog.Debug(msg, keys...) +} diff --git a/v2/multitree.go b/v2/multitree.go index c6d809588..fa46e1933 100644 --- a/v2/multitree.go +++ b/v2/multitree.go @@ -9,13 +9,14 @@ import ( "github.com/cosmos/iavl/v2/metrics" "github.com/dustin/go-humanize" - "github.com/rs/zerolog/log" "golang.org/x/exp/slices" ) // MultiTree encapsulates multiple IAVL trees, each with its own "store key" in the context of the Cosmos SDK. // Within IAVL v2 is only used to test the IAVL v2 implementation, and for import/export of IAVL v2 state. type MultiTree struct { + logger Logger + Trees map[string]*Tree pool *NodePool @@ -27,7 +28,7 @@ type MultiTree struct { errorCh chan error } -func NewMultiTree(rootPath string, opts TreeOptions) *MultiTree { +func NewMultiTree(logger Logger, rootPath string, opts TreeOptions) *MultiTree { return &MultiTree{ Trees: make(map[string]*Tree), doneCh: make(chan saveVersionResult, 1000), @@ -38,8 +39,8 @@ func NewMultiTree(rootPath string, opts TreeOptions) *MultiTree { } } -func ImportMultiTree(pool *NodePool, version int64, path string, treeOpts TreeOptions) (*MultiTree, error) { - mt := NewMultiTree(path, treeOpts) +func ImportMultiTree(logger Logger, pool *NodePool, version int64, path string, treeOpts TreeOptions) (*MultiTree, error) { + mt := NewMultiTree(logger, path, treeOpts) paths, err := FindDbsInPath(path) if err != nil { return nil, err @@ -79,7 +80,7 @@ func ImportMultiTree(pool *NodePool, version int64, path string, treeOpts TreeOp return nil, err case res := <-done: prefix := filepath.Base(res.path) - log.Info().Msgf("imported %s", prefix) + logger.Info(fmt.Sprintf("imported %s", prefix)) mt.Trees[prefix] = res.tree } } @@ -173,7 +174,7 @@ func (mt *MultiTree) SaveVersionConcurrently() ([]byte, int64, error) { for i := 0; i < treeCount; i++ { select { case err := <-mt.errorCh: - log.Error().Err(err).Msg("failed to save version") + mt.logger.Error("failed to save version", "error", err) errs = append(errs, err) case result := <-mt.doneCh: if version != -1 && version != result.version { @@ -218,7 +219,7 @@ func (mt *MultiTree) SnapshotConcurrently() error { for i := 0; i < treeCount; i++ { select { case err := <-mt.errorCh: - log.Error().Err(err).Msg("failed to snapshot") + mt.logger.Error("failed to snapshot", "error", err) errs = append(errs, err) case <-mt.doneCh: } @@ -271,7 +272,7 @@ func (mt *MultiTree) WarmLeaves() error { for i := 0; i < cnt; i++ { select { case err := <-mt.errorCh: - log.Error().Err(err).Msg("failed to warm leaves") + mt.logger.Error("failed to warm leaves", "error", err) return err case <-mt.doneCh: } diff --git a/v2/tree_test.go b/v2/tree_test.go index 7bd5aa53a..2083722f7 100644 --- a/v2/tree_test.go +++ b/v2/tree_test.go @@ -172,7 +172,7 @@ func TestTree_Hash(t *testing.T) { treeOpts := TreeOptions{CheckpointInterval: 10, HeightFilter: 1, StateStorage: true, EvictionDepth: 8} testStart := time.Now() - multiTree := NewMultiTree(tmpDir, treeOpts) + multiTree := NewMultiTree(NewTestLogger(), tmpDir, treeOpts) itrs, ok := opts.Iterator.(*bench.ChangesetIterators) require.True(t, ok) for _, sk := range itrs.StoreKeys() { @@ -190,7 +190,7 @@ func TestTree_Build_Load(t *testing.T) { //tmpDir := t.TempDir() tmpDir := "/tmp/iavl-v2-test" opts := testutil.NewTreeBuildOptions().With10_000() - multiTree := NewMultiTree(tmpDir, TreeOptions{CheckpointInterval: 4000, HeightFilter: 0, StateStorage: false}) + multiTree := NewMultiTree(NewTestLogger(), tmpDir, TreeOptions{CheckpointInterval: 4000, HeightFilter: 0, StateStorage: false}) itrs, ok := opts.Iterator.(*bench.ChangesetIterators) require.True(t, ok) for _, sk := range itrs.StoreKeys() { @@ -205,7 +205,7 @@ func TestTree_Build_Load(t *testing.T) { require.NoError(t, multiTree.Close()) t.Log("import snapshot into new tree") - mt, err := ImportMultiTree(multiTree.pool, 10_000, tmpDir, DefaultTreeOptions()) + mt, err := ImportMultiTree(NewTestLogger(), multiTree.pool, 10_000, tmpDir, DefaultTreeOptions()) require.NoError(t, err) t.Log("build tree to version 12,000 and verify hash") @@ -218,7 +218,7 @@ func TestTree_Build_Load(t *testing.T) { t.Log("export the tree at version 12,000 and import it into a sql db in pre-order") traverseOrder := PreOrder - restorePreOrderMt := NewMultiTree(t.TempDir(), TreeOptions{CheckpointInterval: 4000}) + restorePreOrderMt := NewMultiTree(NewTestLogger(), t.TempDir(), TreeOptions{CheckpointInterval: 4000}) for sk, tree := range multiTree.Trees { require.NoError(t, restorePreOrderMt.MountTree(sk)) exporter := tree.Export(traverseOrder) @@ -232,7 +232,7 @@ func TestTree_Build_Load(t *testing.T) { t.Log("export the tree at version 12,000 and import it into a sql db in post-order") traverseOrder = PostOrder - restorePostOrderMt := NewMultiTree(t.TempDir(), TreeOptions{CheckpointInterval: 4000}) + restorePostOrderMt := NewMultiTree(NewTestLogger(), t.TempDir(), TreeOptions{CheckpointInterval: 4000}) for sk, tree := range multiTree.Trees { require.NoError(t, restorePostOrderMt.MountTree(sk)) exporter := tree.Export(traverseOrder) @@ -262,7 +262,7 @@ func TestOsmoLike_HotStart(t *testing.T) { // logDir := "/tmp/osmo-like-many-v2" logDir := "/Users/mattk/src/scratch/osmo-like-many/v2" pool := NewNodePool() - multiTree, err := ImportMultiTree(pool, 1, tmpDir, TreeOptions{HeightFilter: 0, StateStorage: false}) + multiTree, err := ImportMultiTree(NewTestLogger(), pool, 1, tmpDir, TreeOptions{HeightFilter: 0, StateStorage: false}) require.NoError(t, err) require.NotNil(t, multiTree) opts := testutil.CompactedChangelogs(logDir) @@ -284,7 +284,7 @@ func TestOsmoLike_ColdStart(t *testing.T) { treeOpts.HeightFilter = 1 treeOpts.EvictionDepth = 16 treeOpts.MetricsProxy = newPrometheusMetricsProxy() - multiTree := NewMultiTree(tmpDir, treeOpts) + multiTree := NewMultiTree(NewTestLogger(), tmpDir, treeOpts) require.NoError(t, multiTree.MountTrees()) require.NoError(t, multiTree.LoadVersion(1)) // require.NoError(t, multiTree.WarmLeaves()) @@ -627,7 +627,7 @@ func Test_Prune_Logic(t *testing.T) { func Test_Prune_Performance(t *testing.T) { tmpDir := "/tmp/iavl-v2" - multiTree := NewMultiTree(tmpDir, TreeOptions{CheckpointInterval: 50, StateStorage: false}) + multiTree := NewMultiTree(NewTestLogger(), tmpDir, TreeOptions{CheckpointInterval: 50, StateStorage: false}) require.NoError(t, multiTree.MountTrees()) require.NoError(t, multiTree.LoadVersion(1)) require.NoError(t, multiTree.WarmLeaves()) From a90b9506b74a29ea2fb904231abb92decd74b0f0 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Tue, 14 Jan 2025 10:04:50 +0100 Subject: [PATCH 3/4] fatal behavior --- v2/sqlite_writer.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/v2/sqlite_writer.go b/v2/sqlite_writer.go index 218b1c279..5a52fa19c 100644 --- a/v2/sqlite_writer.go +++ b/v2/sqlite_writer.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "os" "time" "github.com/bvinc/go-sqlite-lite/sqlite3" @@ -58,12 +59,14 @@ func (w *sqlWriter) start(ctx context.Context) { err := w.treeLoop(ctx) if err != nil { w.logger.Error("tree loop failed", "error", err) + os.Exit(1) } }() go func() { err := w.leafLoop(ctx) if err != nil { w.logger.Error("leaf loop failed", "error", err) + os.Exit(1) } }() } From b8de9b0cff42da9902d5df47a18c06fd85b7c3d5 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Tue, 14 Jan 2025 10:08:39 +0100 Subject: [PATCH 4/4] cl + readme --- v2/CHANGELOG.md | 13 +++++++++++++ v2/README.md | 1 + 2 files changed, 14 insertions(+) create mode 100644 v2/CHANGELOG.md create mode 100644 v2/README.md diff --git a/v2/CHANGELOG.md b/v2/CHANGELOG.md new file mode 100644 index 000000000..dfebafc45 --- /dev/null +++ b/v2/CHANGELOG.md @@ -0,0 +1,13 @@ +# Changelog + +## Unreleased + +* [#1037](https://github.com/cosmos/iavl/pull/1037) Swap `zerolog` for internal logger interface + +## [v2.0.0-alpha.4](https://github.com/cosmos/iavl/releases/tag/v2.0.0-alpha.4) + +* Remove debug prints + +## [v2.0.0-alpha.3](https://github.com/cosmos/iavl/releases/tag/v2.0.0-alpha.3) + +* Initial tag. diff --git a/v2/README.md b/v2/README.md new file mode 100644 index 000000000..3c2a50861 --- /dev/null +++ b/v2/README.md @@ -0,0 +1 @@ +# IAVL v2