Skip to content

Commit e6c5529

Browse files
apollo_gateway: move instantiate_validator to be async
1 parent cf45842 commit e6c5529

File tree

4 files changed

+28
-22
lines changed

4 files changed

+28
-22
lines changed

crates/apollo_gateway/src/gateway.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -256,9 +256,9 @@ impl ProcessTxBlockingTask {
256256
}
257257

258258
fn process_tx(self) -> GatewayResult<Nonce> {
259-
let mut stateful_transaction_validator = self
260-
.stateful_tx_validator_factory
261-
.instantiate_validator(self.state_reader_factory.as_ref(), self.runtime.clone())?;
259+
let mut stateful_transaction_validator = self.runtime.block_on(
260+
self.stateful_tx_validator_factory.instantiate_validator(self.state_reader_factory),
261+
)?;
262262

263263
let nonce = stateful_transaction_validator.extract_state_nonce_and_run_validations(
264264
&self.executable_tx,

crates/apollo_gateway/src/gateway_test.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ use crate::state_reader_test_utils::{local_test_state_reader_factory, TestStateR
9898
use crate::stateful_transaction_validator::{
9999
MockStatefulTransactionValidatorFactoryTrait,
100100
MockStatefulTransactionValidatorTrait,
101+
StatefulTransactionValidatorTrait,
101102
};
102103
use crate::stateless_transaction_validator::MockStatelessTransactionValidatorTrait;
103104

@@ -563,9 +564,13 @@ async fn process_tx_returns_error_when_extract_state_nonce_and_run_validations_f
563564
.expect_extract_state_nonce_and_run_validations()
564565
.return_once(|_, _, _| Err(expected_error));
565566

566-
mock_stateful_transaction_validator_factory
567-
.expect_instantiate_validator()
568-
.return_once(|_, _| Ok(Box::new(mock_stateful_transaction_validator)));
567+
mock_stateful_transaction_validator_factory.expect_instantiate_validator().return_once(|_| {
568+
Box::pin(async {
569+
Ok::<Box<dyn StatefulTransactionValidatorTrait>, _>(Box::new(
570+
mock_stateful_transaction_validator,
571+
))
572+
})
573+
});
569574

570575
let process_tx_task = process_tx_task(mock_stateful_transaction_validator_factory);
571576

@@ -608,7 +613,7 @@ async fn process_tx_returns_error_when_instantiating_validator_fails(
608613
};
609614
mock_stateful_transaction_validator_factory
610615
.expect_instantiate_validator()
611-
.return_once(|_, _| Err(expected_error));
616+
.return_once(|_| Box::pin(async { Err::<_, _>(expected_error) }));
612617

613618
let process_tx_task = process_tx_task(mock_stateful_transaction_validator_factory);
614619

crates/apollo_gateway/src/stateful_transaction_validator.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::sync::Arc;
2+
13
use apollo_gateway_config::config::StatefulTransactionValidatorConfig;
24
use apollo_gateway_types::deprecated_gateway_error::{
35
KnownStarknetErrorCode,
@@ -7,6 +9,7 @@ use apollo_gateway_types::deprecated_gateway_error::{
79
use apollo_gateway_types::errors::GatewaySpecError;
810
use apollo_mempool_types::communication::SharedMempoolClient;
911
use apollo_proc_macros::sequencer_latency_histogram;
12+
use async_trait::async_trait;
1013
use blockifier::blockifier::stateful_validator::{
1114
StatefulValidator,
1215
StatefulValidatorTrait as BlockifierStatefulValidatorTrait,
@@ -46,12 +49,12 @@ type BlockifierStatefulValidator = StatefulValidator<
4649
StateReaderAndContractManager<Box<dyn GatewayStateReaderWithCompiledClasses>>,
4750
>;
4851

52+
#[async_trait]
4953
#[cfg_attr(test, mockall::automock)]
5054
pub trait StatefulTransactionValidatorFactoryTrait: Send + Sync {
51-
fn instantiate_validator(
55+
async fn instantiate_validator(
5256
&self,
53-
state_reader_factory: &dyn StateReaderFactory,
54-
runtime: tokio::runtime::Handle,
57+
state_reader_factory: Arc<dyn StateReaderFactory>,
5558
) -> StatefulTransactionValidatorResult<Box<dyn StatefulTransactionValidatorTrait>>;
5659
}
5760
pub struct StatefulTransactionValidatorFactory {
@@ -60,17 +63,18 @@ pub struct StatefulTransactionValidatorFactory {
6063
pub contract_class_manager: ContractClassManager,
6164
}
6265

66+
#[async_trait]
6367
impl StatefulTransactionValidatorFactoryTrait for StatefulTransactionValidatorFactory {
6468
// TODO(Ayelet): Move state_reader_factory and chain_info to the struct.
65-
fn instantiate_validator(
69+
async fn instantiate_validator(
6670
&self,
67-
state_reader_factory: &dyn StateReaderFactory,
68-
runtime: tokio::runtime::Handle,
71+
state_reader_factory: Arc<dyn StateReaderFactory>,
6972
) -> StatefulTransactionValidatorResult<Box<dyn StatefulTransactionValidatorTrait>> {
7073
// TODO(yael 6/5/2024): consider storing the block_info as part of the
7174
// StatefulTransactionValidator and update it only once a new block is created.
72-
let state_reader = runtime
73-
.block_on(state_reader_factory.get_state_reader_from_latest_block())
75+
let state_reader = state_reader_factory
76+
.get_state_reader_from_latest_block()
77+
.await
7478
.map_err(|err| GatewaySpecError::UnexpectedError {
7579
data: format!("Internal server error: {err}"),
7680
})
@@ -80,7 +84,7 @@ impl StatefulTransactionValidatorFactoryTrait for StatefulTransactionValidatorFa
8084
e,
8185
)
8286
})?;
83-
let latest_block_info = runtime.block_on(get_latest_block_info(&state_reader))?;
87+
let latest_block_info = get_latest_block_info(&state_reader).await?;
8488

8589
let state_reader_and_contract_manager = StateReaderAndContractManager {
8690
state_reader,

crates/apollo_gateway/src/stateful_transaction_validator_test.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ async fn test_extract_state_nonce_and_run_validations(
156156
}
157157

158158
#[rstest]
159-
#[tokio::test(flavor = "multi_thread")]
159+
#[tokio::test]
160160
async fn test_instantiate_validator() {
161161
let stateful_validator_factory = StatefulTransactionValidatorFactory {
162162
config: StatefulTransactionValidatorConfig::default(),
@@ -174,11 +174,8 @@ async fn test_instantiate_validator() {
174174
.expect_get_state_reader_from_latest_block()
175175
.return_once(move || latest_state_reader);
176176

177-
// TODO(Itamar): Remove using runtime when instantiate_validator is async.
178-
let validator = tokio::task::block_in_place(|| {
179-
stateful_validator_factory
180-
.instantiate_validator(&mock_state_reader_factory, tokio::runtime::Handle::current())
181-
});
177+
let validator =
178+
stateful_validator_factory.instantiate_validator(Arc::new(mock_state_reader_factory)).await;
182179
assert!(validator.is_ok());
183180
}
184181

0 commit comments

Comments
 (0)