Skip to content

Port sei-v3 PR #512: persist AppQC and blocks to disk#2896

Open
wen-coding wants to merge 1 commit intomainfrom
wen/persist_appqc_and_blocks
Open

Port sei-v3 PR #512: persist AppQC and blocks to disk#2896
wen-coding wants to merge 1 commit intomainfrom
wen/persist_appqc_and_blocks

Conversation

@wen-coding
Copy link
Contributor

Summary

Ports sei-protocol/sei-v3#512 into sei-chain, adding crash-safe persistence for availability state (AppQC and signed lane proposals).

  • Extract consensus/persist/ sub-package: Moves the generic A/B file persistence logic (persist.go, persist_test.go) into its own package via git mv (preserving history), exporting Persister, NewPersister, WriteAndSync, SuffixA/SuffixB.
  • Add block-file persistence (persist/blocks.go): Each signed lane proposal is stored as an individual <lane_hex>_<blocknum>.pb file in a blocks/ subdirectory; includes load-all, delete-before, and header-mismatch validation.
  • Wire persistence into availability state (avail/state.go): NewState now accepts stateDir, initialises both the A/B persister (for AppQC) and BlockPersister, loads persisted data on restart, and passes it to newInner for queue restoration.
  • Restore state on restart (avail/inner.go): On load, advances commitQCs, appVotes, and per-lane block queues past already-persisted indices, replaying only contiguous block runs.
  • Thread PersistentStateDir from consensus.Config through consensus/state.go into avail.NewState.
  • Expand persistence design doc (consensus/inner.go): Documents what is persisted, why, recovery semantics, write behavior, and rebroadcasting strategy.
  • Relocate TestRunOutputsPersistErrorPropagates to consensus/inner_test.go for proper package alignment.

Test plan

  • All existing consensus/persist/ tests pass (A/B alternation, sequence picking, corruption, error propagation)
  • New persist/blocks_test.go tests pass (empty dir, single/multi-lane, corrupt/mismatched skip, DeleteBefore, filename roundtrip)
  • avail/inner_test.go and avail/state_test.go updated and passing with new NewState signature
  • consensus/inner_test.go updated with relocated persist-error-propagation test
  • go build ./... succeeds
  • gofmt -s -l clean

Ref: sei-protocol/sei-v3#512

Made with Cursor

@github-actions
Copy link

github-actions bot commented Feb 16, 2026

The latest Buf updates on your PR. Results from workflow Buf / buf (pull_request).

BuildFormatLintBreakingUpdated (UTC)
✅ passed✅ passed✅ passed✅ passedFeb 17, 2026, 4:51 AM

@codecov
Copy link

codecov bot commented Feb 16, 2026

Codecov Report

❌ Patch coverage is 74.25743% with 52 lines in your changes missing coverage. Please review.
✅ Project coverage is 57.23%. Comparing base (243cc2a) to head (f4a9c1e).

Files with missing lines Patch % Lines
...mint/internal/autobahn/consensus/persist/blocks.go 71.91% 13 Missing and 12 partials ⚠️
sei-tendermint/internal/autobahn/avail/state.go 65.62% 14 Missing and 8 partials ⚠️
...ei-tendermint/internal/autobahn/consensus/state.go 37.50% 4 Missing and 1 partial ⚠️
Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff            @@
##             main    #2896    +/-   ##
========================================
  Coverage   57.22%   57.23%            
========================================
  Files        2093     2094     +1     
  Lines      171771   171953   +182     
========================================
+ Hits        98294    98414   +120     
- Misses      64701    64749    +48     
- Partials     8776     8790    +14     
Flag Coverage Δ
sei-chain 52.70% <74.25%> (+0.01%) ⬆️
sei-cosmos 48.19% <ø> (+<0.01%) ⬆️
sei-db 68.72% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
sei-tendermint/internal/autobahn/avail/inner.go 95.52% <100.00%> (+4.09%) ⬆️
...ei-tendermint/internal/autobahn/consensus/inner.go 63.21% <ø> (ø)
...int/internal/autobahn/consensus/persist/persist.go 76.14% <100.00%> (ø)
...ei-tendermint/internal/autobahn/consensus/state.go 82.03% <37.50%> (-0.90%) ⬇️
sei-tendermint/internal/autobahn/avail/state.go 70.58% <65.62%> (-1.89%) ⬇️
...mint/internal/autobahn/consensus/persist/blocks.go 71.91% <71.91%> (ø)

... and 28 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Comment on lines +59 to +94
for lane, bs := range loaded.blocks {
q, ok := i.blocks[lane]
if !ok {
continue // skip blocks for unknown lanes
}
if len(bs) == 0 {
continue
}
// Find the minimum block number.
first := true
var minN types.BlockNumber
for n := range bs {
if first || n < minN {
minN = n
}
first = false
}
// Load contiguous blocks starting from minN. Stop at the first gap
// (e.g. a corrupt file that was skipped during load). Blocks after
// the gap will be re-fetched from peers.
q.first = minN
q.next = minN
for {
b, ok := bs[q.next]
if !ok {
break
}
q.q[q.next] = b
q.next++
}
// Advance the votes queue to match so headers() returns ErrPruned
// for already-committed blocks instead of blocking forever.
vq := i.votes[lane]
vq.first = minN
vq.next = minN
}

Check warning

Code scanning / CodeQL

Iteration over map Warning

Iteration over map may be a possible source of non-determinism
Comment on lines +70 to +75
for n := range bs {
if first || n < minN {
minN = n
}
first = false
}

Check warning

Code scanning / CodeQL

Iteration over map Warning

Iteration over map may be a possible source of non-determinism
Comment on lines +286 to +288
for lane, q := range inner.blocks {
m[lane] = q.first
}

Check warning

Code scanning / CodeQL

Iteration over map Warning

Iteration over map may be a possible source of non-determinism
Extract generic A/B file persistence into a reusable consensus/persist/
sub-package and add block-file persistence for crash-safe availability
state recovery.

Changes:
- Move persist.go and persist_test.go into consensus/persist/ (git mv to
  preserve history), exporting Persister, NewPersister, WriteAndSync,
  SuffixA, SuffixB.
- Add persist/blocks.go: per-block file persistence using
  <lane_hex>_<blocknum>.pb files in a blocks/ subdirectory, with load,
  delete-before, and header-mismatch validation.
- Wire avail.NewState to accept stateDir, create A/B persister for
  AppQC and BlockPersister for signed lane proposals, and restore both
  on restart (contiguous block runs, queue alignment).
- Update avail/state.go to persist AppQC on prune and delete obsolete
  block files after each AppQC advance.
- Thread PersistentStateDir from consensus.Config through to
  avail.NewState.
- Expand consensus/inner.go doc comment with full persistence design
  (what, why, recovery, write behavior, rebroadcasting).
- Move TestRunOutputsPersistErrorPropagates to consensus/inner_test.go
  for proper package alignment.
- Add comprehensive tests for blocks persistence (empty dir, multi-lane,
  corrupt/mismatched skip, DeleteBefore, filename roundtrip).

Ref: sei-protocol/sei-v3#512
Co-authored-by: Cursor <cursoragent@cursor.com>
@wen-coding wen-coding force-pushed the wen/persist_appqc_and_blocks branch from ebf93df to f4a9c1e Compare February 17, 2026 04:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant