diff --git a/config/flags.go b/config/flags.go index 67fe339db887..9fce19ae501f 100644 --- a/config/flags.go +++ b/config/flags.go @@ -15,6 +15,7 @@ import ( "github.com/ava-labs/avalanchego/database/leveldb" "github.com/ava-labs/avalanchego/database/memdb" + "github.com/ava-labs/avalanchego/database/pebble" "github.com/ava-labs/avalanchego/genesis" "github.com/ava-labs/avalanchego/snow/consensus/snowball" "github.com/ava-labs/avalanchego/trace" @@ -103,7 +104,7 @@ func addNodeFlags(fs *pflag.FlagSet) { fs.Uint64(AddSubnetDelegatorFeeKey, genesis.LocalParams.AddSubnetDelegatorFee, "Transaction fee, in nAVAX, for transactions that add new subnet delegators") // Database - fs.String(DBTypeKey, leveldb.Name, fmt.Sprintf("Database type to use. Should be one of {%s, %s}", leveldb.Name, memdb.Name)) + fs.String(DBTypeKey, leveldb.Name, fmt.Sprintf("Database type to use. Must be one of {%s, %s, %s}", leveldb.Name, memdb.Name, pebble.Name)) fs.String(DBPathKey, defaultDBDir, "Path to database directory") fs.String(DBConfigFileKey, "", fmt.Sprintf("Path to database config file. Ignored if %s is specified", DBConfigContentKey)) fs.String(DBConfigContentKey, "", "Specifies base64 encoded database config content") diff --git a/database/manager/manager.go b/database/manager/manager.go index fd9c36969b79..652385c42ce8 100644 --- a/database/manager/manager.go +++ b/database/manager/manager.go @@ -17,6 +17,7 @@ import ( "github.com/ava-labs/avalanchego/database/leveldb" "github.com/ava-labs/avalanchego/database/memdb" "github.com/ava-labs/avalanchego/database/meterdb" + "github.com/ava-labs/avalanchego/database/pebble" "github.com/ava-labs/avalanchego/database/prefixdb" "github.com/ava-labs/avalanchego/utils" "github.com/ava-labs/avalanchego/utils/logging" @@ -73,10 +74,8 @@ type manager struct { databases []*VersionedDatabase } -// NewLevelDB creates a database manager of levelDBs at [filePath] by creating a -// database instance from each directory with a version <= [currentVersion]. If -// [includePreviousVersions], opens previous database versions and includes them -// in the returned Manager. +// NewLevelDB creates a database manager of levelDBs at [dbDirPath] by creating a +// database instance from each directory with a version <= [currentVersion]. func NewLevelDB( dbDirPath string, dbConfig []byte, @@ -96,6 +95,27 @@ func NewLevelDB( ) } +// NewPebbleDB creates a database manager of pebble instances at [dbDirPath] by creating a +// database instance from each directory with a version <= [currentVersion]. +func NewPebbleDB( + dbDirPath string, + dbConfig []byte, + log logging.Logger, + currentVersion *version.Semantic, + namespace string, + reg prometheus.Registerer, +) (Manager, error) { + return new( + pebble.New, + dbDirPath, + dbConfig, + log, + currentVersion, + namespace, + reg, + ) +} + // new creates a database manager at [filePath] by creating a database instance // from each directory with a version <= [currentVersion]. If // [includePreviousVersions], opens previous database versions and includes them diff --git a/database/pebble/db.go b/database/pebble/db.go index 13ab1db04977..7aa718082a35 100644 --- a/database/pebble/db.go +++ b/database/pebble/db.go @@ -24,9 +24,13 @@ import ( "github.com/ava-labs/avalanchego/utils/units" ) -// pebbleByteOverHead is the number of bytes of constant overhead that -// should be added to a batch size per operation. -const pebbleByteOverHead = 8 +const ( + Name = "pebble" + + // pebbleByteOverHead is the number of bytes of constant overhead that + // should be added to a batch size per operation. + pebbleByteOverHead = 8 +) var ( _ database.Database = (*Database)(nil) @@ -73,10 +77,12 @@ type Config struct { } // TODO: Add metrics -func New(file string, configBytes []byte, log logging.Logger, _ string, _ prometheus.Registerer) (*Database, error) { - var cfg Config - if err := json.Unmarshal(configBytes, &cfg); err != nil { - return nil, err +func New(file string, configBytes []byte, log logging.Logger, _ string, _ prometheus.Registerer) (database.Database, error) { + cfg := DefaultConfig + if len(configBytes) > 0 { + if err := json.Unmarshal(configBytes, &cfg); err != nil { + return nil, err + } } opts := &pebble.Options{ diff --git a/database/pebble/db_test.go b/database/pebble/db_test.go index c72a9d687c88..cba67a79a88f 100644 --- a/database/pebble/db_test.go +++ b/database/pebble/db_test.go @@ -18,7 +18,7 @@ func newDB(t testing.TB) *Database { folder := t.TempDir() db, err := New(folder, DefaultConfigBytes, logging.NoLog{}, "pebble", prometheus.NewRegistry()) require.NoError(t, err) - return db + return db.(*Database) } func TestInterface(t *testing.T) { diff --git a/node/node.go b/node/node.go index 34293e85b0b6..fd6ede32e76d 100644 --- a/node/node.go +++ b/node/node.go @@ -40,6 +40,7 @@ import ( "github.com/ava-labs/avalanchego/database/leveldb" "github.com/ava-labs/avalanchego/database/manager" "github.com/ava-labs/avalanchego/database/memdb" + "github.com/ava-labs/avalanchego/database/pebble" "github.com/ava-labs/avalanchego/database/prefixdb" "github.com/ava-labs/avalanchego/genesis" "github.com/ava-labs/avalanchego/ids" @@ -507,15 +508,32 @@ func (n *Node) initDatabase() error { ) switch n.Config.DatabaseConfig.Name { case leveldb.Name: - dbManager, err = manager.NewLevelDB(n.Config.DatabaseConfig.Path, n.Config.DatabaseConfig.Config, n.Log, version.CurrentDatabase, "db_internal", n.MetricsRegisterer) + dbManager, err = manager.NewLevelDB( + n.Config.DatabaseConfig.Path, + n.Config.DatabaseConfig.Config, + n.Log, + version.CurrentDatabase, + "db_internal", + n.MetricsRegisterer, + ) + case pebble.Name: + dbManager, err = manager.NewPebbleDB( + n.Config.DatabaseConfig.Path, + n.Config.DatabaseConfig.Config, + n.Log, + version.CurrentDatabase, + "db_internal", + n.MetricsRegisterer, + ) case memdb.Name: dbManager = manager.NewMemDB(version.CurrentDatabase) default: err = fmt.Errorf( - "db-type was %q but should have been one of {%s, %s}", + "db-type was %q but should have been one of {%s, %s, %s}", n.Config.DatabaseConfig.Name, leveldb.Name, memdb.Name, + pebble.Name, ) } if err != nil {