Observation (long-running stream-mode soak, chain 1 / ethereum)
The stream-realtime client hit its fail-loud unknown-parent path and exited (75/TEMPFAIL, by design; the supervisor restarted it and crash recovery resumed cleanly ~11s later, gap backfilled):
Error: Portal realtime: streamed block 25455459 (0xd481da308324da8bfbde16a9b99975d90c977e76e10d54dba037d82d0fb914cd) has an unknown parent 0x49f95d8bcca2c957d569df3e82f3588f8de68357a8d1a722409edd34e1f6e0ef — a reorg deeper than the unfinalized window, or a skipped block. Cannot reconcile safely; restart to re-sync from the finalized head.
Third-party check: no reorg — both blocks are canonical
Queried a public RPC (ethereum-rpc.publicnode.com) minutes after the event:
eth_getBlockByNumber(25455458) → hash 0x49f95d8bcca2c957d569df3e82f3588f8de68357a8d1a722409edd34e1f6e0ef — exactly the "unknown parent".
eth_getBlockByNumber(25455459) → hash 0xd481da308324da8bfbde16a9b99975d90c977e76e10d54dba037d82d0fb914cd, parent 0x49f95d… — exactly the streamed block.
So the error message's first hypothesis (deep reorg) is ruled out for this instance: the stream delivered the canonical N, and the canonical N-1 was missing from the client's unfinalized window. Either the stream never delivered N-1 (server-side skip / delivery gap) or the client received and then lost it (window-state bug: eviction, finalize consuming it early, or the redelivery handshake missing a case).
Impact
Availability, not correctness: the fail-loud path worked as designed, restart + crash recovery healed the gap with no data loss observed. But every such event is a full process restart; a recurring skip shape would turn into a restart churn.
Notes
Observation (long-running stream-mode soak, chain 1 / ethereum)
The stream-realtime client hit its fail-loud unknown-parent path and exited (75/TEMPFAIL, by design; the supervisor restarted it and crash recovery resumed cleanly ~11s later, gap backfilled):
Third-party check: no reorg — both blocks are canonical
Queried a public RPC (ethereum-rpc.publicnode.com) minutes after the event:
eth_getBlockByNumber(25455458)→ hash0x49f95d8bcca2c957d569df3e82f3588f8de68357a8d1a722409edd34e1f6e0ef— exactly the "unknown parent".eth_getBlockByNumber(25455459)→ hash0xd481da308324da8bfbde16a9b99975d90c977e76e10d54dba037d82d0fb914cd, parent0x49f95d…— exactly the streamed block.So the error message's first hypothesis (deep reorg) is ruled out for this instance: the stream delivered the canonical N, and the canonical N-1 was missing from the client's unfinalized window. Either the stream never delivered N-1 (server-side skip / delivery gap) or the client received and then lost it (window-state bug: eviction, finalize consuming it early, or the redelivery handshake missing a case).
Impact
Availability, not correctness: the fail-loud path worked as designed, restart + crash recovery healed the gap with no data loss observed. But every such event is a full process restart; a recurring skip shape would turn into a restart churn.
Notes