From 892cbc5af6e4201176b99c3effca0c8cf160d4ff Mon Sep 17 00:00:00 2001 From: Lorenzo Delgado Date: Thu, 1 Feb 2024 11:26:01 +0100 Subject: [PATCH 1/3] fix(graph-gateway): avoid processing chain heads older than latest seen block --- gateway-framework/src/chains/mod.rs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/gateway-framework/src/chains/mod.rs b/gateway-framework/src/chains/mod.rs index aa92dbfb..c3c30619 100644 --- a/gateway-framework/src/chains/mod.rs +++ b/gateway-framework/src/chains/mod.rs @@ -74,6 +74,7 @@ impl BlockCache { chain_head_tx, blocks_per_minute_tx, block_rate_estimator: block_rate::Estimator::new(C::poll_interval()), + latest_seen_block: None, number_to_hash: EpochCache::new(), hash_to_number: EpochCache::new(), pending: HashMap::new(), @@ -105,6 +106,8 @@ struct Actor { chain_head_tx: EventualWriter, blocks_per_minute_tx: EventualWriter, block_rate_estimator: block_rate::Estimator, + /// The latest block number seen from the chain head. This is used to avoid processing old chain heads. + latest_seen_block: Option, number_to_hash: EpochCache, hash_to_number: EpochCache, pending: HashMap>>>, @@ -131,7 +134,7 @@ impl Actor { ClientMsg::Err(unresolved) => self.handle_err(unresolved).await, }, else => break, - }; + } } tracing::error!("exit"); } @@ -166,6 +169,22 @@ impl Actor { } async fn handle_chain_head(&mut self, head: BlockHead) { + // Avoid processing chain heads older than the latest seen block. Such degradation can happen when the + // RPC provider reverts to, and reports, a block number prior to the previously known block number. + // See: https://www.notion.so/edgeandnode/2024-01-30-Gateway-RPC-issue-Ethereum-mainnet-a109a3f6a89b444290363d7d216bb7aa + if let Some(latest_seen_block) = self.latest_seen_block { + if head.block.number <= latest_seen_block { + tracing::warn!( + "Skipping update. Received chain head {} <= latest seen block ({})", + head.block.number, + latest_seen_block + ); + return; + } + } + self.latest_seen_block = Some(head.block.number); + + // Remove uncles from the cache for uncle in &head.uncles { let removed = self.hash_to_number.remove(uncle); if let Some(removed) = removed { From f2fdc6e553574627bed61eef5a1ea49eaab5ec62 Mon Sep 17 00:00:00 2001 From: Lorenzo Delgado Date: Thu, 1 Feb 2024 16:50:50 +0100 Subject: [PATCH 2/3] Update gateway-framework/src/chains/mod.rs Co-authored-by: Theo Butler --- gateway-framework/src/chains/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/gateway-framework/src/chains/mod.rs b/gateway-framework/src/chains/mod.rs index c3c30619..bd43325c 100644 --- a/gateway-framework/src/chains/mod.rs +++ b/gateway-framework/src/chains/mod.rs @@ -171,7 +171,6 @@ impl Actor { async fn handle_chain_head(&mut self, head: BlockHead) { // Avoid processing chain heads older than the latest seen block. Such degradation can happen when the // RPC provider reverts to, and reports, a block number prior to the previously known block number. - // See: https://www.notion.so/edgeandnode/2024-01-30-Gateway-RPC-issue-Ethereum-mainnet-a109a3f6a89b444290363d7d216bb7aa if let Some(latest_seen_block) = self.latest_seen_block { if head.block.number <= latest_seen_block { tracing::warn!( From 551d1d14457dcc10372939154f8a13d405311843 Mon Sep 17 00:00:00 2001 From: Lorenzo Delgado Date: Thu, 1 Feb 2024 17:13:29 +0100 Subject: [PATCH 3/3] Update gateway-framework/src/chains/mod.rs Co-authored-by: Theo Butler --- gateway-framework/src/chains/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gateway-framework/src/chains/mod.rs b/gateway-framework/src/chains/mod.rs index bd43325c..16961b20 100644 --- a/gateway-framework/src/chains/mod.rs +++ b/gateway-framework/src/chains/mod.rs @@ -172,7 +172,7 @@ impl Actor { // Avoid processing chain heads older than the latest seen block. Such degradation can happen when the // RPC provider reverts to, and reports, a block number prior to the previously known block number. if let Some(latest_seen_block) = self.latest_seen_block { - if head.block.number <= latest_seen_block { + if head.block.number < latest_seen_block { tracing::warn!( "Skipping update. Received chain head {} <= latest seen block ({})", head.block.number,