Skip to content

Commit 64b5d27

Browse files
apollo_gateway: insert stateful_tx_validator creating to ProcessTxBlockingTask constructor
1 parent 3d7c600 commit 64b5d27

File tree

5 files changed

+61
-42
lines changed

5 files changed

+61
-42
lines changed

crates/apollo_gateway/src/gateway.rs

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ use crate::state_reader::StateReaderFactory;
4646
use crate::stateful_transaction_validator::{
4747
StatefulTransactionValidatorFactory,
4848
StatefulTransactionValidatorFactoryTrait,
49+
StatefulTransactionValidatorTrait,
4950
};
5051
use crate::stateless_transaction_validator::{
5152
StatelessTransactionValidator,
@@ -133,13 +134,14 @@ impl Gateway {
133134
self.stateless_tx_validator.validate(&tx)?;
134135

135136
let tx_signature = tx.signature().clone();
136-
let internal_tx =
137-
self.transaction_converter.convert_rpc_tx_to_internal_rpc_tx(tx).await.map_err(
138-
|e| {
139-
warn!("Failed to convert RPC transaction to internal RPC transaction: {}", e);
140-
transaction_converter_err_to_deprecated_gw_err(&tx_signature, e)
141-
},
142-
)?;
137+
let internal_tx = self
138+
.transaction_converter
139+
.convert_rpc_tx_to_internal_rpc_tx(tx.clone())
140+
.await
141+
.map_err(|e| {
142+
warn!("Failed to convert RPC transaction to internal RPC transaction: {}", e);
143+
transaction_converter_err_to_deprecated_gw_err(&tx_signature, e)
144+
})?;
143145

144146
let executable_tx = self
145147
.transaction_converter
@@ -154,7 +156,16 @@ impl Gateway {
154156
})?;
155157

156158
let blocking_task =
157-
ProcessTxBlockingTask::new(self, executable_tx, tokio::runtime::Handle::current());
159+
ProcessTxBlockingTask::new(self, executable_tx, tokio::runtime::Handle::current())
160+
.await
161+
.map_err(|e| {
162+
info!(
163+
"Gateway validation failed for tx with signature: {:?} with error: {}",
164+
&tx_signature, e
165+
);
166+
metric_counters.record_add_tx_failure(&e);
167+
e
168+
})?;
158169
// Run the blocking task in the current span.
159170
let curr_span = Span::current();
160171
let handle =
@@ -233,35 +244,32 @@ impl Gateway {
233244
/// CPU-intensive transaction processing, spawned in a blocking thread to avoid blocking other tasks
234245
/// from running.
235246
struct ProcessTxBlockingTask {
236-
stateful_tx_validator_factory: Arc<dyn StatefulTransactionValidatorFactoryTrait>,
237-
state_reader_factory: Arc<dyn StateReaderFactory>,
247+
stateful_tx_validator: Box<dyn StatefulTransactionValidatorTrait + Send>,
238248
mempool_client: SharedMempoolClient,
239249
executable_tx: AccountTransaction,
240250
runtime: tokio::runtime::Handle,
241251
}
242252

243253
impl ProcessTxBlockingTask {
244-
pub fn new(
254+
pub async fn new(
245255
gateway: &Gateway,
246256
executable_tx: AccountTransaction,
247257
runtime: tokio::runtime::Handle,
248-
) -> Self {
249-
Self {
250-
stateful_tx_validator_factory: gateway.stateful_tx_validator_factory.clone(),
251-
state_reader_factory: gateway.state_reader_factory.clone(),
258+
) -> GatewayResult<Self> {
259+
let stateful_tx_validator = gateway
260+
.stateful_tx_validator_factory
261+
.instantiate_validator(gateway.state_reader_factory.as_ref())
262+
.await?;
263+
Ok(Self {
264+
stateful_tx_validator,
252265
mempool_client: gateway.mempool_client.clone(),
253266
executable_tx,
254267
runtime,
255-
}
268+
})
256269
}
257270

258-
fn process_tx(self) -> GatewayResult<Nonce> {
259-
let mut stateful_transaction_validator = self.runtime.block_on(
260-
self.stateful_tx_validator_factory
261-
.instantiate_validator(self.state_reader_factory.as_ref()),
262-
)?;
263-
264-
let nonce = stateful_transaction_validator.extract_state_nonce_and_run_validations(
271+
fn process_tx(mut self) -> GatewayResult<Nonce> {
272+
let nonce = self.stateful_tx_validator.extract_state_nonce_and_run_validations(
265273
&self.executable_tx,
266274
self.mempool_client,
267275
self.runtime,

crates/apollo_gateway/src/gateway_test.rs

Lines changed: 24 additions & 14 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+
StatefulTransactionValidatorFactoryTrait,
101102
StatefulTransactionValidatorTrait,
102103
};
103104
use crate::stateless_transaction_validator::MockStatelessTransactionValidatorTrait;
@@ -316,12 +317,18 @@ async fn run_add_tx_and_extract_metrics(
316317
AddTxResults { result, metric_handle_for_queries, metrics }
317318
}
318319

319-
fn process_tx_task(
320+
async fn process_tx_task(
320321
stateful_transaction_validator_factory: MockStatefulTransactionValidatorFactoryTrait,
321322
) -> ProcessTxBlockingTask {
323+
let state_reader_factory = Arc::new(MockStateReaderFactory::new());
324+
let stateful_tx_validator = StatefulTransactionValidatorFactoryTrait::instantiate_validator(
325+
&stateful_transaction_validator_factory,
326+
state_reader_factory.as_ref(),
327+
)
328+
.await
329+
.expect("instantiate_validator should be mocked in tests");
322330
ProcessTxBlockingTask {
323-
stateful_tx_validator_factory: Arc::new(stateful_transaction_validator_factory),
324-
state_reader_factory: Arc::new(MockStateReaderFactory::new()),
331+
stateful_tx_validator,
325332
mempool_client: Arc::new(MockMempoolClient::new()),
326333
executable_tx: executable_invoke_tx(invoke_args()),
327334
runtime: tokio::runtime::Handle::current(),
@@ -572,7 +579,7 @@ async fn process_tx_returns_error_when_extract_state_nonce_and_run_validations_f
572579
})
573580
});
574581

575-
let process_tx_task = process_tx_task(mock_stateful_transaction_validator_factory);
582+
let process_tx_task = process_tx_task(mock_stateful_transaction_validator_factory).await;
576583

577584
let result = tokio::task::spawn_blocking(move || process_tx_task.process_tx()).await.unwrap();
578585

@@ -603,22 +610,25 @@ async fn stateless_transaction_validator_error(mut mock_dependencies: MockDepend
603610

604611
#[rstest]
605612
#[tokio::test]
606-
async fn process_tx_returns_error_when_instantiating_validator_fails(
613+
async fn add_tx_returns_error_when_instantiating_validator_fails(
614+
mut mock_dependencies: MockDependencies,
607615
mut mock_stateful_transaction_validator_factory: MockStatefulTransactionValidatorFactoryTrait,
608616
) {
617+
// Prepare transaction conversion to reach instantiation.
618+
let tx_args = invoke_args();
619+
setup_transaction_converter_mock(&mut mock_dependencies.mock_transaction_converter, &tx_args);
620+
621+
// Fail validator instantiation.
609622
let error_code = StarknetErrorCode::UnknownErrorCode("StarknetErrorCode.InternalError".into());
610-
let expected_error = StarknetError {
611-
code: error_code.clone(),
612-
message: "placeholder".into(), // Message is not checked
613-
};
623+
let expected_error = StarknetError { code: error_code.clone(), message: "placeholder".into() };
614624
mock_stateful_transaction_validator_factory
615625
.expect_instantiate_validator()
616626
.return_once(|_| Box::pin(async { Err::<_, _>(expected_error) }));
617627

618-
let process_tx_task = process_tx_task(mock_stateful_transaction_validator_factory);
619-
620-
let result = tokio::task::spawn_blocking(move || process_tx_task.process_tx()).await.unwrap();
628+
// Build gateway and inject the failing factory.
629+
let mut gateway = mock_dependencies.gateway();
630+
gateway.stateful_tx_validator_factory = Arc::new(mock_stateful_transaction_validator_factory);
621631

622-
assert!(result.is_err());
623-
assert_eq!(result.unwrap_err().code, error_code);
632+
let err = gateway.add_tx(tx_args.get_rpc_tx(), p2p_message_metadata()).await.unwrap_err();
633+
assert_eq!(err.code, error_code);
624634
}

crates/apollo_gateway/src/state_reader.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ pub trait MempoolStateReader: BlockifierStateReader + Send + Sync {
1919
async fn get_block_info(&self) -> StateResult<BlockInfo>;
2020
}
2121

22+
#[async_trait]
2223
#[cfg_attr(test, automock)]
2324
#[async_trait]
2425
pub trait StateReaderFactory: Send + Sync {

crates/apollo_gateway/src/state_reader_test_utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use apollo_state_sync_types::communication::StateSyncClientResult;
2-
use axum::async_trait;
2+
use async_trait::async_trait;
33
use blockifier::context::BlockContext;
44
use blockifier::execution::contract_class::RunnableCompiledClass;
55
use blockifier::state::errors::StateError;

crates/apollo_gateway/src/stateful_transaction_validator.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ impl StatefulTransactionValidatorFactoryTrait for StatefulTransactionValidatorFa
141141
}
142142

143143
#[cfg_attr(test, mockall::automock)]
144-
pub trait StatefulTransactionValidatorTrait {
144+
pub trait StatefulTransactionValidatorTrait: Send {
145145
fn extract_state_nonce_and_run_validations(
146146
&mut self,
147147
executable_tx: &ExecutableTransaction,
@@ -150,12 +150,12 @@ pub trait StatefulTransactionValidatorTrait {
150150
) -> StatefulTransactionValidatorResult<Nonce>;
151151
}
152152

153-
pub struct StatefulTransactionValidator<B: BlockifierStatefulValidatorTrait> {
153+
pub struct StatefulTransactionValidator<B: BlockifierStatefulValidatorTrait + Send> {
154154
config: StatefulTransactionValidatorConfig,
155155
blockifier_stateful_tx_validator: B,
156156
}
157157

158-
impl<B: BlockifierStatefulValidatorTrait> StatefulTransactionValidatorTrait
158+
impl<B: BlockifierStatefulValidatorTrait + Send> StatefulTransactionValidatorTrait
159159
for StatefulTransactionValidator<B>
160160
{
161161
fn extract_state_nonce_and_run_validations(
@@ -179,7 +179,7 @@ impl<B: BlockifierStatefulValidatorTrait> StatefulTransactionValidatorTrait
179179
}
180180
}
181181

182-
impl<B: BlockifierStatefulValidatorTrait> StatefulTransactionValidator<B> {
182+
impl<B: BlockifierStatefulValidatorTrait + Send> StatefulTransactionValidator<B> {
183183
fn run_transaction_validations(
184184
&mut self,
185185
executable_tx: &ExecutableTransaction,

0 commit comments

Comments
 (0)