Skip to content

[hl-node][Mainnet] Panic: too many blocks to request in gossip forward_client_blocks after starting bootstrap; visor restarts child #141

Description

@dasoylemez-dev

Summary

Running a Mainnet non-validator with hl-visor / hl-node, I hit a hard panic in gossip forward_client_blocks immediately after starting bootstrap, with message "too many blocks to request". The hl-node process then exits; hl-visor logs "visor child in bad state, restarting" with child_stuck: true and child_running: false.

Separately (and often for long stretches), the node logs "execution behind?" (Querying stakes for high round / Querying jailed validators for high round) and "querying client blocks" lines may stop for 30+ minutes while peer connection attempts show "Timed out connecting to peer" in a tight loop. Local HyperEVM RPC on port 3001 is often unavailable while catch-up is incomplete.

I do not see a documented knob to raise limits or chunk bootstrap client-block requests; this looks like an internal assertion / bounds check in the node.

Environment

  • OS: Ubuntu 24.04
  • Chain: Mainnet
  • Command (via systemd): hl-visor run-non-validator --serve-eth-rpc (child: hl-node --chain Mainnet run-non-validator --serve-evm-rpc --replica-cmds-style actions)
  • Hardware: 128 GB RAM class; hl-node RSS often ~27-35 GB when observed
  • Gossip: ~/override_gossip_config.json with root_node_ips from API gossipRootIps, try_new_peers: true; n_gossip_peers experimented (default vs 20) — panic reproduced regardless
  • Public IP: ~/hl/override_public_ip_address set to server IPv4 (avoid IPv6 issues)
  • Firewall: inbound allows 4001/4002 (and broadly TCP/UDP per operator policy)
  • Related ops: I avoid systemd unit name / cmdline containing hl-visor where possible to sidestep journalctl-like processes makes hl-visor panic when run as systemd service #94-style proc matching.

Panic / Restart Sequence

  • Right after a successful peer greeting and bootstrap start:

"successfully received greeting from peer, send_abci=false Ip()
starting bootstrap @@ [start_round: Round(1226461227)] @ [end_round: Round(1226492203)]
tokio_spawn_forever crashing process name=gossip forward_client_blocks:
... task ... panicked with message "too many blocks to request"
client_block_reader error, ending task: Bounded TrySend error: closed @@ [tcp_stream.peer_addr(): Ok(:4001)]"

  • Then (tens of seconds later), visor:

"visor child in bad state, restarting @@ [child_stuck: true] @ [child_low_memory: false] @ [memory_usage: ...] @ [child_running: false] ..."

Other Symptoms

  • High volume of "gossip_server_connect_to_peer connected to abci stream" followed by "Timed out connecting to peer" (~5s pattern).
  • "execution behind?" ERROR spam with Round(...) advancing faster than estimated_*_valid_until catches up.
  • No new "querying client blocks" journal lines for long periods despite active peer attempts.

Expected Behavior

Non-validator should not panic when transitioning into bootstrap / client-block sync; large catch-up should be chunked or bounded without terminating the process. Visor restart then loses progress and amplifies sync pain.

Questions:

Is "too many blocks to request" a known condition when local state is far behind — is there a supported mitigation (config, flags, recommended topology)?

Can bootstrap / client-block fetching be made resilient (chunk smaller batches, retry without panic)?

Any metrics or log lines recommended to distinguish healthy catch-up vs stuck loops?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions