Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
9426bb3
wire snapshots into flatKV
Aug 10, 2026
596f3db
allow iterator to be held longer
Aug 11, 2026
e022e8e
don't paper over an error with a log
Aug 11, 2026
5a32ee5
doc cleanup, unit test fix
Aug 11, 2026
a212f4a
document startup edge case
Aug 11, 2026
0cc5f91
fix unit test dead code
Aug 11, 2026
aec629c
fix snapshot metrics
Aug 11, 2026
c65ee19
fix docs
Aug 11, 2026
ce4a3f5
fix flaky test
Aug 11, 2026
521a32f
small fixes
Aug 11, 2026
9029ea1
fix bug
Aug 12, 2026
fae5d04
minor fixes
Aug 12, 2026
c44b7dd
Merge branch 'main' into cjl/snapshot-integration-2
Aug 12, 2026
9b63f3b
snapshot writer on background thread
Aug 12, 2026
2b5e17a
background hashing, not yet had a human review pass
Aug 13, 2026
bceb98f
test work
Aug 13, 2026
89136b9
don't flush the WAL
Aug 13, 2026
fd5065d
tune block preprocessing
Aug 13, 2026
f51d0df
new tests
Aug 13, 2026
16bf1f3
more efficient serialization
Aug 13, 2026
f17ad76
snapshot engine tuning/rewrite
Aug 13, 2026
c856d15
more snapshot engine write optimizations
Aug 13, 2026
164b952
minor tweaks
Aug 13, 2026
115d6c0
fix cache dashboard
Aug 14, 2026
55b8bc4
2000 transactions per block
Aug 14, 2026
4c3e2a5
new test scenario
Aug 14, 2026
ef45016
update block size
Aug 14, 2026
b89bab9
optimize batch get
Aug 14, 2026
79e97cb
more optimizations for batch get
Aug 14, 2026
198a10d
remove shard locks
Aug 20, 2026
74e6778
fan out threads for commit
Aug 20, 2026
9159c7c
move allocations out of shard commit lock
Aug 20, 2026
8ba160b
revert fanout
Aug 20, 2026
2c47604
fan out to different DBs but not to shards, revert changes that didn'…
Aug 20, 2026
35169e4
5k transactions per block
Aug 20, 2026
a51d0a4
improve cryptosim harness perf
Aug 20, 2026
c0c1ac6
Revert "improve cryptosim harness perf"
Aug 20, 2026
2625c9b
tweak cryptosim harness
Aug 20, 2026
e241693
remove mutex
Aug 20, 2026
17481cf
approximate LRU
Aug 20, 2026
5dbe66d
don't take wlock for hashing
Aug 21, 2026
9e58fb3
fewer allocations
Aug 21, 2026
7cdb4aa
turn off cache metrics
Aug 21, 2026
ec5da7c
tweaks
Aug 21, 2026
9498e10
parallel preprocess
Aug 21, 2026
c147d63
revert preprocess threading
Aug 21, 2026
b8fba81
batch allocate keys in ApplyChangeSets()
Aug 21, 2026
d85427c
re-enable snapshot metrics, add pprof support
Aug 21, 2026
6b579bb
more shards
Aug 21, 2026
dc58c4c
shard count 16
Aug 21, 2026
bfc0f27
32 shards + fanout
Aug 21, 2026
8b1a2f5
experimental fanout
Aug 21, 2026
504c2c2
refactor hashing
Aug 24, 2026
fa3a6b3
move account merging+reads off the main thread
Aug 24, 2026
26d3922
optimze merge account phase
Aug 24, 2026
bb5aa2d
chunk up GC
Aug 24, 2026
69bc825
more performant block generation
Aug 24, 2026
6210c23
more efficient work sending to executors
Aug 24, 2026
3fa62dd
experimental build
Aug 24, 2026
b9554e5
remove GC chunking
Aug 24, 2026
db4ffcd
fan out GC
Aug 24, 2026
eac9b2b
better back pressure, more metrics
Aug 24, 2026
8daf4fa
tune pebble, new metrics
Aug 24, 2026
f08cae3
tweak pebble config
Aug 24, 2026
ec7d38c
tune pebble
Aug 24, 2026
2990212
pre-sort values, revert pebble config tweaks
Aug 24, 2026
4648be2
better pre-sorting
Aug 24, 2026
b394520
moar transactions per block
Aug 24, 2026
a01dbc5
parallelize apply_change_sets_prepare
Aug 25, 2026
77c1cc6
wire in change
Aug 25, 2026
79b3f04
benchmarks
Aug 25, 2026
359cd78
faster block creation
Aug 25, 2026
2ae80fb
memiavl stuff
Aug 25, 2026
f8c7d84
cryptosim progress
Aug 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 43 additions & 24 deletions app/abci_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,41 +85,60 @@ func TestBeginBlockAppliesMigrationBatchSize(t *testing.T) {
require.Equal(t, 321, after, "BeginBlock should push the gov param into the SC store")
}

