From 3686dea10f9f0be70c195e8b7d4cd2c4acdfb2c3 Mon Sep 17 00:00:00 2001 From: ade Date: Tue, 3 May 2022 20:06:28 -0400 Subject: [PATCH 1/2] Added retry for gateway tx --- sui_core/src/gateway_state.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/sui_core/src/gateway_state.rs b/sui_core/src/gateway_state.rs index 0624e7246c517..6f61917fc8c2e 100644 --- a/sui_core/src/gateway_state.rs +++ b/sui_core/src/gateway_state.rs @@ -48,6 +48,8 @@ pub type GatewayClient = Box; pub type GatewayTxSeqNumber = u64; const MAX_TX_RANGE_SIZE: u64 = 4096; +/// Number of times to retry failed TX +const MAX_NUM_TX_RETRIES: usize = 5; pub struct GatewayState { authorities: AuthorityAggregator, @@ -573,7 +575,19 @@ where tx: Transaction, ) -> Result { let tx_kind = tx.data.kind.clone(); - let (certificate, effects) = self.execute_transaction_impl(tx).await?; + let mut res = self.execute_transaction_impl(tx.clone()).await; + + let mut remaining_retries = MAX_NUM_TX_RETRIES - 1; + while res.is_err() { + if remaining_retries == 0 { + res?; + } + remaining_retries -= 1; + res = self.execute_transaction_impl(tx.clone()).await; + } + + // Okay to unwrap() since we checked that this is Ok + let (certificate, effects) = res.unwrap(); // Create custom response base on the request type if let TransactionKind::Single(tx_kind) = tx_kind { From 4ea0f9a682317bba4d70791f283c6a6193ef32e7 Mon Sep 17 00:00:00 2001 From: ade Date: Tue, 3 May 2022 21:44:21 -0400 Subject: [PATCH 2/2] simplify --- sui_core/src/gateway_state.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sui_core/src/gateway_state.rs b/sui_core/src/gateway_state.rs index 6f61917fc8c2e..14628957c3fbb 100644 --- a/sui_core/src/gateway_state.rs +++ b/sui_core/src/gateway_state.rs @@ -577,10 +577,11 @@ where let tx_kind = tx.data.kind.clone(); let mut res = self.execute_transaction_impl(tx.clone()).await; - let mut remaining_retries = MAX_NUM_TX_RETRIES - 1; + let mut remaining_retries = MAX_NUM_TX_RETRIES; while res.is_err() { if remaining_retries == 0 { - res?; + // Okay to do this since we checked that this is an error + return Err(res.unwrap_err()); } remaining_retries -= 1; res = self.execute_transaction_impl(tx.clone()).await;