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 701fc93343)

Co-authored-by: behzad nouri <behzadnouri@gmail.com>
This commit is contained in:
mergify[bot]
2021-04-09 18:44:32 +00:00
committed by GitHub
parent 723e7f11b9
commit f7ef1e68b0

View File

@ -503,29 +503,30 @@ impl BankingStage {
socket: &UdpSocket, socket: &UdpSocket,
hold: bool, hold: bool,
) { ) {
if enable_forwarding { if !enable_forwarding {
let next_leader = poh_recorder if !hold {
.lock() buffered_packets.clear();
.unwrap() }
.leader_after_n_slots(FORWARD_TRANSACTIONS_TO_LEADER_AT_SLOT_OFFSET); return;
next_leader.map_or((), |leader_pubkey| { }
let leader_addr = { let next_leader = match poh_recorder
cluster_info.lookup_contact_info(&leader_pubkey, |leader| leader.tpu_forwards) .lock()
}; .unwrap()
.leader_after_n_slots(FORWARD_TRANSACTIONS_TO_LEADER_AT_SLOT_OFFSET)
leader_addr.map_or((), |leader_addr| { {
let _ = Some(pubkey) => pubkey,
Self::forward_buffered_packets(&socket, &leader_addr, &buffered_packets); None => return,
if hold { };
buffered_packets.retain(|b| b.1.is_empty()); let addr = match cluster_info.lookup_contact_info(&next_leader, |ci| ci.tpu_forwards) {
for b in buffered_packets.iter_mut() { Some(addr) => addr,
b.2 = true; None => return,
} };
} else { let _ = Self::forward_buffered_packets(socket, &addr, buffered_packets);
buffered_packets.clear(); if hold {
} buffered_packets.retain(|(_, index, _)| !index.is_empty());
}) for (_, _, forwarded) in buffered_packets.iter_mut() {
}) *forwarded = true;
}
} else { } else {
buffered_packets.clear(); buffered_packets.clear();
} }