From 9545f91757ad056537f7b9fbb372ac450e0ab7af Mon Sep 17 00:00:00 2001 From: Hubert Bugaj Date: Mon, 16 Feb 2026 09:26:40 +0100 Subject: [PATCH 1/2] fix: don't mark tipsets with temporal errors as permanently bad --- src/chain_sync/chain_follower.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/chain_sync/chain_follower.rs b/src/chain_sync/chain_follower.rs index ef7cebc16ec4..4764046293e1 100644 --- a/src/chain_sync/chain_follower.rs +++ b/src/chain_sync/chain_follower.rs @@ -22,7 +22,9 @@ use crate::{ chain::ChainStore, chain_sync::{ ForkSyncInfo, ForkSyncStage, SyncStatus, SyncStatusReport, TipsetValidator, - bad_block_cache::BadBlockCache, metrics, tipset_syncer::validate_tipset, + bad_block_cache::BadBlockCache, + metrics, + tipset_syncer::{TipsetSyncerError, validate_tipset}, }, libp2p::{NetworkEvent, PubsubMessage, hello::HelloRequest}, message_pool::{MessagePool, MpoolRpcProvider}, @@ -846,6 +848,14 @@ impl SyncTask { tipset, is_proposed_head, }), + // If temporal drift error, don't mark as bad, just skip validation and try again + // later. This mirrors internal logic where temporal drift doesn't mark a block as + // bad permanently, since it could be valid later on. If not done, a single + // time-traveling block could cause the node to be stuck without making progress. + Err(e) if matches!(e, TipsetSyncerError::TimeTravellingBlock { .. }) => { + warn!("Time travelling block detected, skipping tipset for now: {e}"); + None + } Err(e) => { warn!("Error validating tipset: {e}"); Some(SyncEvent::BadTipset(tipset)) From b7a27e3022978c096a6c91042bcece7f197e9fe7 Mon Sep 17 00:00:00 2001 From: Hubert Bugaj Date: Mon, 16 Feb 2026 11:00:17 +0100 Subject: [PATCH 2/2] changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3663f7721bfa..9f1a826cfbd3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,8 @@ ### Fixed +- [#6613](https://github.com/ChainSafe/forest/pull/6613): Fixed chain sync getting stuck when encountering time-travelling blocks by not marking the corresponding tipsets as permanently bad. + ## Forest v0.32.1 "Malfoy" This is a non-mandatory release for all node operators. It sets F3 initial power table on calibnet for late F3 participation and F3 data verification scenarios. It also includes new V2 RPC methods, a few bug fixes and `lotus-gateway` compatibility fixes.