From 909c1e494549068a8ad386bb81cd801e1564e78d Mon Sep 17 00:00:00 2001
From: ordian <write@reusable.software>
Date: Tue, 2 Jan 2024 11:13:16 +0100
Subject: [PATCH] malus: use spawn_blocking (#2804)

Looks like using `spawn` instead of `spawn_blocking` in malus is leading
to a deadlock somehow. I'm not sure why exactly, but switching to
`spawn_blocking` fixes
https://github.com/paritytech/disabling-e2e-tests/issues/1, at least for
`suggest-garbage-candidate` (didn't check other variants).

Maybe my assumption here was wrong:
https://github.com/paritytech/polkadot-sdk/pull/2184#discussion_r1403587674.

---------

Co-authored-by: Tsvetomir Dimitrov <tsvetomir@parity.io>
---
 polkadot/node/malus/src/variants/common.rs               | 2 +-
 .../malus/src/variants/dispute_finalized_candidates.rs   | 2 +-
 .../node/malus/src/variants/suggest_garbage_candidate.rs | 2 +-
 prdoc/pr_2804.prdoc                                      | 9 +++++++++
 4 files changed, 12 insertions(+), 3 deletions(-)
 create mode 100644 prdoc/pr_2804.prdoc

diff --git a/polkadot/node/malus/src/variants/common.rs b/polkadot/node/malus/src/variants/common.rs
index 92264cd653d..011fcc80e37 100644
--- a/polkadot/node/malus/src/variants/common.rs
+++ b/polkadot/node/malus/src/variants/common.rs
@@ -188,7 +188,7 @@ where
 		let _candidate_descriptor = candidate_descriptor.clone();
 		let mut subsystem_sender = subsystem_sender.clone();
 		let (sender, receiver) = std::sync::mpsc::channel();
-		self.spawner.spawn(
+		self.spawner.spawn_blocking(
 			"malus-get-validation-data",
 			Some("malus"),
 			Box::pin(async move {
diff --git a/polkadot/node/malus/src/variants/dispute_finalized_candidates.rs b/polkadot/node/malus/src/variants/dispute_finalized_candidates.rs
index 113ab026879..7f83c386090 100644
--- a/polkadot/node/malus/src/variants/dispute_finalized_candidates.rs
+++ b/polkadot/node/malus/src/variants/dispute_finalized_candidates.rs
@@ -95,7 +95,7 @@ where
 
 				let dispute_offset = self.dispute_offset;
 				let mut sender = subsystem_sender.clone();
-				self.spawner.spawn(
+				self.spawner.spawn_blocking(
 					"malus-dispute-finalized-block",
 					Some("malus"),
 					Box::pin(async move {
diff --git a/polkadot/node/malus/src/variants/suggest_garbage_candidate.rs b/polkadot/node/malus/src/variants/suggest_garbage_candidate.rs
index 817afb58437..cf0ff5f809d 100644
--- a/polkadot/node/malus/src/variants/suggest_garbage_candidate.rs
+++ b/polkadot/node/malus/src/variants/suggest_garbage_candidate.rs
@@ -113,7 +113,7 @@ where
 					let (sender, receiver) = std::sync::mpsc::channel();
 					let mut new_sender = subsystem_sender.clone();
 					let _candidate = candidate.clone();
-					self.spawner.spawn(
+					self.spawner.spawn_blocking(
 						"malus-get-validation-data",
 						Some("malus"),
 						Box::pin(async move {
diff --git a/prdoc/pr_2804.prdoc b/prdoc/pr_2804.prdoc
new file mode 100644
index 00000000000..456120741d9
--- /dev/null
+++ b/prdoc/pr_2804.prdoc
@@ -0,0 +1,9 @@
+title: Fix malus implementation.
+
+doc:
+  - audience: Node Dev
+    description: |
+      The malus implementation is used to test security of Polkadot.
+      It was broken. This fixes it.
+
+crates: [ ]
-- 
GitLab