Merge remote-tracking branch 'origin/master' into na-jsonrpsee-core-client

This commit is contained in:
Niklas Adolfsson
2021-12-01 12:37:57 +01:00
5 changed files with 104 additions and 10 deletions
+1 -1
View File
@@ -10,6 +10,6 @@ codec = { package = "parity-scale-codec", version = "2", default-features = fals
[build-dependencies]
subxt = { path = ".." }
async-std = { version = "1.9.0", features = ["attributes"] }
sp-core = { package = "sp-core", git = "https://github.com/paritytech/substrate/", branch = "master" }
jsonrpsee-http-client = { git = "https://github.com/paritytech/jsonrpsee/", branch = "extract-async-client" }
async-std = { version = "1.9.0", features = ["attributes", "tokio1"] }
+33 -4
View File
@@ -22,6 +22,10 @@ use std::{
env,
fs,
net::TcpListener,
ops::{
Deref,
DerefMut,
},
path::Path,
process::Command,
sync::atomic::{
@@ -36,6 +40,10 @@ static SUBSTRATE_BIN_ENV_VAR: &str = "SUBSTRATE_NODE_PATH";
#[async_std::main]
async fn main() {
run().await;
}
async fn run() {
// Select substrate binary to run based on env var.
let substrate_bin =
env::var(SUBSTRATE_BIN_ENV_VAR).unwrap_or_else(|_| "substrate".to_owned());
@@ -49,7 +57,7 @@ async fn main() {
.arg(format!("--rpc-port={}", port))
.spawn();
let mut cmd = match cmd {
Ok(cmd) => cmd,
Ok(cmd) => KillOnDrop(cmd),
Err(e) => {
panic!("Cannot spawn substrate command '{}': {}", substrate_bin, e)
}
@@ -59,7 +67,6 @@ async fn main() {
let metadata_bytes: sp_core::Bytes = {
const MAX_RETRIES: usize = 20;
let mut retries = 0;
let mut wait_secs = 1;
let rpc_client = HttpClientBuilder::default()
.build(&format!("http://localhost:{}", port))
.expect("valid URL; qed");
@@ -75,9 +82,8 @@ async fn main() {
break res
}
_ => {
thread::sleep(time::Duration::from_secs(wait_secs));
thread::sleep(time::Duration::from_secs(1));
retries += 1;
wait_secs += 1;
}
};
}
@@ -145,3 +151,26 @@ fn next_open_port() -> Option<u16> {
}
}
}
/// If the substrate process isn't explicilty killed on drop,
/// it seems that panics that occur while the command is running
/// will leave it running and block the build step from ever finishing.
/// Wrapping it in this prevents this from happening.
struct KillOnDrop(std::process::Child);
impl Deref for KillOnDrop {
type Target = std::process::Child;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl DerefMut for KillOnDrop {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
impl Drop for KillOnDrop {
fn drop(&mut self) {
let _ = self.0.kill();
}
}