From adc9da5f120dcf857b4d26bcbe5e018b1adc4d7c Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Tue, 6 Feb 2024 03:31:14 -0500 Subject: [PATCH] cli: add transaction retry pool max size (#35080) * cli: add transaction retry pool max size * Update send-transaction-service/src/send_transaction_service.rs Co-authored-by: Tyera * rename transaction_retry_pool_max_size --------- Co-authored-by: Tyera --- .../src/send_transaction_service.rs | 9 ++++++--- validator/src/cli.rs | 13 +++++++++++++ validator/src/main.rs | 5 +++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/send-transaction-service/src/send_transaction_service.rs b/send-transaction-service/src/send_transaction_service.rs index dd09ccc69..4e4ba9956 100644 --- a/send-transaction-service/src/send_transaction_service.rs +++ b/send-transaction-service/src/send_transaction_service.rs @@ -28,8 +28,8 @@ use { }, }; -/// Maximum size of the transaction queue -const MAX_TRANSACTION_QUEUE_SIZE: usize = 10_000; // This seems like a lot but maybe it needs to be bigger one day +/// Maximum size of the transaction retry pool +const MAX_TRANSACTION_RETRY_POOL_SIZE: usize = 10_000; // This seems like a lot but maybe it needs to be bigger one day /// Default retry interval const DEFAULT_RETRY_RATE_MS: u64 = 2_000; @@ -114,6 +114,8 @@ pub struct Config { pub batch_size: usize, /// How frequently batches are sent pub batch_send_rate_ms: u64, + /// When the retry pool exceeds this max size, new transactions are dropped after their first broadcast attempt + pub retry_pool_max_size: usize, } impl Default for Config { @@ -125,6 +127,7 @@ impl Default for Config { service_max_retries: DEFAULT_SERVICE_MAX_RETRIES, batch_size: DEFAULT_TRANSACTION_BATCH_SIZE, batch_send_rate_ms: DEFAULT_BATCH_SEND_RATE_MS, + retry_pool_max_size: MAX_TRANSACTION_RETRY_POOL_SIZE, } } } @@ -477,7 +480,7 @@ impl SendTransactionService { let retry_len = retry_transactions.len(); let entry = retry_transactions.entry(signature); if let Entry::Vacant(_) = entry { - if retry_len >= MAX_TRANSACTION_QUEUE_SIZE { + if retry_len >= config.retry_pool_max_size { datapoint_warn!("send_transaction_service-queue-overflow"); break; } else { diff --git a/validator/src/cli.rs b/validator/src/cli.rs index 08a728884..958cdc4ec 100644 --- a/validator/src/cli.rs +++ b/validator/src/cli.rs @@ -1045,6 +1045,15 @@ pub fn app<'a>(version: &'a str, default_args: &'a DefaultArgs) -> App<'a, 'a> { .default_value(&default_args.rpc_send_transaction_batch_size) .help("The size of transactions to be sent in batch."), ) + .arg( + Arg::with_name("rpc_send_transaction_retry_pool_max_size") + .long("rpc-send-transaction-retry-pool-max-size") + .value_name("NUMBER") + .takes_value(true) + .validator(is_parsable::) + .default_value(&default_args.rpc_send_transaction_retry_pool_max_size) + .help("The maximum size of transactions retry pool.") + ) .arg( Arg::with_name("rpc_scan_and_fix_roots") .long("rpc-scan-and-fix-roots") @@ -1957,6 +1966,7 @@ pub struct DefaultArgs { pub rpc_send_transaction_leader_forward_count: String, pub rpc_send_transaction_service_max_retries: String, pub rpc_send_transaction_batch_size: String, + pub rpc_send_transaction_retry_pool_max_size: String, pub rpc_threads: String, pub rpc_niceness_adjustment: String, pub rpc_bigtable_timeout: String, @@ -2042,6 +2052,9 @@ impl DefaultArgs { rpc_send_transaction_batch_size: default_send_transaction_service_config .batch_size .to_string(), + rpc_send_transaction_retry_pool_max_size: default_send_transaction_service_config + .retry_pool_max_size + .to_string(), rpc_threads: num_cpus::get().to_string(), rpc_niceness_adjustment: "0".to_string(), rpc_bigtable_timeout: "30".to_string(), diff --git a/validator/src/main.rs b/validator/src/main.rs index de1efeddb..0cff3139a 100644 --- a/validator/src/main.rs +++ b/validator/src/main.rs @@ -1412,6 +1412,11 @@ pub fn main() { ), batch_send_rate_ms: rpc_send_batch_send_rate_ms, batch_size: rpc_send_batch_size, + retry_pool_max_size: value_t_or_exit!( + matches, + "rpc_send_transaction_retry_pool_max_size", + usize + ), }, no_poh_speed_test: matches.is_present("no_poh_speed_test"), no_os_memory_stats_reporting: matches.is_present("no_os_memory_stats_reporting"),