diff --git a/cmd/sonicd/app/launcher.go b/cmd/sonicd/app/launcher.go index 327dbe0ea..6980d2003 100644 --- a/cmd/sonicd/app/launcher.go +++ b/cmd/sonicd/app/launcher.go @@ -66,6 +66,7 @@ func initFlags() { flags.CacheFlag, flags.LiveDbCacheFlag, flags.ArchiveCacheFlag, + flags.StateDbCacheCapacityFlag, } networkingFlags = []cli.Flag{ flags.BootnodesFlag, diff --git a/cmd/sonicd/app/run_test.go b/cmd/sonicd/app/run_test.go index 98e830a94..348d66995 100644 --- a/cmd/sonicd/app/run_test.go +++ b/cmd/sonicd/app/run_test.go @@ -23,7 +23,11 @@ func tmpdir(t *testing.T) string { } func initFakenetDatadir(dataDir string, validatorsNum idx.Validator) { - genesisStore := makefakegenesis.FakeGenesisStore(validatorsNum, futils.ToFtm(1000000000), futils.ToFtm(5000000)) + genesisStore := makefakegenesis.FakeGenesisStore( + validatorsNum, + futils.ToFtm(1000000000), + futils.ToFtm(5000000), + ) defer genesisStore.Close() if err := genesis.ImportGenesisStore(genesis.ImportParams{ diff --git a/cmd/sonictool/app/genesis.go b/cmd/sonictool/app/genesis.go index a98044677..a81076c2a 100644 --- a/cmd/sonictool/app/genesis.go +++ b/cmd/sonictool/app/genesis.go @@ -100,6 +100,7 @@ func jsonGenesisImport(ctx *cli.Context) error { if err != nil { return fmt.Errorf("failed to load JSON genesis: %w", err) } + genesisStore, err := makefakegenesis.ApplyGenesisJson(genesisJson) if err != nil { return fmt.Errorf("failed to prepare JSON genesis: %w", err) @@ -139,7 +140,11 @@ func fakeGenesisImport(ctx *cli.Context) error { return err } - genesisStore := makefakegenesis.FakeGenesisStore(idx.Validator(validatorsNumber), futils.ToFtm(1000000000), futils.ToFtm(5000000)) + genesisStore := makefakegenesis.FakeGenesisStore( + idx.Validator(validatorsNumber), + futils.ToFtm(1000000000), + futils.ToFtm(5000000), + ) defer genesisStore.Close() return genesis.ImportGenesisStore(genesis.ImportParams{ GenesisStore: genesisStore, diff --git a/cmd/sonictool/app/main.go b/cmd/sonictool/app/main.go index d71ffb5eb..c6099fa59 100644 --- a/cmd/sonictool/app/main.go +++ b/cmd/sonictool/app/main.go @@ -20,6 +20,7 @@ func Run() error { flags.CacheFlag, flags.LiveDbCacheFlag, flags.ArchiveCacheFlag, + flags.StateDbCacheCapacityFlag, } app.Commands = []cli.Command{ { diff --git a/config/config.go b/config/config.go index 5989125f0..56ef4cce7 100644 --- a/config/config.go +++ b/config/config.go @@ -341,6 +341,10 @@ func MakeAllConfigsFromFile(ctx *cli.Context, configFile string) (*Config, error cfg.Lachesis.SuppressFramePanic = true } + if ctx.IsSet(flags.StateDbCacheCapacityFlag.Name) { + cfg.OperaStore.EVM.Cache.StateDbCapacity = ctx.GlobalInt(flags.StateDbCacheCapacityFlag.Name) + } + return &cfg, nil } diff --git a/config/flags/flags.go b/config/flags/flags.go index 3f9582e41..20d0c8f6d 100644 --- a/config/flags/flags.go +++ b/config/flags/flags.go @@ -365,4 +365,11 @@ var ( "Setting this value to <=2000 will result in pre-confugired cache capacity of 2KB", CacheFlag.Name), Value: 0, } + StateDbCacheCapacityFlag = cli.IntFlag{ + Name: "statedb.cache", + Usage: "The number of cached data elements by each StateDb instance. Since this is an experimental feature " + + "used mainly by tests it is generally recommended leaving this blank. In tests no value lower than 1024 " + + "is recommended. Setting this to <1 will automatically set the cache capacity to a DB defined default value.", + Value: 0, + } ) diff --git a/gossip/common_test.go b/gossip/common_test.go index 94514857d..89309b0bb 100644 --- a/gossip/common_test.go +++ b/gossip/common_test.go @@ -143,7 +143,14 @@ func newTestEnv(firstEpoch idx.Epoch, validatorsNum idx.Validator, tb testing.TB rules.Blocks.MaxEmptyBlockSkipPeriod = 0 rules.Emitter.Interval = 0 - genStore := makefakegenesis.FakeGenesisStoreWithRulesAndStart(validatorsNum, utils.ToFtm(genesisBalance), utils.ToFtm(genesisStake), rules, firstEpoch, 2) + genStore := makefakegenesis.FakeGenesisStoreWithRulesAndStart( + validatorsNum, + utils.ToFtm(genesisBalance), + utils.ToFtm(genesisStake), + rules, + firstEpoch, + 2, + ) genesis := genStore.Genesis() store, err := NewMemStore(tb) diff --git a/gossip/evmstore/config.go b/gossip/evmstore/config.go index 9464c64d9..ed8729091 100644 --- a/gossip/evmstore/config.go +++ b/gossip/evmstore/config.go @@ -19,6 +19,8 @@ type ( EvmBlocksNum int // Cache size for EvmBlock (size in bytes). EvmBlocksSize uint + // Cache size for StateDb instances (0 for DB-selected default) + StateDbCapacity int } // StoreConfig is a config for store db. StoreConfig struct { @@ -38,11 +40,11 @@ type ( func DefaultStoreConfig(scale cachescale.Func) StoreConfig { return StoreConfig{ Cache: StoreCacheConfig{ - ReceiptsSize: scale.U(4 * opt.MiB), - ReceiptsBlocks: scale.I(4000), - TxPositions: scale.I(20000), - EvmBlocksNum: scale.I(5000), - EvmBlocksSize: scale.U(6 * opt.MiB), + ReceiptsSize: scale.U(4 * opt.MiB), + ReceiptsBlocks: scale.I(4000), + TxPositions: scale.I(20000), + EvmBlocksNum: scale.I(5000), + EvmBlocksSize: scale.U(6 * opt.MiB), }, StateDb: carmen.Parameters{ Variant: "go-file", diff --git a/gossip/evmstore/store.go b/gossip/evmstore/store.go index 4244cc9ae..2adc89607 100644 --- a/gossip/evmstore/store.go +++ b/gossip/evmstore/store.go @@ -78,7 +78,7 @@ func (s *Store) Open() error { if err != nil { return fmt.Errorf("failed to create carmen state; %s", err) } - s.liveStateDb = carmen.CreateStateDBUsing(s.carmenState) + s.liveStateDb = carmen.CreateCustomStateDBUsing(s.carmenState, s.cfg.Cache.StateDbCapacity) return nil } diff --git a/gossip/handler_fuzz.go b/gossip/handler_fuzz.go index 0b650e8c0..c774f1e84 100644 --- a/gossip/handler_fuzz.go +++ b/gossip/handler_fuzz.go @@ -68,7 +68,11 @@ func makeFuzzedHandler() (h *handler, err error) { genesisStake = 2 * 4e6 ) - genStore := makefakegenesis.FakeGenesisStore(genesisStakers, utils.ToFtm(genesisBalance), utils.ToFtm(genesisStake)) + genStore := makefakegenesis.FakeGenesisStore( + genesisStakers, + utils.ToFtm(genesisBalance), + utils.ToFtm(genesisStake), + ) genesis := genStore.Genesis() config := DefaultConfig(cachescale.Identity) diff --git a/integration/makefakegenesis/genesis.go b/integration/makefakegenesis/genesis.go index 387589283..96100d009 100644 --- a/integration/makefakegenesis/genesis.go +++ b/integration/makefakegenesis/genesis.go @@ -50,7 +50,13 @@ func FakeGenesisStoreWithRules(num idx.Validator, balance, stake *big.Int, rules return FakeGenesisStoreWithRulesAndStart(num, balance, stake, rules, 2, 1) } -func FakeGenesisStoreWithRulesAndStart(num idx.Validator, balance, stake *big.Int, rules opera.Rules, epoch idx.Epoch, block idx.Block) *genesisstore.Store { +func FakeGenesisStoreWithRulesAndStart( + num idx.Validator, + balance, stake *big.Int, + rules opera.Rules, + epoch idx.Epoch, + block idx.Block, +) *genesisstore.Store { builder := makegenesis.NewGenesisBuilder() validators := GetFakeValidators(num) diff --git a/integration/makegenesis/genesis.go b/integration/makegenesis/genesis.go index 7241de760..fcaee3fe9 100644 --- a/integration/makegenesis/genesis.go +++ b/integration/makegenesis/genesis.go @@ -128,7 +128,8 @@ func NewGenesisBuilder() *GenesisBuilder { if err != nil { panic(fmt.Errorf("failed to create carmen state; %s", err)) } - carmenStateDb := carmen.CreateStateDBUsing(carmenState) + // Set cache size to lowest value possible + carmenStateDb := carmen.CreateCustomStateDBUsing(carmenState, 1024) tmpStateDB := evmstore.CreateCarmenStateDb(carmenStateDb) return &GenesisBuilder{ tmpStateDB: tmpStateDB, diff --git a/tests/integration_test_net.go b/tests/integration_test_net.go index 154deb7de..e050e3a63 100644 --- a/tests/integration_test_net.go +++ b/tests/integration_test_net.go @@ -201,6 +201,7 @@ func startIntegrationTestNet(directory string, args []string) (*IntegrationTestN "--datadir", result.stateDir(), "--statedb.livecache", "1", "--statedb.archivecache", "1", + "--statedb.cache", "1024", }, args...) if err := sonictool.Run(); err != nil { os.Args = originalArgs @@ -208,8 +209,6 @@ func startIntegrationTestNet(directory string, args []string) (*IntegrationTestN } os.Args = originalArgs - os.Args = originalArgs - if err := result.start(); err != nil { return nil, fmt.Errorf("failed to start the test network: %w", err) } @@ -274,6 +273,7 @@ func (n *IntegrationTestNet) start() error { // database memory usage options "--statedb.livecache", "1", "--statedb.archivecache", "1", + "--statedb.cache", "1024", } err := sonicd.Run()