From c261465bd477ba1e8c4c2c8e4f45e040c02c68eb Mon Sep 17 00:00:00 2001 From: Ragnar Date: Wed, 26 Feb 2025 02:39:34 +0100 Subject: [PATCH 1/8] Update config.go --- config/config.go | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/config/config.go b/config/config.go index 49efae8ba..9aeb0f8f4 100644 --- a/config/config.go +++ b/config/config.go @@ -182,25 +182,13 @@ type BaseConfig struct { //nolint: maligned // and verifying their commits FastSyncMode bool `mapstructure:"fast_sync"` - // Database backend: goleveldb | cleveldb | boltdb | rocksdb + // Database backend: goleveldb | cleveldb | boltdb | rocksdb | pebble // * goleveldb (github.com/syndtr/goleveldb - most popular implementation) - // - pure go - // - stable // * cleveldb (uses levigo wrapper) - // - fast - // - requires gcc - // - use cleveldb build tag (go build -tags cleveldb) // * boltdb (uses etcd's fork of bolt - github.com/etcd-io/bbolt) - // - EXPERIMENTAL - // - may be faster is some use-cases (random reads - indexer) - // - use boltdb build tag (go build -tags boltdb) - // * rocksdb (uses github.com/tecbot/gorocksdb) - // - EXPERIMENTAL - // - requires gcc - // - use rocksdb build tag (go build -tags rocksdb) + // * rocksdb (uses github.com/linxGnu/grocksdb) + // * pebble (uses github.com/cockroachdb/pebble - most performant implementation) // * badgerdb (uses github.com/dgraph-io/badger) - // - EXPERIMENTAL - // - use badgerdb build tag (go build -tags badgerdb) DBBackend string `mapstructure:"db_backend"` // Database directory @@ -250,7 +238,7 @@ func DefaultBaseConfig() BaseConfig { LogFormat: LogFormatPlain, FastSyncMode: true, FilterPeers: false, - DBBackend: "goleveldb", + DBBackend: "pebble", DBPath: "data", } } @@ -531,7 +519,7 @@ type P2PConfig struct { //nolint: maligned ExternalAddress string `mapstructure:"external_address"` // Comma separated list of seed nodes to connect to - // We only use these if we can’t connect to peers in the addrbook + // We only use these if we can't connect to peers in the addrbook Seeds string `mapstructure:"seeds"` // Comma separated list of nodes to keep persistent connections to From 1443d613ac4ecc2aa8a0ee15e7f527e69b432216 Mon Sep 17 00:00:00 2001 From: Ragnar Date: Wed, 26 Feb 2025 02:39:51 +0100 Subject: [PATCH 2/8] Update toml.go --- config/toml.go | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/config/toml.go b/config/toml.go index d4d35116a..9f79d5f00 100644 --- a/config/toml.go +++ b/config/toml.go @@ -92,26 +92,14 @@ moniker = "{{ .BaseConfig.Moniker }}" # and verifying their commits fast_sync = {{ .BaseConfig.FastSyncMode }} -# Database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb +# Database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb | pebble # * goleveldb (github.com/syndtr/goleveldb - most popular implementation) -# - pure go -# - stable # * cleveldb (uses levigo wrapper) -# - fast -# - requires gcc -# - use cleveldb build tag (go build -tags cleveldb) # * boltdb (uses etcd's fork of bolt - github.com/etcd-io/bbolt) -# - EXPERIMENTAL -# - may be faster is some use-cases (random reads - indexer) -# - use boltdb build tag (go build -tags boltdb) -# * rocksdb (uses github.com/tecbot/gorocksdb) -# - EXPERIMENTAL -# - requires gcc -# - use rocksdb build tag (go build -tags rocksdb) +# * rocksdb (uses github.com/linxGnu/grocksdb) +# * pebble (uses github.com/cockroachdb/pebble - most performant implementation) # * badgerdb (uses github.com/dgraph-io/badger) -# - EXPERIMENTAL -# - use badgerdb build tag (go build -tags badgerdb) -db_backend = "{{ .BaseConfig.DBBackend }}" +db_backend = "pebble" # Database directory db_dir = "{{ js .BaseConfig.DBPath }}" From 4c800254f727da040192797da73bf354a9c2bc84 Mon Sep 17 00:00:00 2001 From: Ragnar Date: Wed, 26 Feb 2025 02:40:29 +0100 Subject: [PATCH 3/8] Update testnet.go --- test/e2e/pkg/testnet.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/e2e/pkg/testnet.go b/test/e2e/pkg/testnet.go index ee35ac5b3..41031fa1c 100644 --- a/test/e2e/pkg/testnet.go +++ b/test/e2e/pkg/testnet.go @@ -222,7 +222,7 @@ func NewTestnetFromManifest(manifest Manifest, file string, ifd InfrastructureDa ExternalIP: extIP, ProxyPort: ind.Port, Mode: ModeValidator, - Database: "goleveldb", + Database: "pebble", ABCIProtocol: Protocol(testnet.ABCIProtocol), PrivvalProtocol: ProtocolFile, StartAt: nodeManifest.StartAt, @@ -393,7 +393,7 @@ func (n Node) Validate(testnet Testnet) error { return fmt.Errorf("invalid block sync setting %q", n.BlockSyncVersion) } switch n.Database { - case "goleveldb": + case "pebble": default: return fmt.Errorf("invalid database setting %q", n.Database) } From 2b7d1b7e142ecfd160fc470aa8d50e92a996e28b Mon Sep 17 00:00:00 2001 From: Ragnar Date: Wed, 26 Feb 2025 02:40:44 +0100 Subject: [PATCH 4/8] Update main.go --- cmd/cometbft/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/cometbft/main.go b/cmd/cometbft/main.go index 7ae913831..9c7b2cf25 100644 --- a/cmd/cometbft/main.go +++ b/cmd/cometbft/main.go @@ -30,7 +30,7 @@ func main() { cmd.GenNodeKeyCmd, cmd.VersionCmd, cmd.RollbackStateCmd, - cmd.CompactGoLevelDBCmd, + cmd.CompactCmd, debug.DebugCmd, cli.NewCompletionCmd(rootCmd, true), ) From d1e8f6dd7d748235e133bd0969e50656e8285c43 Mon Sep 17 00:00:00 2001 From: Ragnar Date: Wed, 26 Feb 2025 02:41:03 +0100 Subject: [PATCH 5/8] Update compact.go --- cmd/cometbft/commands/compact.go | 70 ++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 16 deletions(-) diff --git a/cmd/cometbft/commands/compact.go b/cmd/cometbft/commands/compact.go index e1c22d511..6359553dc 100644 --- a/cmd/cometbft/commands/compact.go +++ b/cmd/cometbft/commands/compact.go @@ -1,41 +1,53 @@ package commands import ( - "errors" + "fmt" + "os" "path/filepath" "sync" + "github.com/cockroachdb/pebble" "github.com/spf13/cobra" "github.com/syndtr/goleveldb/leveldb" "github.com/syndtr/goleveldb/leveldb/opt" "github.com/syndtr/goleveldb/leveldb/util" + cfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/libs/log" ) -var CompactGoLevelDBCmd = &cobra.Command{ - Use: "experimental-compact-goleveldb", - Aliases: []string{"experimental_compact_goleveldb"}, - Short: "force compacts the CometBFT storage engine (only GoLevelDB supported)", +var CompactCmd = &cobra.Command{ + Use: "experimental-compact", + Aliases: []string{"experimental_compact"}, + Short: "force compacts the CometBFT storage engine (supports GoLevelDB and Pebble)", Long: ` -This is a temporary utility command that performs a force compaction on the state -and blockstores to reduce disk space for a pruning node. This should only be run -once the node has stopped. This command will likely be omitted in the future after -the planned refactor to the storage engine. +This command forces a compaction of the CometBFT storage engine. -Currently, only GoLevelDB is supported. - `, +Currently, GoLevelDB and Pebble are supported. +`, RunE: func(cmd *cobra.Command, args []string) error { - if config.DBBackend != "goleveldb" { - return errors.New("compaction is currently only supported with goleveldb") + configFile, err := cmd.Flags().GetString("config") + if err != nil { + return err } - compactGoLevelDBs(config.RootDir, logger) - return nil + conf := cfg.DefaultConfig() + conf.SetRoot(configFile) + + logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) + + switch conf.DBBackend { + case "goleveldb": + return compactGoLevelDBs(conf.RootDir, logger) + case "pebble": + return compactPebbleDBs(conf.RootDir, logger) + default: + return fmt.Errorf("compaction is currently only supported with goleveldb and pebble, got %s", conf.DBBackend) + } }, } -func compactGoLevelDBs(rootDir string, logger log.Logger) { +func compactGoLevelDBs(rootDir string, logger log.Logger) error { dbNames := []string{"state", "blockstore"} o := &opt.Options{ DisableSeeksCompaction: true, @@ -64,4 +76,30 @@ func compactGoLevelDBs(rootDir string, logger log.Logger) { }() } wg.Wait() + return nil +} + +func compactPebbleDBs(rootDir string, logger log.Logger) error { + dbNames := []string{"state", "blockstore", "evidence", "tx_index"} + for _, dbName := range dbNames { + dbPath := filepath.Join(rootDir, "data", dbName+".db") + logger.Info("Compacting db", "path", dbPath) + + db, err := pebble.Open(dbPath, &pebble.Options{}) + if err != nil { + return fmt.Errorf("failed to open db %s: %w", dbPath, err) + } + + err = db.Compact(nil, nil, true) + if err != nil { + db.Close() + return fmt.Errorf("failed to compact db %s: %w", dbPath, err) + } + + err = db.Close() + if err != nil { + return fmt.Errorf("failed to close db %s: %w", dbPath, err) + } + } + return nil } From bdc08fe81eafec9bedc8f8b5547b2be9118ab7df Mon Sep 17 00:00:00 2001 From: Ragnar Date: Wed, 26 Feb 2025 02:41:40 +0100 Subject: [PATCH 6/8] Update README.md --- test/loadtime/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/loadtime/README.md b/test/loadtime/README.md index 4226813b4..feb22ee73 100644 --- a/test/loadtime/README.md +++ b/test/loadtime/README.md @@ -47,11 +47,11 @@ the timestamp of the block the transaction was executed in to determine transact minimum, maximum, and average latency as well as the standard deviation. Below is a basic invocation of the report tool with a data directory under `/home/test/.cometbft/data/` -where the data was saved in a `goleveldb` database. +where the data was saved in a `pebble` database. ```bash -./build/report --database-type goleveldb --data-dir ~/.cometbft/data +./build/report --database-type pebble --data-dir ~/.cometbft/data ``` The `report` tool also supports outputting the raw data as `csv`. This can be @@ -61,7 +61,7 @@ Below is an invocation of the report tool that outputs the data to a `csv` file in `out.csv` ```bash -./build/report --database-type goleveldb --data-dir ~/.cometbft/data --csv out.csv +./build/report --database-type pebble --data-dir ~/.cometbft/data --csv out.csv ``` The `report` tool outputs the data for each experiment separately, identified From 14742592939c364fa6ae865646f3a529c3572a34 Mon Sep 17 00:00:00 2001 From: Ragnar Date: Wed, 26 Feb 2025 02:41:49 +0100 Subject: [PATCH 7/8] Update main.go --- test/loadtime/cmd/report/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/loadtime/cmd/report/main.go b/test/loadtime/cmd/report/main.go index 50c3db3d7..b4a847c7d 100644 --- a/test/loadtime/cmd/report/main.go +++ b/test/loadtime/cmd/report/main.go @@ -16,7 +16,7 @@ import ( ) var ( - db = flag.String("database-type", "goleveldb", "the type of database holding the blockstore") + db = flag.String("database-type", "pebble", "the type of database holding the blockstore") dir = flag.String("data-dir", "", "path to the directory containing the CometBFT databases") csvOut = flag.String("csv", "", "dump the extracted latencies as raw csv for use in additional tooling") ) From b35fb8a1b3a809cf3ae5436117b6c6c6a8cb31be Mon Sep 17 00:00:00 2001 From: Ragnar Date: Wed, 26 Feb 2025 02:42:06 +0100 Subject: [PATCH 8/8] Update generate.go --- test/e2e/generator/generate.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/generator/generate.go b/test/e2e/generator/generate.go index c4a1b806d..9a0bc7bc0 100644 --- a/test/e2e/generator/generate.go +++ b/test/e2e/generator/generate.go @@ -33,7 +33,7 @@ var ( } // The following specify randomly chosen values for testnet nodes. - nodeDatabases = uniformChoice{"goleveldb"} + nodeDatabases = uniformChoice{"pebble"} ipv6 = uniformChoice{false, true} // FIXME: grpc disabled due to https://github.com/tendermint/tendermint/issues/5439 nodeABCIProtocols = uniformChoice{"unix", "tcp", "builtin"}