Skip to content

fix(archiver): always advance L1-to-L2 messages syncpoint to current L1 block#22154

Open
spalladino wants to merge 1 commit intomerge-train/spartanfrom
palla/archiver-advance-messages-syncpoint
Open

fix(archiver): always advance L1-to-L2 messages syncpoint to current L1 block#22154
spalladino wants to merge 1 commit intomerge-train/spartanfrom
palla/archiver-advance-messages-syncpoint

Conversation

@spalladino
Copy link
Copy Markdown
Contributor

@spalladino spalladino commented Mar 30, 2026

Motivation

The L1-to-L2 messages syncpoint tracked the L1 block of the last downloaded message. If no messages were sent for a long time, the syncpoint got stuck and the next non-empty sync iteration re-scanned old block ranges. The rolling hash check and rollback logic already handle L1 reorgs, making this conservative syncpoint advancement redundant.

Approach

The syncpoint now always advances to currentL1BlockNumber on success. After downloading, local state is verified against L1; on mismatch the syncpoint rolls back and the operation retries (up to 3 times within the same L1 sync iteration).

Extras

Method setInboxTreeInProgress was called before messages were downloaded, allowing concurrent RPC reads to see a checkpoint as sealed before its messages were available. Also, retrieveL1ToL2Message would scan a large block range, as opposed to just using the L1 sync data already stored in the archiver.

Changes

  • archiver: Refactored handleL1ToL2Messages to always advance the syncpoint on success, with rollback-and-retry on mismatch. Merged setInboxTreeInProgress and setMessageSynchedL1Block into a single atomic setMessageSyncState. Re-throws unexpected (non-MessageStoreError) exceptions instead of swallowing them. Updated README to document the new sync logic.
  • archiver (tests): Updated store tests for setMessageSyncState. Improved fake_l1_state to correctly filter messages by block number in getState and support getMessageSentEventByHash.
  • ethereum: Updated InboxContract.getMessageSentEventByHash signature to take (msgHash, l1BlockHash) instead of (hash, fromBlock, toBlock).
  • foundation: Added retryTimes utility function (like retryUntil but with a retry count instead of a timeout).

@spalladino spalladino added ci-no-fail-fast Sets NO_FAIL_FAST in the CI so the run is not aborted on the first failure backport-to-v4-next labels Mar 30, 2026
@spalladino spalladino marked this pull request as draft March 30, 2026 19:35
…L1 block

The messages syncpoint used to track the L1 block of the last downloaded
message, causing unnecessary re-scans when no messages were sent for a
long time. Now it always advances to currentL1BlockNumber, with the
rolling hash check and rollback logic providing reorg protection.

Also moves setInboxTreeInProgress to after message insertion to prevent
concurrent reads from seeing a checkpoint as sealed before its messages
are available, and fixes a pre-existing division by zero in metrics when
a batch has no messages.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@spalladino spalladino force-pushed the palla/archiver-advance-messages-syncpoint branch from 2d4461c to 77c7876 Compare March 30, 2026 21:52
@spalladino spalladino marked this pull request as ready for review March 30, 2026 21:55
name = '',
maxRetries: number,
retryInterval = 1,
) {
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm surprised nothing else fit :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport-to-v4-next ci-no-fail-fast Sets NO_FAIL_FAST in the CI so the run is not aborted on the first failure

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants