From 2c745ce1087bf2f70af4d8dc7d2e7109e688a247 Mon Sep 17 00:00:00 2001 From: Pankaj Garg Date: Sun, 14 Apr 2019 12:34:07 -0700 Subject: [PATCH] Shorten recv wait when there are buffered packets in banking stage (#3757) - packets are buffered on leader rotation, when the next leader is unknown - shortening the wait allows the banking stage to poll for next leader more frequently --- core/src/banking_stage.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/core/src/banking_stage.rs b/core/src/banking_stage.rs index 1bc5707aec..44ecea790a 100644 --- a/core/src/banking_stage.rs +++ b/core/src/banking_stage.rs @@ -254,7 +254,18 @@ impl BankingStage { .unwrap_or_else(|_| buffered_packets.clear()); } - match Self::process_packets(&verified_receiver, &poh_recorder, recv_start) { + let recv_timeout = if !buffered_packets.is_empty() { + // If packets are buffered, let's wait for less time on recv from the channel. + // This helps detect the next leader faster, and processing the buffered + // packets quickly + Duration::from_millis(10) + } else { + // Default wait time + Duration::from_millis(100) + }; + + match Self::process_packets(&verified_receiver, &poh_recorder, recv_start, recv_timeout) + { Err(Error::RecvTimeoutError(RecvTimeoutError::Timeout)) => (), Ok(unprocessed_packets) => { if Self::should_buffer_packets(poh_recorder, cluster_info) { @@ -480,11 +491,12 @@ impl BankingStage { verified_receiver: &Arc>>, poh: &Arc>, recv_start: &mut Instant, + recv_timeout: Duration, ) -> Result { let mms = verified_receiver .lock() .unwrap() - .recv_timeout(Duration::from_millis(100))?; + .recv_timeout(recv_timeout)?; let mms_len = mms.len(); let count = mms.iter().map(|x| x.1.len()).sum();