Skip to content

Commit 842c9bf

Browse files
authored
fix: avoid blocking worker threads (#4857)
1 parent 44da532 commit 842c9bf

File tree

2 files changed

+15
-11
lines changed

2 files changed

+15
-11
lines changed

crates/edr_napi/src/provider.rs

+8-6
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,14 @@ impl Provider {
7373
if let Some((method_name, provider_error)) = reason.provider_error() {
7474
// Ignore potential failure of logging, as returning the original error is more
7575
// important
76-
if let Err(error) = provider
77-
.log_failed_deserialization(&method_name, &provider_error)
76+
let _result = runtime::Handle::current()
77+
.spawn_blocking(move || {
78+
provider.log_failed_deserialization(&method_name, &provider_error)
79+
})
7880
.await
79-
{
80-
log::error!("Failed to log deserialization error: {error}");
81-
}
81+
.map_err(|error| {
82+
napi::Error::new(Status::GenericFailure, error.to_string())
83+
})?;
8284
}
8385

8486
let data = serde_json::from_str(&json_request).ok();
@@ -105,7 +107,7 @@ impl Provider {
105107
};
106108

107109
let response = runtime::Handle::current()
108-
.spawn(async move { provider.handle_request(request).await })
110+
.spawn_blocking(move || provider.handle_request(request))
109111
.await
110112
.map_err(|e| napi::Error::new(Status::GenericFailure, e.to_string()))?;
111113

crates/edr_provider/src/lib.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use lazy_static::lazy_static;
2121
use logger::SyncLogger;
2222
use parking_lot::Mutex;
2323
use requests::{eth::handle_set_interval_mining, hardhat::rpc_types::ResetProviderConfig};
24-
use tokio::{runtime, sync::Mutex as AsyncMutex};
24+
use tokio::{runtime, sync::Mutex as AsyncMutex, task};
2525

2626
pub use self::{
2727
config::*,
@@ -118,24 +118,26 @@ impl<LoggerErrorT: Debug + Send + Sync + 'static> Provider<LoggerErrorT> {
118118
})
119119
}
120120

121-
pub async fn handle_request(
121+
/// Blocking method to handle a request.
122+
pub fn handle_request(
122123
&self,
123124
request: ProviderRequest,
124125
) -> Result<serde_json::Value, ProviderError<LoggerErrorT>> {
125-
let mut data = self.data.lock().await;
126+
let mut data = task::block_in_place(|| self.runtime.block_on(self.data.lock()));
126127

127128
match request {
128129
ProviderRequest::Single(request) => self.handle_single_request(&mut data, request),
129130
ProviderRequest::Batch(requests) => self.handle_batch_request(&mut data, requests),
130131
}
131132
}
132133

133-
pub async fn log_failed_deserialization(
134+
/// Blocking method to log a failed deserialization.
135+
pub fn log_failed_deserialization(
134136
&self,
135137
method_name: &str,
136138
error: &ProviderError<LoggerErrorT>,
137139
) -> Result<(), ProviderError<LoggerErrorT>> {
138-
let mut data = self.data.lock().await;
140+
let mut data = task::block_in_place(|| self.runtime.block_on(self.data.lock()));
139141
data.logger_mut()
140142
.print_method_logs(method_name, Some(error))
141143
.map_err(ProviderError::Logger)

0 commit comments

Comments
 (0)