From 8eae0fa4439b01bda38bb619b67ffd991ecab809 Mon Sep 17 00:00:00 2001
From: Robert Habermeier <rphmeier@gmail.com>
Date: Wed, 7 Apr 2021 22:04:15 +0200
Subject: [PATCH] check for lost race before warning (#2833)

---
 .../node/core/approval-voting/src/import.rs   | 27 ++++++++++++++-----
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/polkadot/node/core/approval-voting/src/import.rs b/polkadot/node/core/approval-voting/src/import.rs
index 68dd5e59043..eef3d306f40 100644
--- a/polkadot/node/core/approval-voting/src/import.rs
+++ b/polkadot/node/core/approval-voting/src/import.rs
@@ -636,13 +636,26 @@ pub(crate) async fn handle_new_head(
 			match imported_block_info(ctx, env, block_hash, &block_header).await? {
 				Some(i) => imported_blocks_and_info.push((block_hash, block_header, i)),
 				None => {
-					// Such errors are likely spurious, but this prevents us from getting gaps
-					// in the approval-db.
-					tracing::warn!(
-						target: LOG_TARGET,
-						"Unable to gather info about imported block {:?}. Skipping chain.",
-						(block_hash, block_header.number),
-					);
+					// It's possible that we've lost a race with finality.
+					let (tx, rx) = oneshot::channel();
+					ctx.send_message(
+						ChainApiMessage::FinalizedBlockHash(block_header.number.clone(), tx).into()
+					).await;
+
+					let lost_to_finality = match rx.await {
+						Ok(Ok(Some(h))) if h != block_hash => true,
+						_ => false,
+					};
+
+					if !lost_to_finality {
+						// Such errors are likely spurious, but this prevents us from getting gaps
+						// in the approval-db.
+						tracing::warn!(
+							target: LOG_TARGET,
+							"Unable to gather info about imported block {:?}. Skipping chain.",
+							(block_hash, block_header.number),
+						);
+					}
 
 					return Ok(Vec::new());
 				},
-- 
GitLab