From f7ef1e68b06fec570fae31de72c3a3b60563794a Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 9 Apr 2021 18:44:32 +0000 Subject: [PATCH] patches bug in banking stage where buffered packets are never retained (#16276) (#16458) banking_stage::handle_forwarding is retaining buffered packets with empty index, so nothing is held: https://github.com/solana-labs/solana/blob/6f3926b64/core/src/banking_stage.rs#L520 (cherry picked from commit 701fc93343631294ef2fbe4a2677e3bca013251e) Co-authored-by: behzad nouri --- core/src/banking_stage.rs | 47 ++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/core/src/banking_stage.rs b/core/src/banking_stage.rs index 439fc917ec..3166849c20 100644 --- a/core/src/banking_stage.rs +++ b/core/src/banking_stage.rs @@ -503,29 +503,30 @@ impl BankingStage { socket: &UdpSocket, hold: bool, ) { - if enable_forwarding { - let next_leader = poh_recorder - .lock() - .unwrap() - .leader_after_n_slots(FORWARD_TRANSACTIONS_TO_LEADER_AT_SLOT_OFFSET); - next_leader.map_or((), |leader_pubkey| { - let leader_addr = { - cluster_info.lookup_contact_info(&leader_pubkey, |leader| leader.tpu_forwards) - }; - - leader_addr.map_or((), |leader_addr| { - let _ = - Self::forward_buffered_packets(&socket, &leader_addr, &buffered_packets); - if hold { - buffered_packets.retain(|b| b.1.is_empty()); - for b in buffered_packets.iter_mut() { - b.2 = true; - } - } else { - buffered_packets.clear(); - } - }) - }) + if !enable_forwarding { + if !hold { + buffered_packets.clear(); + } + return; + } + let next_leader = match poh_recorder + .lock() + .unwrap() + .leader_after_n_slots(FORWARD_TRANSACTIONS_TO_LEADER_AT_SLOT_OFFSET) + { + Some(pubkey) => pubkey, + None => return, + }; + let addr = match cluster_info.lookup_contact_info(&next_leader, |ci| ci.tpu_forwards) { + Some(addr) => addr, + None => return, + }; + let _ = Self::forward_buffered_packets(socket, &addr, buffered_packets); + if hold { + buffered_packets.retain(|(_, index, _)| !index.is_empty()); + for (_, _, forwarded) in buffered_packets.iter_mut() { + *forwarded = true; + } } else { buffered_packets.clear(); }