Skip to content

Commit cf8b6d3

Browse files
apollo_gateway: insert stateful_tx_validator creating to ProcessTxBlockingTask constructor
1 parent 60ea01f commit cf8b6d3

File tree

3 files changed

+52
-34
lines changed

3 files changed

+52
-34
lines changed

crates/apollo_gateway/src/gateway.rs

Lines changed: 24 additions & 16 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,
@@ -154,7 +155,16 @@ impl Gateway {
154155
})?;
155156

156157
let blocking_task =
157-
ProcessTxBlockingTask::new(self, executable_tx, tokio::runtime::Handle::current());
158+
ProcessTxBlockingTask::new(self, executable_tx, tokio::runtime::Handle::current())
159+
.await
160+
.map_err(|e| {
161+
info!(
162+
"Gateway validation failed for tx with signature: {:?} with error: {}",
163+
&tx_signature, e
164+
);
165+
metric_counters.record_add_tx_failure(&e);
166+
e
167+
})?;
158168
// Run the blocking task in the current span.
159169
let curr_span = Span::current();
160170
let handle =
@@ -233,35 +243,33 @@ impl Gateway {
233243
/// CPU-intensive transaction processing, spawned in a blocking thread to avoid blocking other tasks
234244
/// from running.
235245
struct ProcessTxBlockingTask {
236-
stateful_tx_validator_factory: Arc<dyn StatefulTransactionValidatorFactoryTrait>,
237-
state_reader_factory: Arc<dyn StateReaderFactory>,
246+
stateful_transaction_validator: Box<dyn StatefulTransactionValidatorTrait + Send>,
238247
mempool_client: SharedMempoolClient,
239248
executable_tx: AccountTransaction,
240249
runtime: tokio::runtime::Handle,
241250
}
242251

243252
impl ProcessTxBlockingTask {
244-
pub fn new(
253+
pub async fn new(
245254
gateway: &Gateway,
246255
executable_tx: AccountTransaction,
247256
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(),
257+
) -> GatewayResult<Self> {
258+
// TODO(Itamar): Extract creating validator to a separate function.
259+
let stateful_transaction_validator = gateway
260+
.stateful_tx_validator_factory
261+
.instantiate_validator(gateway.state_reader_factory.clone())
262+
.await?;
263+
Ok(Self {
264+
stateful_transaction_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-
// TODO(Itamar): Remove this block_on by extracting the instantiation to the async path.
260-
let mut stateful_transaction_validator = self.runtime.block_on(
261-
self.stateful_tx_validator_factory.instantiate_validator(self.state_reader_factory),
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_transaction_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
};
102103
use crate::stateless_transaction_validator::MockStatelessTransactionValidatorTrait;
103104

@@ -315,12 +316,18 @@ async fn run_add_tx_and_extract_metrics(
315316
AddTxResults { result, metric_handle_for_queries, metrics }
316317
}
317318

318-
fn process_tx_task(
319+
async fn process_tx_task(
319320
stateful_transaction_validator_factory: MockStatefulTransactionValidatorFactoryTrait,
320321
) -> ProcessTxBlockingTask {
322+
let state_reader_factory = Arc::new(MockStateReaderFactory::new());
323+
let stateful_tx_validator = StatefulTransactionValidatorFactoryTrait::instantiate_validator(
324+
&stateful_transaction_validator_factory,
325+
state_reader_factory,
326+
)
327+
.await
328+
.expect("instantiate_validator should be mocked in tests");
321329
ProcessTxBlockingTask {
322-
stateful_tx_validator_factory: Arc::new(stateful_transaction_validator_factory),
323-
state_reader_factory: Arc::new(MockStateReaderFactory::new()),
330+
stateful_transaction_validator: stateful_tx_validator,
324331
mempool_client: Arc::new(MockMempoolClient::new()),
325332
executable_tx: executable_invoke_tx(invoke_args()),
326333
runtime: tokio::runtime::Handle::current(),
@@ -567,7 +574,7 @@ async fn process_tx_returns_error_when_extract_state_nonce_and_run_validations_f
567574
.expect_instantiate_validator()
568575
.return_once(|_| Ok(Box::new(mock_stateful_transaction_validator)));
569576

570-
let process_tx_task = process_tx_task(mock_stateful_transaction_validator_factory);
577+
let process_tx_task = process_tx_task(mock_stateful_transaction_validator_factory).await;
571578

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

@@ -598,22 +605,25 @@ async fn stateless_transaction_validator_error(mut mock_dependencies: MockDepend
598605

599606
#[rstest]
600607
#[tokio::test]
601-
async fn process_tx_returns_error_when_instantiating_validator_fails(
608+
async fn add_tx_returns_error_when_instantiating_validator_fails(
609+
mut mock_dependencies: MockDependencies,
602610
mut mock_stateful_transaction_validator_factory: MockStatefulTransactionValidatorFactoryTrait,
603611
) {
612+
// Prepare transaction conversion to reach instantiation.
613+
let tx_args = invoke_args();
614+
setup_transaction_converter_mock(&mut mock_dependencies.mock_transaction_converter, &tx_args);
615+
616+
// Fail validator instantiation.
604617
let error_code = StarknetErrorCode::UnknownErrorCode("StarknetErrorCode.InternalError".into());
605-
let expected_error = StarknetError {
606-
code: error_code.clone(),
607-
message: "placeholder".into(), // Message is not checked
608-
};
618+
let expected_error = StarknetError { code: error_code.clone(), message: "placeholder".into() };
609619
mock_stateful_transaction_validator_factory
610620
.expect_instantiate_validator()
611621
.return_once(|_| Err(expected_error));
612622

613-
let process_tx_task = process_tx_task(mock_stateful_transaction_validator_factory);
614-
615-
let result = tokio::task::spawn_blocking(move || process_tx_task.process_tx()).await.unwrap();
623+
// Build gateway and inject the failing factory.
624+
let mut gateway = mock_dependencies.gateway();
625+
gateway.stateful_tx_validator_factory = Arc::new(mock_stateful_transaction_validator_factory);
616626

617-
assert!(result.is_err());
618-
assert_eq!(result.unwrap_err().code, error_code);
627+
let err = gateway.add_tx(tx_args.get_rpc_tx(), p2p_message_metadata()).await.unwrap_err();
628+
assert_eq!(err.code, error_code);
619629
}

crates/apollo_gateway/src/stateful_transaction_validator.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ impl StatefulTransactionValidatorFactoryTrait for StatefulTransactionValidatorFa
143143
}
144144

145145
#[cfg_attr(test, mockall::automock)]
146-
pub trait StatefulTransactionValidatorTrait {
146+
pub trait StatefulTransactionValidatorTrait: Send {
147147
fn extract_state_nonce_and_run_validations(
148148
&mut self,
149149
executable_tx: &ExecutableTransaction,
@@ -152,12 +152,12 @@ pub trait StatefulTransactionValidatorTrait {
152152
) -> StatefulTransactionValidatorResult<Nonce>;
153153
}
154154

155-
pub struct StatefulTransactionValidator<B: BlockifierStatefulValidatorTrait> {
155+
pub struct StatefulTransactionValidator<B: BlockifierStatefulValidatorTrait + Send> {
156156
config: StatefulTransactionValidatorConfig,
157157
blockifier_stateful_tx_validator: B,
158158
}
159159

160-
impl<B: BlockifierStatefulValidatorTrait> StatefulTransactionValidatorTrait
160+
impl<B: BlockifierStatefulValidatorTrait + Send> StatefulTransactionValidatorTrait
161161
for StatefulTransactionValidator<B>
162162
{
163163
fn extract_state_nonce_and_run_validations(
@@ -181,7 +181,7 @@ impl<B: BlockifierStatefulValidatorTrait> StatefulTransactionValidatorTrait
181181
}
182182
}
183183

184-
impl<B: BlockifierStatefulValidatorTrait> StatefulTransactionValidator<B> {
184+
impl<B: BlockifierStatefulValidatorTrait + Send> StatefulTransactionValidator<B> {
185185
fn run_transaction_validations(
186186
&mut self,
187187
executable_tx: &ExecutableTransaction,

0 commit comments

Comments
 (0)