Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit d5ade81

Browse files
sakridgemergify-bot
authored andcommitted
Don't store votes unless we are leader soon (#17803)
(cherry picked from commit 0feac57)
1 parent 274a238 commit d5ade81

File tree

2 files changed

+21
-8
lines changed

2 files changed

+21
-8
lines changed

core/src/cluster_info_vote_listener.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use solana_runtime::{
3333
vote_sender_types::{ReplayVoteReceiver, ReplayedVote},
3434
};
3535
use solana_sdk::{
36-
clock::{Epoch, Slot, DEFAULT_MS_PER_SLOT},
36+
clock::{Epoch, Slot, DEFAULT_MS_PER_SLOT, DEFAULT_TICKS_PER_SLOT},
3737
epoch_schedule::EpochSchedule,
3838
hash::Hash,
3939
pubkey::Pubkey,
@@ -384,9 +384,14 @@ impl ClusterInfoVoteListener {
384384
return Ok(());
385385
}
386386

387+
let would_be_leader = poh_recorder
388+
.lock()
389+
.unwrap()
390+
.would_be_leader(20 * DEFAULT_TICKS_PER_SLOT);
387391
if let Err(e) = verified_vote_packets.receive_and_process_vote_packets(
388392
&verified_vote_label_packets_receiver,
389393
&mut update_version,
394+
would_be_leader,
390395
) {
391396
match e {
392397
Error::CrossbeamRecvTimeoutError(RecvTimeoutError::Disconnected) => {

core/src/verified_vote_packets.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,25 @@ impl VerifiedVotePackets {
1515
&mut self,
1616
vote_packets_receiver: &VerifiedLabelVotePacketsReceiver,
1717
last_update_version: &mut u64,
18+
would_be_leader: bool,
1819
) -> Result<()> {
1920
let timer = Duration::from_millis(200);
2021
let vote_packets = vote_packets_receiver.recv_timeout(timer)?;
2122
*last_update_version += 1;
22-
for (label, slot, packet) in vote_packets {
23-
self.0.insert(label, (*last_update_version, slot, packet));
24-
}
25-
while let Ok(vote_packets) = vote_packets_receiver.try_recv() {
23+
if would_be_leader {
2624
for (label, slot, packet) in vote_packets {
2725
self.0.insert(label, (*last_update_version, slot, packet));
2826
}
27+
} else {
28+
self.0.clear();
29+
self.0.shrink_to_fit();
30+
}
31+
while let Ok(vote_packets) = vote_packets_receiver.try_recv() {
32+
if would_be_leader {
33+
for (label, slot, packet) in vote_packets {
34+
self.0.insert(label, (*last_update_version, slot, packet));
35+
}
36+
}
2937
}
3038
Ok(())
3139
}
@@ -137,7 +145,7 @@ mod tests {
137145
s.send(vec![(label1.clone(), 42, later_packets)]).unwrap();
138146
let mut verified_vote_packets = VerifiedVotePackets(HashMap::new());
139147
verified_vote_packets
140-
.receive_and_process_vote_packets(&r, &mut update_version)
148+
.receive_and_process_vote_packets(&r, &mut update_version, true)
141149
.unwrap();
142150

143151
// Test timestamps for same batch are the same
@@ -171,15 +179,15 @@ mod tests {
171179
s.send(vec![(label2.clone(), 51, Packets::default())])
172180
.unwrap();
173181
verified_vote_packets
174-
.receive_and_process_vote_packets(&r, &mut update_version)
182+
.receive_and_process_vote_packets(&r, &mut update_version, true)
175183
.unwrap();
176184
let update_version2 = verified_vote_packets.get_vote_packets(&label2).unwrap().0;
177185
assert!(update_version2 > update_version1);
178186

179187
// Test empty doesn't bump the version
180188
let before = update_version;
181189
assert_matches!(
182-
verified_vote_packets.receive_and_process_vote_packets(&r, &mut update_version),
190+
verified_vote_packets.receive_and_process_vote_packets(&r, &mut update_version, true),
183191
Err(Error::CrossbeamRecvTimeoutError(RecvTimeoutError::Timeout))
184192
);
185193
assert_eq!(before, update_version);

0 commit comments

Comments
 (0)