patches bug in banking stage where buffered packets are never retained (#16276)

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
This commit is contained in:
behzad nouri
2021-04-05 12:46:21 +00:00
committed by GitHub
parent b521f50278
commit 701fc93343

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();
} }