// TestMigrationBatchSizeTakesEffectNextBlock is the full end-to-end timing
// check: a governance proposal committed in block N (written into the block's
// deliver state, then Commit) only changes the SC store's migration rate when
// block N+1's BeginBlock runs and reads it from committed state.
// TestMigrationBatchSizeTakesEffectNextBlock pins when a param change reaches the SC store: BeginBlock
// applies whatever the param says at the moment it runs, so a proposal that lands later in a block cannot
// change the rate that block is already migrating at — only the next block's BeginBlock picks it up.
//
// The BeginBlock step is driven directly rather than through FinalizeBlock/Commit because the sequence
// this pins has no legal block-level spelling: getting the param written after BeginBlock but committed at
// the same height means writing between FinalizeBlock and Commit, which changes committed state for a
// height whose app hash was already announced to Tendermint. See TestMigrationBatchSizeAppliedAtBlockStart
// for the same path through a real block.
func TestMigrationBatchSizeTakesEffectNextBlock(t *testing.T) {
a := Setup(t, false, false, false)
bg := context.Background()
ctx := a.GetContextForDeliverTx([]byte{})

// Block 1: BeginBlock runs first (param still unset), then the gov
// proposal lands by writing into this block's deliver state, then Commit
// persists it to the committed multistore.
_, err := a.FinalizeBlock(bg, &abci.RequestFinalizeBlock{
Header: &tmproto.Header{ChainID: "sei-test", Height: 1, Time: time.Now()},
})
require.NoError(t, err)
// A block begins with the param unset, so the lazily-persisted default leaves migration paused.
a.applyMigrationBatchSize(ctx)
got, ok := a.rootStore.GetMigrationBatchSize()
require.True(t, ok)
require.Equal(t, 0, got, "the default param must leave migration paused")

// A gov proposal raises the rate part-way through that same block.
subspace, ok := a.ParamsKeeper.GetSubspace(migration.SubspaceName)
require.True(t, ok)
subspace.Set(a.GetContextForDeliverTx([]byte{}), migration.KeyNumKeysToMigratePerBlock, uint64(640))
subspace.Set(ctx, migration.KeyNumKeysToMigratePerBlock, uint64(640))

_, err = a.Commit(bg)
require.NoError(t, err)
got, ok = a.rootStore.GetMigrationBatchSize()
require.True(t, ok)
require.Equal(t, 0, got, "a param write must not change the rate the current block is migrating at")

// The param was committed in block 1, but BeginBlock(1) ran before it
// existed, so the rate is still paused at this point.
got, ok := a.rootStore.GetMigrationBatchSize()
// The next block's BeginBlock reads the param and applies it.
a.applyMigrationBatchSize(ctx)
got, ok = a.rootStore.GetMigrationBatchSize()
require.True(t, ok)
require.Equal(t, 0, got, "param committed in block 1 must not take effect within block 1")
require.Equal(t, 640, got, "the next BeginBlock must apply the new rate")
}

// Block 2: BeginBlock reads the now-committed param and applies it.
_, err = a.FinalizeBlock(bg, &abci.RequestFinalizeBlock{
Header: &tmproto.Header{ChainID: "sei-test", Height: 2, Time: time.Now().Add(time.Second)},
// TestMigrationBatchSizeAppliedAtBlockStart covers the same path through a real block: a param already in
// state when the block starts is applied by that block's BeginBlock and survives the commit.
func TestMigrationBatchSizeAppliedAtBlockStart(t *testing.T) {
a := Setup(t, false, false, false)
bg := context.Background()

// Written into the genesis deliver state, before any block's app hash has been taken.
subspace, ok := a.ParamsKeeper.GetSubspace(migration.SubspaceName)
require.True(t, ok)
subspace.Set(a.GetContextForDeliverTx([]byte{}), migration.KeyNumKeysToMigratePerBlock, uint64(640))

_, err := a.FinalizeBlock(bg, &abci.RequestFinalizeBlock{
Header: &tmproto.Header{ChainID: "sei-test", Height: 1, Time: time.Now()},
})
require.NoError(t, err)
_, err = a.Commit(bg)
require.NoError(t, err)

got, _ = a.rootStore.GetMigrationBatchSize()
require.Equal(t, 640, got, "migration rate must take effect on the block after the param is committed")
got, ok := a.rootStore.GetMigrationBatchSize()
require.True(t, ok)
require.Equal(t, 640, got, "BeginBlock must apply a param already in state when the block starts")
}
78 changes: 53 additions & 25 deletions app/testdata/state-commit.golden
Original file line number Diff line number Diff line change
Expand Up @@ -15,54 +15,82 @@ FlatKVConfig.Fsync = bool(false)
FlatKVConfig.AsyncWriteBuffer = int(0)
FlatKVConfig.SnapshotInterval = uint32(10000)
FlatKVConfig.SnapshotKeepRecent = uint32(1)
FlatKVConfig.MaxSnapshotLagBlocks = uint32(8192)
FlatKVConfig.HashQueueSize = uint32(64)
FlatKVConfig.HashChanSize = uint32(1024)
FlatKVConfig.ExternalPruning = bool(false)
FlatKVConfig.EnablePebbleMetrics = bool(true)
FlatKVConfig.EnableReadWriteMetrics = bool(false)
FlatKVConfig.AccountDBConfig.DataDir = string("")
FlatKVConfig.AccountDBConfig.EnableMetrics = bool(true)
FlatKVConfig.AccountDBConfig.EnableReadWriteMetrics = bool(false)
FlatKVConfig.AccountDBConfig.MetricsScrapeInterval = time.Duration(10s)
FlatKVConfig.AccountCacheConfig.ShardCount = uint64(8)
FlatKVConfig.AccountCacheConfig.MaxSize = uint64(1073741824)
FlatKVConfig.AccountCacheConfig.EstimatedOverheadPerEntry = uint64(250)
FlatKVConfig.AccountCacheConfig.MetricsName = string("")
FlatKVConfig.AccountCacheConfig.MetricsScrapeInterval = time.Duration(0s)
FlatKVConfig.AccountStoreConfig.ShardCount = uint64(8)
FlatKVConfig.AccountStoreConfig.MaxSize = uint64(1073741824)
FlatKVConfig.AccountStoreConfig.EstimatedOverheadPerEntry = uint64(256)
FlatKVConfig.AccountStoreConfig.Name = string("account")
FlatKVConfig.AccountStoreConfig.MetricsEnabled = bool(true)
FlatKVConfig.AccountStoreConfig.MetricsScrapeIntervalSeconds = float64(10)
FlatKVConfig.AccountStoreConfig.MaxUnflushedVersions = uint64(4096)
FlatKVConfig.AccountStoreConfig.TargetBytesPerFlush = uint64(4194304)
FlatKVConfig.AccountStoreConfig.ReservedPrefix = string("_meta/")
FlatKVConfig.AccountStoreConfig.FlushSync = bool(false)
FlatKVConfig.CodeDBConfig.DataDir = string("")
FlatKVConfig.CodeDBConfig.EnableMetrics = bool(true)
FlatKVConfig.CodeDBConfig.EnableReadWriteMetrics = bool(false)
FlatKVConfig.CodeDBConfig.MetricsScrapeInterval = time.Duration(10s)
FlatKVConfig.CodeCacheConfig.ShardCount = uint64(8)
FlatKVConfig.CodeCacheConfig.MaxSize = uint64(536870912)
FlatKVConfig.CodeCacheConfig.EstimatedOverheadPerEntry = uint64(250)
FlatKVConfig.CodeCacheConfig.MetricsName = string("")
FlatKVConfig.CodeCacheConfig.MetricsScrapeInterval = time.Duration(0s)
FlatKVConfig.CodeStoreConfig.ShardCount = uint64(8)
FlatKVConfig.CodeStoreConfig.MaxSize = uint64(536870912)
FlatKVConfig.CodeStoreConfig.EstimatedOverheadPerEntry = uint64(256)
FlatKVConfig.CodeStoreConfig.Name = string("code")
FlatKVConfig.CodeStoreConfig.MetricsEnabled = bool(true)
FlatKVConfig.CodeStoreConfig.MetricsScrapeIntervalSeconds = float64(10)
FlatKVConfig.CodeStoreConfig.MaxUnflushedVersions = uint64(4096)
FlatKVConfig.CodeStoreConfig.TargetBytesPerFlush = uint64(4194304)
FlatKVConfig.CodeStoreConfig.ReservedPrefix = string("_meta/")
FlatKVConfig.CodeStoreConfig.FlushSync = bool(false)
FlatKVConfig.StorageDBConfig.DataDir = string("")
FlatKVConfig.StorageDBConfig.EnableMetrics = bool(true)
FlatKVConfig.StorageDBConfig.EnableReadWriteMetrics = bool(false)
FlatKVConfig.StorageDBConfig.MetricsScrapeInterval = time.Duration(10s)
FlatKVConfig.StorageCacheConfig.ShardCount = uint64(8)
FlatKVConfig.StorageCacheConfig.MaxSize = uint64(4294967296)
FlatKVConfig.StorageCacheConfig.EstimatedOverheadPerEntry = uint64(250)
FlatKVConfig.StorageCacheConfig.MetricsName = string("")
FlatKVConfig.StorageCacheConfig.MetricsScrapeInterval = time.Duration(0s)
FlatKVConfig.StorageStoreConfig.ShardCount = uint64(8)
FlatKVConfig.StorageStoreConfig.MaxSize = uint64(4294967296)
FlatKVConfig.StorageStoreConfig.EstimatedOverheadPerEntry = uint64(256)
FlatKVConfig.StorageStoreConfig.Name = string("storage")
FlatKVConfig.StorageStoreConfig.MetricsEnabled = bool(true)
FlatKVConfig.StorageStoreConfig.MetricsScrapeIntervalSeconds = float64(10)
FlatKVConfig.StorageStoreConfig.MaxUnflushedVersions = uint64(4096)
FlatKVConfig.StorageStoreConfig.TargetBytesPerFlush = uint64(4194304)
FlatKVConfig.StorageStoreConfig.ReservedPrefix = string("_meta/")
FlatKVConfig.StorageStoreConfig.FlushSync = bool(false)
FlatKVConfig.MiscDBConfig.DataDir = string("")
FlatKVConfig.MiscDBConfig.EnableMetrics = bool(true)
FlatKVConfig.MiscDBConfig.EnableReadWriteMetrics = bool(false)
FlatKVConfig.MiscDBConfig.MetricsScrapeInterval = time.Duration(10s)
FlatKVConfig.MiscCacheConfig.ShardCount = uint64(8)
FlatKVConfig.MiscCacheConfig.MaxSize = uint64(536870912)
FlatKVConfig.MiscCacheConfig.EstimatedOverheadPerEntry = uint64(250)
FlatKVConfig.MiscCacheConfig.MetricsName = string("")
FlatKVConfig.MiscCacheConfig.MetricsScrapeInterval = time.Duration(0s)
FlatKVConfig.MiscStoreConfig.ShardCount = uint64(8)
FlatKVConfig.MiscStoreConfig.MaxSize = uint64(536870912)
FlatKVConfig.MiscStoreConfig.EstimatedOverheadPerEntry = uint64(256)
FlatKVConfig.MiscStoreConfig.Name = string("misc")
FlatKVConfig.MiscStoreConfig.MetricsEnabled = bool(true)
FlatKVConfig.MiscStoreConfig.MetricsScrapeIntervalSeconds = float64(10)
FlatKVConfig.MiscStoreConfig.MaxUnflushedVersions = uint64(4096)
FlatKVConfig.MiscStoreConfig.TargetBytesPerFlush = uint64(4194304)
FlatKVConfig.MiscStoreConfig.ReservedPrefix = string("_meta/")
FlatKVConfig.MiscStoreConfig.FlushSync = bool(false)
FlatKVConfig.MetadataDBConfig.DataDir = string("")
FlatKVConfig.MetadataDBConfig.EnableMetrics = bool(true)
FlatKVConfig.MetadataDBConfig.EnableReadWriteMetrics = bool(false)
FlatKVConfig.MetadataDBConfig.MetricsScrapeInterval = time.Duration(10s)
FlatKVConfig.MetadataCacheConfig.ShardCount = uint64(8)
FlatKVConfig.MetadataCacheConfig.MaxSize = uint64(536870912)
FlatKVConfig.MetadataCacheConfig.EstimatedOverheadPerEntry = uint64(250)
FlatKVConfig.MetadataCacheConfig.MetricsName = string("")
FlatKVConfig.MetadataCacheConfig.MetricsScrapeInterval = time.Duration(0s)
FlatKVConfig.MetadataStoreConfig.ShardCount = uint64(8)
FlatKVConfig.MetadataStoreConfig.MaxSize = uint64(536870912)
FlatKVConfig.MetadataStoreConfig.EstimatedOverheadPerEntry = uint64(256)
FlatKVConfig.MetadataStoreConfig.Name = string("metadata")
FlatKVConfig.MetadataStoreConfig.MetricsEnabled = bool(true)
FlatKVConfig.MetadataStoreConfig.MetricsScrapeIntervalSeconds = float64(10)
FlatKVConfig.MetadataStoreConfig.MaxUnflushedVersions = uint64(4096)
FlatKVConfig.MetadataStoreConfig.TargetBytesPerFlush = uint64(4194304)
FlatKVConfig.MetadataStoreConfig.ReservedPrefix = string("_meta/")
FlatKVConfig.MetadataStoreConfig.FlushSync = bool(false)
FlatKVConfig.ReaderThreadsPerCore = float64(2)
FlatKVConfig.ReaderConstantThreadCount = int(0)
FlatKVConfig.ReaderPoolQueueSize = int(1024)
Expand Down
Loading