From 60c675f9e83f4517ee0c61cfdf6eadca766e5956 Mon Sep 17 00:00:00 2001 From: kbhat1 Date: Fri, 27 Feb 2026 16:24:57 -0800 Subject: [PATCH 1/7] Extend cryptosim DB benchmark to support state store (SS) backends Add SSPebbleDB and SSComposite backend types so the existing ERC20 benchmark can drive the historical state store using the same changeset write path. Made-with: Cursor --- .../cryptosim/config/ss-composite-config.json | 27 ++++++++ .../cryptosim/config/ss-pebble-config.json | 27 ++++++++ .../bench/wrappers/db_implementations.go | 38 +++++++++++ .../bench/wrappers/state_store_wrapper.go | 66 +++++++++++++++++++ 4 files changed, 158 insertions(+) create mode 100644 sei-db/state_db/bench/cryptosim/config/ss-composite-config.json create mode 100644 sei-db/state_db/bench/cryptosim/config/ss-pebble-config.json create mode 100644 sei-db/state_db/bench/wrappers/state_store_wrapper.go diff --git a/sei-db/state_db/bench/cryptosim/config/ss-composite-config.json b/sei-db/state_db/bench/cryptosim/config/ss-composite-config.json new file mode 100644 index 0000000000..411f4c332b --- /dev/null +++ b/sei-db/state_db/bench/cryptosim/config/ss-composite-config.json @@ -0,0 +1,27 @@ +{ + "Comment": "State store benchmark using composite SS with EVM sub-stores (dual write + EVM-first read).", + "Backend": "SSComposite", + "BlocksPerCommit": 32, + "CannedRandomSize": 1073741824, + "ConstantThreadCount": 0, + "ConsoleUpdateIntervalSeconds": 1, + "ConsoleUpdateIntervalTransactions": 1000000, + "DataDir": "data", + "Erc20ContractSize": 2048, + "Erc20InteractionsPerAccount": 10, + "Erc20StorageSlotSize": 32, + "ExecutorQueueSize": 64, + "HotAccountProbability": 0.1, + "HotAccountSetSize": 100, + "HotErc20ContractProbability": 0.5, + "HotErc20ContractSetSize": 100, + "MinimumNumberOfAccounts": 1000000, + "MinimumNumberOfErc20Contracts": 10000, + "NewAccountProbability": 0.001, + "PaddedAccountSize": 69, + "Seed": 1337, + "SetupUpdateIntervalCount": 100000, + "ThreadsPerCore": 2.0, + "TransactionsPerBlock": 1024, + "MaxRuntimeSeconds": 0 +} diff --git a/sei-db/state_db/bench/cryptosim/config/ss-pebble-config.json b/sei-db/state_db/bench/cryptosim/config/ss-pebble-config.json new file mode 100644 index 0000000000..263cb56150 --- /dev/null +++ b/sei-db/state_db/bench/cryptosim/config/ss-pebble-config.json @@ -0,0 +1,27 @@ +{ + "Comment": "State store benchmark using PebbleDB MVCC backend (SS layer).", + "Backend": "SSPebbleDB", + "BlocksPerCommit": 32, + "CannedRandomSize": 1073741824, + "ConstantThreadCount": 0, + "ConsoleUpdateIntervalSeconds": 1, + "ConsoleUpdateIntervalTransactions": 1000000, + "DataDir": "data", + "Erc20ContractSize": 2048, + "Erc20InteractionsPerAccount": 10, + "Erc20StorageSlotSize": 32, + "ExecutorQueueSize": 64, + "HotAccountProbability": 0.1, + "HotAccountSetSize": 100, + "HotErc20ContractProbability": 0.5, + "HotErc20ContractSetSize": 100, + "MinimumNumberOfAccounts": 1000000, + "MinimumNumberOfErc20Contracts": 10000, + "NewAccountProbability": 0.001, + "PaddedAccountSize": 69, + "Seed": 1337, + "SetupUpdateIntervalCount": 100000, + "ThreadsPerCore": 2.0, + "TransactionsPerBlock": 1024, + "MaxRuntimeSeconds": 0 +} diff --git a/sei-db/state_db/bench/wrappers/db_implementations.go b/sei-db/state_db/bench/wrappers/db_implementations.go index 1901fdc18c..da8ccc76b1 100644 --- a/sei-db/state_db/bench/wrappers/db_implementations.go +++ b/sei-db/state_db/bench/wrappers/db_implementations.go @@ -8,6 +8,8 @@ import ( "github.com/sei-protocol/sei-chain/sei-db/state_db/sc/composite" "github.com/sei-protocol/sei-chain/sei-db/state_db/sc/flatkv" "github.com/sei-protocol/sei-chain/sei-db/state_db/sc/memiavl" + "github.com/sei-protocol/sei-chain/sei-db/state_db/ss/backend" + ssComposite "github.com/sei-protocol/sei-chain/sei-db/state_db/ss/composite" ) const EVMStoreName = "evm" @@ -20,6 +22,9 @@ const ( CompositeDual DBType = "CompositeDual" CompositeSplit DBType = "CompositeSplit" CompositeCosmos DBType = "CompositeCosmos" + + SSPebbleDB DBType = "SSPebbleDB" + SSComposite DBType = "SSComposite" ) func newMemIAVLCommitStore(dbDir string) (DBWrapper, error) { @@ -76,6 +81,35 @@ func newCompositeCommitStore(dbDir string, writeMode config.WriteMode) (DBWrappe return NewCompositeWrapper(loadedStore), nil } +func newSSPebbleDBStateStore(dbDir string) (DBWrapper, error) { + cfg := config.DefaultStateStoreConfig() + cfg.Backend = config.PebbleDBBackend + cfg.AsyncWriteBuffer = 0 + + fmt.Printf("Opening PebbleDB state store from directory %s\n", dbDir) + openFn := backend.ResolveBackend(cfg.Backend) + db, err := openFn(dbDir, cfg) + if err != nil { + return nil, fmt.Errorf("failed to open PebbleDB state store: %w", err) + } + return NewStateStoreWrapper(db), nil +} + +func newSSCompositeStateStore(dbDir string) (DBWrapper, error) { + cfg := config.DefaultStateStoreConfig() + cfg.Backend = config.PebbleDBBackend + cfg.AsyncWriteBuffer = 0 + cfg.WriteMode = config.DualWrite + cfg.ReadMode = config.EVMFirstRead + + fmt.Printf("Opening composite state store from directory %s\n", dbDir) + store, err := ssComposite.NewCompositeStateStore(cfg, dbDir, logger.NewNopLogger()) + if err != nil { + return nil, fmt.Errorf("failed to open composite state store: %w", err) + } + return NewStateStoreWrapper(store), nil +} + // NewDBImpl instantiates a new empty DBWrapper based on the given DBType. func NewDBImpl(dbType DBType, dataDir string) (DBWrapper, error) { switch dbType { @@ -89,6 +123,10 @@ func NewDBImpl(dbType DBType, dataDir string) (DBWrapper, error) { return newCompositeCommitStore(dataDir, config.SplitWrite) case CompositeCosmos: return newCompositeCommitStore(dataDir, config.CosmosOnlyWrite) + case SSPebbleDB: + return newSSPebbleDBStateStore(dataDir) + case SSComposite: + return newSSCompositeStateStore(dataDir) default: return nil, fmt.Errorf("unsupported DB type: %s", dbType) } diff --git a/sei-db/state_db/bench/wrappers/state_store_wrapper.go b/sei-db/state_db/bench/wrappers/state_store_wrapper.go new file mode 100644 index 0000000000..8047983731 --- /dev/null +++ b/sei-db/state_db/bench/wrappers/state_store_wrapper.go @@ -0,0 +1,66 @@ +package wrappers + +import ( + "fmt" + "sync/atomic" + + dbTypes "github.com/sei-protocol/sei-chain/sei-db/db_engine/types" + "github.com/sei-protocol/sei-chain/sei-db/proto" + scTypes "github.com/sei-protocol/sei-chain/sei-db/state_db/sc/types" +) + +var _ DBWrapper = (*stateStoreWrapper)(nil) + +// stateStoreWrapper adapts a versioned StateStore (SS layer) to the DBWrapper +// interface used by the cryptosim benchmark. Each ApplyChangeSets call maps to +// a single ApplyChangesetSync at an incrementing version. The SS layer persists +// on every apply, so Commit is a no-op. +type stateStoreWrapper struct { + base dbTypes.StateStore + version atomic.Int64 +} + +func NewStateStoreWrapper(store dbTypes.StateStore) DBWrapper { + w := &stateStoreWrapper{ + base: store, + } + w.version.Store(store.GetLatestVersion()) + return w +} + +func (s *stateStoreWrapper) ApplyChangeSets(cs []*proto.NamedChangeSet) error { + nextVersion := s.version.Add(1) + return s.base.ApplyChangesetSync(nextVersion, cs) +} + +func (s *stateStoreWrapper) Read(key []byte) (data []byte, found bool, err error) { + version := s.version.Load() + if version == 0 { + return nil, false, nil + } + val, err := s.base.Get(EVMStoreName, version, key) + if err != nil { + return nil, false, err + } + return val, val != nil, nil +} + +func (s *stateStoreWrapper) Commit() (int64, error) { + return s.version.Load(), nil +} + +func (s *stateStoreWrapper) Close() error { + return s.base.Close() +} + +func (s *stateStoreWrapper) Version() int64 { + return s.version.Load() +} + +func (s *stateStoreWrapper) LoadVersion(_ int64) error { + return nil +} + +func (s *stateStoreWrapper) Importer(_ int64) (scTypes.Importer, error) { + return nil, fmt.Errorf("import not supported for state store wrapper") +} From 2b5b50c338f0e091d969c857d6c610223236da02 Mon Sep 17 00:00:00 2001 From: kbhat1 Date: Sat, 28 Feb 2026 11:14:12 -0800 Subject: [PATCH 2/7] Add combined SC+SS benchmark mode Add a combinedWrapper that fans out changeset writes to both a State Commit and State Store backend, mirroring production. Two new backend types: FlatKV+SSPebble and CompositeDual+SSComposite. Made-with: Cursor --- .../bench/wrappers/combined_wrapper.go | 63 +++++++++++++++++++ .../bench/wrappers/db_implementations.go | 44 +++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 sei-db/state_db/bench/wrappers/combined_wrapper.go diff --git a/sei-db/state_db/bench/wrappers/combined_wrapper.go b/sei-db/state_db/bench/wrappers/combined_wrapper.go new file mode 100644 index 0000000000..84dc6bf4e7 --- /dev/null +++ b/sei-db/state_db/bench/wrappers/combined_wrapper.go @@ -0,0 +1,63 @@ +package wrappers + +import ( + "sync/atomic" + + dbTypes "github.com/sei-protocol/sei-chain/sei-db/db_engine/types" + "github.com/sei-protocol/sei-chain/sei-db/proto" + scTypes "github.com/sei-protocol/sei-chain/sei-db/state_db/sc/types" +) + +var _ DBWrapper = (*combinedWrapper)(nil) + +// combinedWrapper drives both a State Commit (SC) and State Store (SS) backend +// from the same changeset stream, mirroring production where SC and SS receive +// identical writes. +type combinedWrapper struct { + sc DBWrapper + ss dbTypes.StateStore + ssVersion atomic.Int64 +} + +func NewCombinedWrapper(sc DBWrapper, ss dbTypes.StateStore) DBWrapper { + w := &combinedWrapper{sc: sc, ss: ss} + w.ssVersion.Store(ss.GetLatestVersion()) + return w +} + +func (c *combinedWrapper) ApplyChangeSets(cs []*proto.NamedChangeSet) error { + if err := c.sc.ApplyChangeSets(cs); err != nil { + return err + } + nextVersion := c.ssVersion.Add(1) + return c.ss.ApplyChangesetSync(nextVersion, cs) +} + +func (c *combinedWrapper) Read(key []byte) (data []byte, found bool, err error) { + return c.sc.Read(key) +} + +func (c *combinedWrapper) Commit() (int64, error) { + return c.sc.Commit() +} + +func (c *combinedWrapper) Close() error { + scErr := c.sc.Close() + ssErr := c.ss.Close() + if scErr != nil { + return scErr + } + return ssErr +} + +func (c *combinedWrapper) Version() int64 { + return c.sc.Version() +} + +func (c *combinedWrapper) LoadVersion(version int64) error { + return c.sc.LoadVersion(version) +} + +func (c *combinedWrapper) Importer(version int64) (scTypes.Importer, error) { + return c.sc.Importer(version) +} diff --git a/sei-db/state_db/bench/wrappers/db_implementations.go b/sei-db/state_db/bench/wrappers/db_implementations.go index da8ccc76b1..24f8f070a3 100644 --- a/sei-db/state_db/bench/wrappers/db_implementations.go +++ b/sei-db/state_db/bench/wrappers/db_implementations.go @@ -2,6 +2,7 @@ package wrappers import ( "fmt" + "path/filepath" "github.com/sei-protocol/sei-chain/sei-db/common/logger" "github.com/sei-protocol/sei-chain/sei-db/config" @@ -25,6 +26,9 @@ const ( SSPebbleDB DBType = "SSPebbleDB" SSComposite DBType = "SSComposite" + + FlatKV_SSPebble DBType = "FlatKV+SSPebble" + CompositeDual_SSComposite DBType = "CompositeDual+SSComposite" ) func newMemIAVLCommitStore(dbDir string) (DBWrapper, error) { @@ -110,6 +114,42 @@ func newSSCompositeStateStore(dbDir string) (DBWrapper, error) { return NewStateStoreWrapper(store), nil } +func newCombinedFlatKVSSPebble(dbDir string) (DBWrapper, error) { + fmt.Printf("Opening FlatKV (SC) + PebbleDB (SS) from directory %s\n", dbDir) + sc, err := newFlatKVCommitStore(filepath.Join(dbDir, "sc")) + if err != nil { + return nil, fmt.Errorf("failed to create SC store: %w", err) + } + ssCfg := config.DefaultStateStoreConfig() + ssCfg.Backend = config.PebbleDBBackend + ssCfg.AsyncWriteBuffer = 0 + ss, err := backend.ResolveBackend(ssCfg.Backend)(filepath.Join(dbDir, "ss"), ssCfg) + if err != nil { + _ = sc.Close() + return nil, fmt.Errorf("failed to create SS store: %w", err) + } + return NewCombinedWrapper(sc, ss), nil +} + +func newCombinedCompositeDualSSComposite(dbDir string) (DBWrapper, error) { + fmt.Printf("Opening CompositeDual (SC) + Composite (SS) from directory %s\n", dbDir) + sc, err := newCompositeCommitStore(filepath.Join(dbDir, "sc"), config.DualWrite) + if err != nil { + return nil, fmt.Errorf("failed to create SC store: %w", err) + } + ssCfg := config.DefaultStateStoreConfig() + ssCfg.Backend = config.PebbleDBBackend + ssCfg.AsyncWriteBuffer = 0 + ssCfg.WriteMode = config.DualWrite + ssCfg.ReadMode = config.EVMFirstRead + ss, err := ssComposite.NewCompositeStateStore(ssCfg, filepath.Join(dbDir, "ss"), logger.NewNopLogger()) + if err != nil { + _ = sc.Close() + return nil, fmt.Errorf("failed to create SS store: %w", err) + } + return NewCombinedWrapper(sc, ss), nil +} + // NewDBImpl instantiates a new empty DBWrapper based on the given DBType. func NewDBImpl(dbType DBType, dataDir string) (DBWrapper, error) { switch dbType { @@ -127,6 +167,10 @@ func NewDBImpl(dbType DBType, dataDir string) (DBWrapper, error) { return newSSPebbleDBStateStore(dataDir) case SSComposite: return newSSCompositeStateStore(dataDir) + case FlatKV_SSPebble: + return newCombinedFlatKVSSPebble(dataDir) + case CompositeDual_SSComposite: + return newCombinedCompositeDualSSComposite(dataDir) default: return nil, fmt.Errorf("unsupported DB type: %s", dbType) } From 62c8e916b5f71036679e6d4abe35e861a272ab69 Mon Sep 17 00:00:00 2001 From: kbhat1 Date: Sat, 28 Feb 2026 11:17:37 -0800 Subject: [PATCH 3/7] Add Go benchmark tests for SS and SC+SS backends Verifies SSPebbleDB and FlatKV+SSPebble work with the existing runBenchmark harness (version tracking, changeset generation, etc). Made-with: Cursor --- sei-db/state_db/bench/bench_ss_test.go | 45 ++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 sei-db/state_db/bench/bench_ss_test.go diff --git a/sei-db/state_db/bench/bench_ss_test.go b/sei-db/state_db/bench/bench_ss_test.go new file mode 100644 index 0000000000..82177616b0 --- /dev/null +++ b/sei-db/state_db/bench/bench_ss_test.go @@ -0,0 +1,45 @@ +package bench + +import ( + "testing" + + "github.com/sei-protocol/sei-chain/sei-db/state_db/bench/wrappers" +) + +func BenchmarkSSPebbleDBWrite(b *testing.B) { + const totalKeys int64 = 10_000 + + scenarios := []TestScenario{ + { + Name: "100_keys_per_block", + TotalKeys: totalKeys, + NumBlocks: totalKeys / 100, + Backend: wrappers.SSPebbleDB, + }, + } + + for _, scenario := range scenarios { + b.Run(scenario.Name, func(b *testing.B) { + runBenchmark(b, scenario, false) + }) + } +} + +func BenchmarkCombinedFlatKVSSPebbleWrite(b *testing.B) { + const totalKeys int64 = 10_000 + + scenarios := []TestScenario{ + { + Name: "100_keys_per_block", + TotalKeys: totalKeys, + NumBlocks: totalKeys / 100, + Backend: wrappers.FlatKV_SSPebble, + }, + } + + for _, scenario := range scenarios { + b.Run(scenario.Name, func(b *testing.B) { + runBenchmark(b, scenario, false) + }) + } +} From bd59670852794b5713994144f8e3d94a3f9a2de6 Mon Sep 17 00:00:00 2001 From: kbhat1 Date: Sat, 28 Feb 2026 11:24:52 -0800 Subject: [PATCH 4/7] Clean up: remove SSPebbleDB, use CompositeStateStore for all SS paths SSPebbleDB bypassed the SS layer (Tier 2) and hit raw PebbleDB MVCC directly - not a real production path. All SS backends now go through CompositeStateStore, matching the architecture. Extracted shared openSSComposite helper to deduplicate SS creation. Made-with: Cursor --- sei-db/state_db/bench/bench_ss_test.go | 8 ++-- .../cryptosim/config/ss-pebble-config.json | 27 ----------- .../bench/wrappers/db_implementations.go | 47 +++++-------------- 3 files changed, 16 insertions(+), 66 deletions(-) delete mode 100644 sei-db/state_db/bench/cryptosim/config/ss-pebble-config.json diff --git a/sei-db/state_db/bench/bench_ss_test.go b/sei-db/state_db/bench/bench_ss_test.go index 82177616b0..c3df895788 100644 --- a/sei-db/state_db/bench/bench_ss_test.go +++ b/sei-db/state_db/bench/bench_ss_test.go @@ -6,7 +6,7 @@ import ( "github.com/sei-protocol/sei-chain/sei-db/state_db/bench/wrappers" ) -func BenchmarkSSPebbleDBWrite(b *testing.B) { +func BenchmarkSSCompositeWrite(b *testing.B) { const totalKeys int64 = 10_000 scenarios := []TestScenario{ @@ -14,7 +14,7 @@ func BenchmarkSSPebbleDBWrite(b *testing.B) { Name: "100_keys_per_block", TotalKeys: totalKeys, NumBlocks: totalKeys / 100, - Backend: wrappers.SSPebbleDB, + Backend: wrappers.SSComposite, }, } @@ -25,7 +25,7 @@ func BenchmarkSSPebbleDBWrite(b *testing.B) { } } -func BenchmarkCombinedFlatKVSSPebbleWrite(b *testing.B) { +func BenchmarkCombinedFlatKVSSCompositeWrite(b *testing.B) { const totalKeys int64 = 10_000 scenarios := []TestScenario{ @@ -33,7 +33,7 @@ func BenchmarkCombinedFlatKVSSPebbleWrite(b *testing.B) { Name: "100_keys_per_block", TotalKeys: totalKeys, NumBlocks: totalKeys / 100, - Backend: wrappers.FlatKV_SSPebble, + Backend: wrappers.FlatKV_SSComposite, }, } diff --git a/sei-db/state_db/bench/cryptosim/config/ss-pebble-config.json b/sei-db/state_db/bench/cryptosim/config/ss-pebble-config.json deleted file mode 100644 index 263cb56150..0000000000 --- a/sei-db/state_db/bench/cryptosim/config/ss-pebble-config.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "Comment": "State store benchmark using PebbleDB MVCC backend (SS layer).", - "Backend": "SSPebbleDB", - "BlocksPerCommit": 32, - "CannedRandomSize": 1073741824, - "ConstantThreadCount": 0, - "ConsoleUpdateIntervalSeconds": 1, - "ConsoleUpdateIntervalTransactions": 1000000, - "DataDir": "data", - "Erc20ContractSize": 2048, - "Erc20InteractionsPerAccount": 10, - "Erc20StorageSlotSize": 32, - "ExecutorQueueSize": 64, - "HotAccountProbability": 0.1, - "HotAccountSetSize": 100, - "HotErc20ContractProbability": 0.5, - "HotErc20ContractSetSize": 100, - "MinimumNumberOfAccounts": 1000000, - "MinimumNumberOfErc20Contracts": 10000, - "NewAccountProbability": 0.001, - "PaddedAccountSize": 69, - "Seed": 1337, - "SetupUpdateIntervalCount": 100000, - "ThreadsPerCore": 2.0, - "TransactionsPerBlock": 1024, - "MaxRuntimeSeconds": 0 -} diff --git a/sei-db/state_db/bench/wrappers/db_implementations.go b/sei-db/state_db/bench/wrappers/db_implementations.go index 24f8f070a3..194b5ce424 100644 --- a/sei-db/state_db/bench/wrappers/db_implementations.go +++ b/sei-db/state_db/bench/wrappers/db_implementations.go @@ -9,7 +9,6 @@ import ( "github.com/sei-protocol/sei-chain/sei-db/state_db/sc/composite" "github.com/sei-protocol/sei-chain/sei-db/state_db/sc/flatkv" "github.com/sei-protocol/sei-chain/sei-db/state_db/sc/memiavl" - "github.com/sei-protocol/sei-chain/sei-db/state_db/ss/backend" ssComposite "github.com/sei-protocol/sei-chain/sei-db/state_db/ss/composite" ) @@ -24,10 +23,9 @@ const ( CompositeSplit DBType = "CompositeSplit" CompositeCosmos DBType = "CompositeCosmos" - SSPebbleDB DBType = "SSPebbleDB" SSComposite DBType = "SSComposite" - FlatKV_SSPebble DBType = "FlatKV+SSPebble" + FlatKV_SSComposite DBType = "FlatKV+SSComposite" CompositeDual_SSComposite DBType = "CompositeDual+SSComposite" ) @@ -85,45 +83,31 @@ func newCompositeCommitStore(dbDir string, writeMode config.WriteMode) (DBWrappe return NewCompositeWrapper(loadedStore), nil } -func newSSPebbleDBStateStore(dbDir string) (DBWrapper, error) { - cfg := config.DefaultStateStoreConfig() - cfg.Backend = config.PebbleDBBackend - cfg.AsyncWriteBuffer = 0 - - fmt.Printf("Opening PebbleDB state store from directory %s\n", dbDir) - openFn := backend.ResolveBackend(cfg.Backend) - db, err := openFn(dbDir, cfg) - if err != nil { - return nil, fmt.Errorf("failed to open PebbleDB state store: %w", err) - } - return NewStateStoreWrapper(db), nil -} - -func newSSCompositeStateStore(dbDir string) (DBWrapper, error) { +func openSSComposite(dir string) (*ssComposite.CompositeStateStore, error) { cfg := config.DefaultStateStoreConfig() cfg.Backend = config.PebbleDBBackend cfg.AsyncWriteBuffer = 0 cfg.WriteMode = config.DualWrite cfg.ReadMode = config.EVMFirstRead + return ssComposite.NewCompositeStateStore(cfg, dir, logger.NewNopLogger()) +} +func newSSCompositeStateStore(dbDir string) (DBWrapper, error) { fmt.Printf("Opening composite state store from directory %s\n", dbDir) - store, err := ssComposite.NewCompositeStateStore(cfg, dbDir, logger.NewNopLogger()) + store, err := openSSComposite(dbDir) if err != nil { return nil, fmt.Errorf("failed to open composite state store: %w", err) } return NewStateStoreWrapper(store), nil } -func newCombinedFlatKVSSPebble(dbDir string) (DBWrapper, error) { - fmt.Printf("Opening FlatKV (SC) + PebbleDB (SS) from directory %s\n", dbDir) +func newCombinedFlatKVSSComposite(dbDir string) (DBWrapper, error) { + fmt.Printf("Opening FlatKV (SC) + Composite (SS) from directory %s\n", dbDir) sc, err := newFlatKVCommitStore(filepath.Join(dbDir, "sc")) if err != nil { return nil, fmt.Errorf("failed to create SC store: %w", err) } - ssCfg := config.DefaultStateStoreConfig() - ssCfg.Backend = config.PebbleDBBackend - ssCfg.AsyncWriteBuffer = 0 - ss, err := backend.ResolveBackend(ssCfg.Backend)(filepath.Join(dbDir, "ss"), ssCfg) + ss, err := openSSComposite(filepath.Join(dbDir, "ss")) if err != nil { _ = sc.Close() return nil, fmt.Errorf("failed to create SS store: %w", err) @@ -137,12 +121,7 @@ func newCombinedCompositeDualSSComposite(dbDir string) (DBWrapper, error) { if err != nil { return nil, fmt.Errorf("failed to create SC store: %w", err) } - ssCfg := config.DefaultStateStoreConfig() - ssCfg.Backend = config.PebbleDBBackend - ssCfg.AsyncWriteBuffer = 0 - ssCfg.WriteMode = config.DualWrite - ssCfg.ReadMode = config.EVMFirstRead - ss, err := ssComposite.NewCompositeStateStore(ssCfg, filepath.Join(dbDir, "ss"), logger.NewNopLogger()) + ss, err := openSSComposite(filepath.Join(dbDir, "ss")) if err != nil { _ = sc.Close() return nil, fmt.Errorf("failed to create SS store: %w", err) @@ -163,12 +142,10 @@ func NewDBImpl(dbType DBType, dataDir string) (DBWrapper, error) { return newCompositeCommitStore(dataDir, config.SplitWrite) case CompositeCosmos: return newCompositeCommitStore(dataDir, config.CosmosOnlyWrite) - case SSPebbleDB: - return newSSPebbleDBStateStore(dataDir) case SSComposite: return newSSCompositeStateStore(dataDir) - case FlatKV_SSPebble: - return newCombinedFlatKVSSPebble(dataDir) + case FlatKV_SSComposite: + return newCombinedFlatKVSSComposite(dataDir) case CompositeDual_SSComposite: return newCombinedCompositeDualSSComposite(dataDir) default: From 5203ac4237b15ef32ba42b5fb29051b8d5f83fcf Mon Sep 17 00:00:00 2001 From: kbhat1 Date: Sat, 28 Feb 2026 11:36:13 -0800 Subject: [PATCH 5/7] Remove FlatKV+SSComposite, keep only production SC+SS combo Drop FlatKV+SSComposite since the production path is CompositeDual+SS. Fix combinedWrapper version tracking to use SS version (consistent across all SC backends). Made-with: Cursor --- sei-db/state_db/bench/bench_ss_test.go | 4 ++-- .../bench/wrappers/combined_wrapper.go | 7 +++++-- .../bench/wrappers/db_implementations.go | 20 +------------------ 3 files changed, 8 insertions(+), 23 deletions(-) diff --git a/sei-db/state_db/bench/bench_ss_test.go b/sei-db/state_db/bench/bench_ss_test.go index c3df895788..cb62c71744 100644 --- a/sei-db/state_db/bench/bench_ss_test.go +++ b/sei-db/state_db/bench/bench_ss_test.go @@ -25,7 +25,7 @@ func BenchmarkSSCompositeWrite(b *testing.B) { } } -func BenchmarkCombinedFlatKVSSCompositeWrite(b *testing.B) { +func BenchmarkCombinedCompositeDualSSCompositeWrite(b *testing.B) { const totalKeys int64 = 10_000 scenarios := []TestScenario{ @@ -33,7 +33,7 @@ func BenchmarkCombinedFlatKVSSCompositeWrite(b *testing.B) { Name: "100_keys_per_block", TotalKeys: totalKeys, NumBlocks: totalKeys / 100, - Backend: wrappers.FlatKV_SSComposite, + Backend: wrappers.CompositeDual_SSComposite, }, } diff --git a/sei-db/state_db/bench/wrappers/combined_wrapper.go b/sei-db/state_db/bench/wrappers/combined_wrapper.go index 84dc6bf4e7..01f855d8a5 100644 --- a/sei-db/state_db/bench/wrappers/combined_wrapper.go +++ b/sei-db/state_db/bench/wrappers/combined_wrapper.go @@ -38,7 +38,10 @@ func (c *combinedWrapper) Read(key []byte) (data []byte, found bool, err error) } func (c *combinedWrapper) Commit() (int64, error) { - return c.sc.Commit() + if _, err := c.sc.Commit(); err != nil { + return 0, err + } + return c.ssVersion.Load(), nil } func (c *combinedWrapper) Close() error { @@ -51,7 +54,7 @@ func (c *combinedWrapper) Close() error { } func (c *combinedWrapper) Version() int64 { - return c.sc.Version() + return c.ssVersion.Load() } func (c *combinedWrapper) LoadVersion(version int64) error { diff --git a/sei-db/state_db/bench/wrappers/db_implementations.go b/sei-db/state_db/bench/wrappers/db_implementations.go index 194b5ce424..4d65ba3bbc 100644 --- a/sei-db/state_db/bench/wrappers/db_implementations.go +++ b/sei-db/state_db/bench/wrappers/db_implementations.go @@ -23,9 +23,7 @@ const ( CompositeSplit DBType = "CompositeSplit" CompositeCosmos DBType = "CompositeCosmos" - SSComposite DBType = "SSComposite" - - FlatKV_SSComposite DBType = "FlatKV+SSComposite" + SSComposite DBType = "SSComposite" CompositeDual_SSComposite DBType = "CompositeDual+SSComposite" ) @@ -101,20 +99,6 @@ func newSSCompositeStateStore(dbDir string) (DBWrapper, error) { return NewStateStoreWrapper(store), nil } -func newCombinedFlatKVSSComposite(dbDir string) (DBWrapper, error) { - fmt.Printf("Opening FlatKV (SC) + Composite (SS) from directory %s\n", dbDir) - sc, err := newFlatKVCommitStore(filepath.Join(dbDir, "sc")) - if err != nil { - return nil, fmt.Errorf("failed to create SC store: %w", err) - } - ss, err := openSSComposite(filepath.Join(dbDir, "ss")) - if err != nil { - _ = sc.Close() - return nil, fmt.Errorf("failed to create SS store: %w", err) - } - return NewCombinedWrapper(sc, ss), nil -} - func newCombinedCompositeDualSSComposite(dbDir string) (DBWrapper, error) { fmt.Printf("Opening CompositeDual (SC) + Composite (SS) from directory %s\n", dbDir) sc, err := newCompositeCommitStore(filepath.Join(dbDir, "sc"), config.DualWrite) @@ -144,8 +128,6 @@ func NewDBImpl(dbType DBType, dataDir string) (DBWrapper, error) { return newCompositeCommitStore(dataDir, config.CosmosOnlyWrite) case SSComposite: return newSSCompositeStateStore(dataDir) - case FlatKV_SSComposite: - return newCombinedFlatKVSSComposite(dataDir) case CompositeDual_SSComposite: return newCombinedCompositeDualSSComposite(dataDir) default: From 0ffd130b8f11d5846e55d6d29d50feef0f6aa614 Mon Sep 17 00:00:00 2001 From: kbhat1 Date: Mon, 2 Mar 2026 07:59:28 -0800 Subject: [PATCH 6/7] Trim SS config to non-default fields only Avoids config drift when defaults change. Made-with: Cursor --- .../cryptosim/config/ss-composite-config.json | 24 +------------------ 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/sei-db/state_db/bench/cryptosim/config/ss-composite-config.json b/sei-db/state_db/bench/cryptosim/config/ss-composite-config.json index 411f4c332b..89a40f5945 100644 --- a/sei-db/state_db/bench/cryptosim/config/ss-composite-config.json +++ b/sei-db/state_db/bench/cryptosim/config/ss-composite-config.json @@ -1,27 +1,5 @@ { "Comment": "State store benchmark using composite SS with EVM sub-stores (dual write + EVM-first read).", "Backend": "SSComposite", - "BlocksPerCommit": 32, - "CannedRandomSize": 1073741824, - "ConstantThreadCount": 0, - "ConsoleUpdateIntervalSeconds": 1, - "ConsoleUpdateIntervalTransactions": 1000000, - "DataDir": "data", - "Erc20ContractSize": 2048, - "Erc20InteractionsPerAccount": 10, - "Erc20StorageSlotSize": 32, - "ExecutorQueueSize": 64, - "HotAccountProbability": 0.1, - "HotAccountSetSize": 100, - "HotErc20ContractProbability": 0.5, - "HotErc20ContractSetSize": 100, - "MinimumNumberOfAccounts": 1000000, - "MinimumNumberOfErc20Contracts": 10000, - "NewAccountProbability": 0.001, - "PaddedAccountSize": 69, - "Seed": 1337, - "SetupUpdateIntervalCount": 100000, - "ThreadsPerCore": 2.0, - "TransactionsPerBlock": 1024, - "MaxRuntimeSeconds": 0 + "DataDir": "data" } From 3955672f3a88f9aa0475ec456acee2741026d14d Mon Sep 17 00:00:00 2001 From: kbhat1 Date: Mon, 2 Mar 2026 20:41:02 -0800 Subject: [PATCH 7/7] fix(bench): return committed version from compositeWrapper.Version() WorkingCommitInfo().Version returns the *next* version to be committed, not the last committed version. This was missed when 37f1b8da8 updated memIAVLWrapper to use base.Version(), causing all Composite SC benchmarks to fail with an off-by-one version assertion. Made-with: Cursor --- sei-db/state_db/bench/wrappers/composite_wrapper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sei-db/state_db/bench/wrappers/composite_wrapper.go b/sei-db/state_db/bench/wrappers/composite_wrapper.go index 05bdf10afc..bf0db44cc7 100644 --- a/sei-db/state_db/bench/wrappers/composite_wrapper.go +++ b/sei-db/state_db/bench/wrappers/composite_wrapper.go @@ -34,7 +34,7 @@ func (c *compositeWrapper) LoadVersion(version int64) error { } func (c *compositeWrapper) Version() int64 { - return c.base.WorkingCommitInfo().Version + return c.base.Version() } func (c *compositeWrapper) Importer(version int64) (types.Importer, error) {