diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 88bb64bb5680d3192bb53e60ce093696b8e0ea39..aefbe3985f33f0b7f1ba4935b99c9c9690865088 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -574,10 +574,10 @@ var ( Value: 42069, Usage: "port to listen and serve BitTorrent protocol", } - DbPageSizeFlag = cli.Uint64Flag{ + DbPageSizeFlag = cli.StringFlag{ Name: "db.pagesize", - Usage: "can set mdbx pagesize when on db creation: must be power of 2 and '256 < pagesize < 64*1024' ", - Value: 4096, + Usage: "set mdbx pagesize on db creation: must be power of 2 and '256b <= pagesize <= 64kb' ", + Value: "4kb", } HealthCheckFlag = cli.BoolFlag{ @@ -1037,8 +1037,21 @@ func setDataDir(ctx *cli.Context, cfg *node.Config) { } if ctx.GlobalIsSet(DbPageSizeFlag.Name) { - cfg.MdbxPageSize = ctx.GlobalUint64(DbPageSizeFlag.Name) + if err := cfg.MdbxPageSize.UnmarshalText([]byte(ctx.GlobalString(DbPageSizeFlag.Name))); err != nil { + panic(err) + } + sz := cfg.MdbxPageSize.Bytes() + if !isPowerOfTwo(sz) || sz < 256 || sz > 64*1024 { + panic("invalid --db.pagesize: " + DbPageSizeFlag.Usage) + } + } +} + +func isPowerOfTwo(n uint64) bool { + if n == 0 { //corner case: if n is zero it will also consider as power 2 + return true } + return n&(n-1) == 0 } func setDataDirCobra(f *pflag.FlagSet, cfg *node.Config) { diff --git a/node/config.go b/node/config.go index dd86e893d82c265a5d1c5f32759b03cc9616bd7a..49b63c980e41132b12029d46c0ff8fdb4712c37f 100644 --- a/node/config.go +++ b/node/config.go @@ -25,6 +25,7 @@ import ( "strings" "sync" + "github.com/c2h5oh/datasize" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" @@ -161,7 +162,7 @@ type Config struct { TLSKeyFile string TLSCACert string - MdbxPageSize uint64 + MdbxPageSize datasize.ByteSize // HealthCheck enables standard grpc health check HealthCheck bool diff --git a/node/node.go b/node/node.go index 554add10d9973e374b85541e76d1e01e9a396251..94c3d05b713f63cc0f3f28cd5d635bd235b41df5 100644 --- a/node/node.go +++ b/node/node.go @@ -527,7 +527,7 @@ func OpenDatabase(config *Config, logger log.Logger, label kv.Label) (kv.RwDB, e opts = opts.Exclusive() } if label == kv.ChainDB { - opts = opts.PageSize(config.MdbxPageSize) + opts = opts.PageSize(config.MdbxPageSize.Bytes()) } return opts.Open() }