From 2c1a78782e34ea888b10f4ce1667c2c28692bdf2 Mon Sep 17 00:00:00 2001
From: Robert Habermeier <rphmeier@gmail.com>
Date: Fri, 18 Dec 2020 13:40:37 -0500
Subject: [PATCH] fix bug where we over-eagerly remove backing spans for
 candidates we validate ourselves (#2142)

* fix bug where we over-eagerly remove backing spans for candidates we validate ourselves

* jaeger: watch importing of statements
---
 polkadot/node/core/backing/src/lib.rs | 15 ++++++++++++++-
 polkadot/node/primitives/src/lib.rs   | 11 +++++++++++
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/polkadot/node/core/backing/src/lib.rs b/polkadot/node/core/backing/src/lib.rs
index 3de6c37e613..1604166a693 100644
--- a/polkadot/node/core/backing/src/lib.rs
+++ b/polkadot/node/core/backing/src/lib.rs
@@ -503,7 +503,6 @@ impl CandidateBackingJob {
 	) -> Result<(), Error> {
 		let candidate_hash = command.candidate_hash();
 		self.awaiting_validation.remove(&candidate_hash);
-		self.remove_unbacked_span(&candidate_hash);
 
 		match command {
 			ValidatedCandidateCommand::Second(res) => {
@@ -664,6 +663,12 @@ impl CandidateBackingJob {
 		&mut self,
 		statement: &SignedFullStatement,
 	) -> Result<Option<TableSummary>, Error> {
+		let _span = {
+			// create a span only for candidates we're already aware of.
+			let candidate_hash = statement.payload().candidate_hash();
+			self.get_unbacked_statement_child(&candidate_hash, statement.validator_index())
+		};
+
 		let stmt = primitive_statement_to_table(statement);
 
 		let summary = self.table.import_statement(&self.table_context, stmt);
@@ -854,6 +859,14 @@ impl CandidateBackingJob {
 		self.unbacked_candidates.get(hash).map(|span| span.child("validation"))
 	}
 
+	fn get_unbacked_statement_child(&self, hash: &CandidateHash, validator: ValidatorIndex) -> Option<JaegerSpan> {
+		self.unbacked_candidates.get(hash).map(|span| {
+			let mut span = span.child("import-statement");
+			span.add_string_tag("validator-index", &format!("{}", validator));
+			span
+		})
+	}
+
 	fn remove_unbacked_span(&mut self, hash: &CandidateHash) {
 		self.unbacked_candidates.remove(hash);
 	}
diff --git a/polkadot/node/primitives/src/lib.rs b/polkadot/node/primitives/src/lib.rs
index 82ac5dd28e9..fa4fe750c9c 100644
--- a/polkadot/node/primitives/src/lib.rs
+++ b/polkadot/node/primitives/src/lib.rs
@@ -63,6 +63,17 @@ pub enum Statement {
 }
 
 impl Statement {
+	/// Get the candidate hash referenced by this statement.
+	///
+	/// If this is a `Statement::Seconded`, this does hash the candidate receipt, which may be expensive
+	/// for large candidates.
+	pub fn candidate_hash(&self) -> CandidateHash {
+		match *self {
+			Statement::Valid(ref h) | Statement::Invalid(ref h) => *h,
+			Statement::Seconded(ref c) => c.hash(),
+		}
+	}
+
 	/// Transform this statement into its compact version, which references only the hash
 	/// of the candidate.
 	pub fn to_compact(&self) -> CompactStatement {
-- 
GitLab