From b25c343a8fda18f3bfffb7d981a0a8726ba36310 Mon Sep 17 00:00:00 2001 From: Arsenii Kulikov Date: Sat, 17 Feb 2024 14:56:23 +0400 Subject: [PATCH 1/5] fix(providers): remove locks on requests --- crates/common/src/provider/runtime_transport.rs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/crates/common/src/provider/runtime_transport.rs b/crates/common/src/provider/runtime_transport.rs index eefb740e9e47..1166775294b8 100644 --- a/crates/common/src/provider/runtime_transport.rs +++ b/crates/common/src/provider/runtime_transport.rs @@ -215,15 +215,12 @@ impl RuntimeTransport { let mut inner = this.inner.write().await; *inner = Some(this.connect().await.map_err(TransportErrorKind::custom)?) } - - let mut inner = this.inner.write().await; + // SAFETY: We just checked that the inner transport exists. - let inner_mut = inner.as_mut().expect("We should have an inner transport."); - - match inner_mut { - InnerTransport::Http(http) => http.call(req), - InnerTransport::Ws(ws) => ws.call(req), - InnerTransport::Ipc(ipc) => ipc.call(req), + match this.inner.read().await.as_ref().unwrap().clone() { + InnerTransport::Http(mut http) => http.call(req), + InnerTransport::Ws(mut ws) => ws.call(req), + InnerTransport::Ipc(mut ipc) => ipc.call(req), } .await }) From c95954540bffbf9300efc5bc05f7b50db386a4c9 Mon Sep 17 00:00:00 2001 From: Arsenii Kulikov Date: Sat, 17 Feb 2024 15:01:04 +0400 Subject: [PATCH 2/5] fmt --- crates/common/src/provider/runtime_transport.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/common/src/provider/runtime_transport.rs b/crates/common/src/provider/runtime_transport.rs index 1166775294b8..8bb34249bb44 100644 --- a/crates/common/src/provider/runtime_transport.rs +++ b/crates/common/src/provider/runtime_transport.rs @@ -215,7 +215,7 @@ impl RuntimeTransport { let mut inner = this.inner.write().await; *inner = Some(this.connect().await.map_err(TransportErrorKind::custom)?) } - + // SAFETY: We just checked that the inner transport exists. match this.inner.read().await.as_ref().unwrap().clone() { InnerTransport::Http(mut http) => http.call(req), From cb3ea24af97e709c5715900050230669ecdbb7db Mon Sep 17 00:00:00 2001 From: Arsenii Kulikov Date: Sat, 17 Feb 2024 17:06:55 +0400 Subject: [PATCH 3/5] refactor --- .../common/src/provider/runtime_transport.rs | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/crates/common/src/provider/runtime_transport.rs b/crates/common/src/provider/runtime_transport.rs index 8bb34249bb44..96452313d406 100644 --- a/crates/common/src/provider/runtime_transport.rs +++ b/crates/common/src/provider/runtime_transport.rs @@ -211,16 +211,31 @@ impl RuntimeTransport { pub fn request(&self, req: RequestPacket) -> TransportFut<'static> { let this = self.clone(); Box::pin(async move { - if this.inner.read().await.is_none() { - let mut inner = this.inner.write().await; - *inner = Some(this.connect().await.map_err(TransportErrorKind::custom)?) + let mut inner = this.inner.read().await; + if inner.is_none() { + drop(inner); + let mut inner_mut = this.inner.write().await; + if inner_mut.is_none() { + *inner_mut = Some(this.connect().await.map_err(TransportErrorKind::custom)?); + } + drop(inner_mut); + inner = this.inner.read().await; } // SAFETY: We just checked that the inner transport exists. - match this.inner.read().await.as_ref().unwrap().clone() { - InnerTransport::Http(mut http) => http.call(req), - InnerTransport::Ws(mut ws) => ws.call(req), - InnerTransport::Ipc(mut ipc) => ipc.call(req), + match inner.as_ref().unwrap() { + InnerTransport::Http(http) => { + let mut http = http; + http.call(req) + } + InnerTransport::Ws(ws) => { + let mut ws = ws; + ws.call(req) + } + InnerTransport::Ipc(ipc) => { + let mut ipc = ipc; + ipc.call(req) + } } .await }) From 036b2351fa8cd75f01f37700dac5cb71cea7fa3a Mon Sep 17 00:00:00 2001 From: Arsenii Kulikov Date: Sat, 17 Feb 2024 18:27:01 +0400 Subject: [PATCH 4/5] nits --- crates/common/src/provider/runtime_transport.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crates/common/src/provider/runtime_transport.rs b/crates/common/src/provider/runtime_transport.rs index 96452313d406..a6f0bb11ebf2 100644 --- a/crates/common/src/provider/runtime_transport.rs +++ b/crates/common/src/provider/runtime_transport.rs @@ -214,16 +214,17 @@ impl RuntimeTransport { let mut inner = this.inner.read().await; if inner.is_none() { drop(inner); - let mut inner_mut = this.inner.write().await; - if inner_mut.is_none() { - *inner_mut = Some(this.connect().await.map_err(TransportErrorKind::custom)?); + { + let mut inner_mut = this.inner.write().await; + if inner_mut.is_none() { + *inner_mut = Some(this.connect().await.map_err(TransportErrorKind::custom)?); + } } - drop(inner_mut); inner = this.inner.read().await; } // SAFETY: We just checked that the inner transport exists. - match inner.as_ref().unwrap() { + match inner.as_ref().expect("must've been initialized") { InnerTransport::Http(http) => { let mut http = http; http.call(req) From 255c767705e7f496694bffbc95a1a65e850e2379 Mon Sep 17 00:00:00 2001 From: Arsenii Kulikov Date: Sat, 17 Feb 2024 18:49:55 +0400 Subject: [PATCH 5/5] fmt --- crates/common/src/provider/runtime_transport.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/common/src/provider/runtime_transport.rs b/crates/common/src/provider/runtime_transport.rs index a6f0bb11ebf2..eab2addb81dd 100644 --- a/crates/common/src/provider/runtime_transport.rs +++ b/crates/common/src/provider/runtime_transport.rs @@ -217,7 +217,8 @@ impl RuntimeTransport { { let mut inner_mut = this.inner.write().await; if inner_mut.is_none() { - *inner_mut = Some(this.connect().await.map_err(TransportErrorKind::custom)?); + *inner_mut = + Some(this.connect().await.map_err(TransportErrorKind::custom)?); } } inner = this.inner.read().await;