Commit a809432
fix(portal): floor the stream-mode finality boundary at persisted finality (restart regression)
The wave-4 monotonic head cache and the wire's emitFinalize gate are in-memory only.
Across a restart, clampFinalizedToPortalHead adopts the startup /finalized-head probe
verbatim — a lagging load-balanced replica can report a head BELOW the safe checkpoint
ponder already persisted, and ponder's own migrate-time "cannot move backwards" guard
checks only the RPC finalized block, fetched BEFORE the clamp. Realtime then re-streams
(head, persisted] and re-executes every event on rows crash recovery cannot revert
(their reorg-table rows were deleted at finalize) — double-indexing — and the first
finalize in the range regresses the persisted safe checkpoint verbatim.
Fix, same shape as pipes-sdk's FinalizedWatermark (their PR #88): a floor seeded from
persisted state. clampFinalizedToPortalHead gains `floor`; a head below it clamps UP
(safe: (head, floor] is finalized history, identical across replicas) and overrides a
PORTAL_FINALIZED_HEAD pin below it. The wiring passes the per-chain persisted safe
checkpoint (crashRecoveryCheckpoint → checkpointBlockNumber) at getLocalSyncProgress,
and the previously adopted boundary at the omnichain/multichain backfill-cutover clamps
(shouldCatchup assigns ALL chains' boundaries when ANY chain advances, so one chain's
advance could adopt another's stale-LOW probe; isolated's per-chain break is immune).
Review fix (dzhelezov, High): checkpointBlockNumber is chainId-guarded. In omnichain
ordering finalizeOmnichain writes the OMNICHAIN checkpoint verbatim to every chain's
row (no per-chain where clause; "it is not an invariant that chainId and
checkpoint.chainId are the same"), so a row's checkpoint can encode another chain's
block height — as a floor it would either disable the Portal-head clamp (foreign height
above local RPC finality → the wave-4 stream-mode fatal, a crash-loop) or under-protect
(below the local safe point). A foreign-chain checkpoint now yields NO floor, mirroring
upstream's own crash-recovery chainId guard in runtime/historical.ts; multichain and
isolated write per-chain checkpoints and keep full protection.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>1 parent e2185c8 commit a809432
5 files changed
Lines changed: 367 additions & 26 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
86 | 86 | | |
87 | 87 | | |
88 | 88 | | |
89 | | - | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| 9 | + | |
9 | 10 | | |
10 | 11 | | |
11 | 12 | | |
12 | 13 | | |
| 14 | + | |
13 | 15 | | |
14 | 16 | | |
15 | 17 | | |
| |||
479 | 481 | | |
480 | 482 | | |
481 | 483 | | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
| 506 | + | |
| 507 | + | |
| 508 | + | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + | |
| 516 | + | |
| 517 | + | |
| 518 | + | |
| 519 | + | |
| 520 | + | |
| 521 | + | |
| 522 | + | |
| 523 | + | |
| 524 | + | |
| 525 | + | |
| 526 | + | |
| 527 | + | |
| 528 | + | |
| 529 | + | |
| 530 | + | |
| 531 | + | |
| 532 | + | |
| 533 | + | |
| 534 | + | |
| 535 | + | |
| 536 | + | |
| 537 | + | |
| 538 | + | |
| 539 | + | |
| 540 | + | |
| 541 | + | |
| 542 | + | |
| 543 | + | |
| 544 | + | |
| 545 | + | |
| 546 | + | |
| 547 | + | |
| 548 | + | |
| 549 | + | |
| 550 | + | |
| 551 | + | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
| 566 | + | |
| 567 | + | |
| 568 | + | |
| 569 | + | |
| 570 | + | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
| 574 | + | |
| 575 | + | |
| 576 | + | |
| 577 | + | |
| 578 | + | |
| 579 | + | |
| 580 | + | |
| 581 | + | |
| 582 | + | |
| 583 | + | |
| 584 | + | |
| 585 | + | |
| 586 | + | |
| 587 | + | |
| 588 | + | |
| 589 | + | |
| 590 | + | |
| 591 | + | |
| 592 | + | |
| 593 | + | |
| 594 | + | |
| 595 | + | |
| 596 | + | |
| 597 | + | |
| 598 | + | |
| 599 | + | |
| 600 | + | |
| 601 | + | |
| 602 | + | |
| 603 | + | |
| 604 | + | |
| 605 | + | |
| 606 | + | |
| 607 | + | |
| 608 | + | |
| 609 | + | |
| 610 | + | |
| 611 | + | |
| 612 | + | |
| 613 | + | |
| 614 | + | |
| 615 | + | |
| 616 | + | |
| 617 | + | |
| 618 | + | |
| 619 | + | |
| 620 | + | |
| 621 | + | |
| 622 | + | |
| 623 | + | |
| 624 | + | |
| 625 | + | |
482 | 626 | | |
483 | 627 | | |
484 | 628 | | |
| |||
0 commit comments