From d1bf24caefb92ec13b8d0b860a5f3ff36f7cb116 Mon Sep 17 00:00:00 2001
From: Arkadiy Paronyan <arkady.paronyan@gmail.com>
Date: Mon, 18 May 2020 18:42:25 +0200
Subject: [PATCH] Fix parallel code execution in wasmtime (#6055)

* Bump wasmtime version

* Proper test
---
 substrate/Cargo.lock                          | 16 ++++----
 .../executor/src/integration_tests/mod.rs     | 40 +++++++++++++------
 substrate/client/executor/wasmtime/Cargo.toml |  4 +-
 3 files changed, 37 insertions(+), 23 deletions(-)

diff --git a/substrate/Cargo.lock b/substrate/Cargo.lock
index 5e23615fdc8..70fb4956d40 100644
--- a/substrate/Cargo.lock
+++ b/substrate/Cargo.lock
@@ -8289,9 +8289,9 @@ version = "1.0.6"
 
 [[package]]
 name = "substrate-wasmtime"
-version = "0.16.0-threadsafe.2"
+version = "0.16.0-threadsafe.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b40a6f3d5d3c00754e348863fead4f37763c32eedf950f5b23df87769882311"
+checksum = "9b0d8eca5d0186e98c8d13399423853e2356b593e028b53e43b2aa35e9105a82"
 dependencies = [
  "anyhow",
  "backtrace",
@@ -8312,9 +8312,9 @@ dependencies = [
 
 [[package]]
 name = "substrate-wasmtime-jit"
-version = "0.16.0-threadsafe.2"
+version = "0.16.0-threadsafe.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09712de4f56a2c2912bee7763b0877d17d72cfb2237987d63ab78956907e7692"
+checksum = "e95772b1778186e4f5c9ae9148bab9911cddf563805a403dee418780e2ed14b4"
 dependencies = [
  "anyhow",
  "cfg-if",
@@ -8339,9 +8339,9 @@ dependencies = [
 
 [[package]]
 name = "substrate-wasmtime-profiling"
-version = "0.16.0-threadsafe.2"
+version = "0.16.0-threadsafe.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31505dd221f001634a54ea51472bc0058bcbde9186eaf8dd31d0859638121385"
+checksum = "1f8a0bf9ca20bee7d83338470247a3f1823158382ebd51fadefcc986e0a6c3de"
 dependencies = [
  "anyhow",
  "cfg-if",
@@ -8358,9 +8358,9 @@ dependencies = [
 
 [[package]]
 name = "substrate-wasmtime-runtime"
-version = "0.16.0-threadsafe.2"
+version = "0.16.0-threadsafe.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3708081f04d9216d4dee487abf94872065f930cf82e287bd0c5bdb57895460ba"
+checksum = "a559895fe1efab16d1c490199225ae35c153ed432ef87ebc177fb37edbd20c7c"
 dependencies = [
  "backtrace",
  "cc",
diff --git a/substrate/client/executor/src/integration_tests/mod.rs b/substrate/client/executor/src/integration_tests/mod.rs
index 07add57bb32..80b123ed4b5 100644
--- a/substrate/client/executor/src/integration_tests/mod.rs
+++ b/substrate/client/executor/src/integration_tests/mod.rs
@@ -626,19 +626,33 @@ fn heap_is_reset_between_calls(wasm_method: WasmExecutionMethod) {
 #[test_case(WasmExecutionMethod::Interpreted)]
 #[cfg_attr(feature = "wasmtime", test_case(WasmExecutionMethod::Compiled))]
 fn parallel_execution(wasm_method: WasmExecutionMethod) {
-	let threads: Vec<_> = (0..8).map(|_| std::thread::spawn(move || {
-		let mut ext = TestExternalities::default();
-		let mut ext = ext.ext();
-		assert_eq!(
-			call_in_wasm(
-				"test_twox_128",
-				&[0],
-				wasm_method.clone(),
-				&mut ext,
-			).unwrap(),
-			hex!("99e9d85137db46ef4bbea33613baafd5").to_vec().encode(),
-		);
-	})).collect();
+	let executor = std::sync::Arc::new(crate::WasmExecutor::new(
+		wasm_method,
+		Some(1024),
+		HostFunctions::host_functions(),
+		8,
+	));
+	let code_hash = blake2_256(WASM_BINARY).to_vec();
+	let threads: Vec<_> = (0..8).map(|_|
+		{
+			let executor = executor.clone();
+			let code_hash = code_hash.clone();
+			std::thread::spawn(move || {
+				let mut ext = TestExternalities::default();
+				let mut ext = ext.ext();
+				assert_eq!(
+					executor.call_in_wasm(
+						&WASM_BINARY[..],
+						Some(code_hash.clone()),
+						"test_twox_128",
+						&[0],
+						&mut ext,
+						sp_core::traits::MissingHostFunctions::Allow,
+					).unwrap(),
+					hex!("99e9d85137db46ef4bbea33613baafd5").to_vec().encode(),
+				);
+			})
+		}).collect();
 
 	for t in threads.into_iter() {
 		t.join().unwrap();
diff --git a/substrate/client/executor/wasmtime/Cargo.toml b/substrate/client/executor/wasmtime/Cargo.toml
index 8a424dfc2e3..f7f236cb6b6 100644
--- a/substrate/client/executor/wasmtime/Cargo.toml
+++ b/substrate/client/executor/wasmtime/Cargo.toml
@@ -21,8 +21,8 @@ sp-wasm-interface = { version = "2.0.0-dev", path = "../../../primitives/wasm-in
 sp-runtime-interface = { version = "2.0.0-dev", path = "../../../primitives/runtime-interface" }
 sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" }
 sp-allocator = { version = "2.0.0-dev", path = "../../../primitives/allocator" }
-wasmtime = { package = "substrate-wasmtime", version = "0.16.0-threadsafe.2" }
-wasmtime-runtime = { package = "substrate-wasmtime-runtime", version = "0.16.0-threadsafe.2" }
+wasmtime = { package = "substrate-wasmtime", version = "0.16.0-threadsafe.3" }
+wasmtime-runtime = { package = "substrate-wasmtime-runtime", version = "0.16.0-threadsafe.3" }
 wasmtime-environ = "0.16"
 cranelift-wasm = "0.63"
 cranelift-codegen = "0.63"
-- 
GitLab