Clean up VerifiedVotePackets (#14822)
(cherry picked from commit bd0433c373)
			
			
This commit is contained in:
		
				
					committed by
					
						 Michael Vines
						Michael Vines
					
				
			
			
				
	
			
			
			
						parent
						
							34504797b4
						
					
				
				
					commit
					d8d73ff56c
				
			| @@ -382,7 +382,7 @@ impl ClusterInfoVoteListener { | ||||
|                 return Ok(()); | ||||
|             } | ||||
|  | ||||
|             if let Err(e) = verified_vote_packets.get_and_process_vote_packets( | ||||
|             if let Err(e) = verified_vote_packets.receive_and_process_vote_packets( | ||||
|                 &verified_vote_label_packets_receiver, | ||||
|                 &mut update_version, | ||||
|             ) { | ||||
|   | ||||
| @@ -3,20 +3,13 @@ use crate::{ | ||||
|     result::Result, | ||||
| }; | ||||
| use solana_perf::packet::Packets; | ||||
| use std::{collections::HashMap, ops::Deref, time::Duration}; | ||||
| use std::{collections::HashMap, time::Duration}; | ||||
|  | ||||
| #[derive(Default)] | ||||
| pub struct VerifiedVotePackets(HashMap<CrdsValueLabel, (u64, Packets)>); | ||||
|  | ||||
| impl Deref for VerifiedVotePackets { | ||||
|     type Target = HashMap<CrdsValueLabel, (u64, Packets)>; | ||||
|     fn deref(&self) -> &Self::Target { | ||||
|         &self.0 | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl VerifiedVotePackets { | ||||
|     pub fn get_and_process_vote_packets( | ||||
|     pub fn receive_and_process_vote_packets( | ||||
|         &mut self, | ||||
|         vote_packets_receiver: &VerifiedLabelVotePacketsReceiver, | ||||
|         last_update_version: &mut u64, | ||||
| @@ -35,9 +28,15 @@ impl VerifiedVotePackets { | ||||
|         Ok(()) | ||||
|     } | ||||
|  | ||||
|     #[cfg(test)] | ||||
|     fn get_vote_packets(&self, key: &CrdsValueLabel) -> Option<&(u64, Packets)> { | ||||
|         self.0.get(key) | ||||
|     } | ||||
|  | ||||
|     pub fn get_latest_votes(&self, last_update_version: u64) -> (u64, Vec<Packets>) { | ||||
|         let mut new_update_version = last_update_version; | ||||
|         let msgs: Vec<_> = self | ||||
|             .0 | ||||
|             .iter() | ||||
|             .filter_map(|(_, (msg_update_version, msg))| { | ||||
|                 if *msg_update_version > last_update_version { | ||||
| @@ -125,35 +124,48 @@ mod tests { | ||||
|         s.send(vec![(label1.clone(), later_packets)]).unwrap(); | ||||
|         let mut verified_vote_packets = VerifiedVotePackets(HashMap::new()); | ||||
|         verified_vote_packets | ||||
|             .get_and_process_vote_packets(&r, &mut update_version) | ||||
|             .receive_and_process_vote_packets(&r, &mut update_version) | ||||
|             .unwrap(); | ||||
|  | ||||
|         // Test timestamps for same batch are the same | ||||
|         let update_version1 = verified_vote_packets.get(&label1).unwrap().0; | ||||
|         let update_version1 = verified_vote_packets.get_vote_packets(&label1).unwrap().0; | ||||
|         assert_eq!( | ||||
|             update_version1, | ||||
|             verified_vote_packets.get(&label2).unwrap().0 | ||||
|             verified_vote_packets.get_vote_packets(&label2).unwrap().0 | ||||
|         ); | ||||
|  | ||||
|         // Test the later value overwrote the earlier one for this label | ||||
|         assert!(verified_vote_packets.get(&label1).unwrap().1.packets.len() > 1); | ||||
|         assert!( | ||||
|             verified_vote_packets | ||||
|                 .get_vote_packets(&label1) | ||||
|                 .unwrap() | ||||
|                 .1 | ||||
|                 .packets | ||||
|                 .len() | ||||
|                 > 1 | ||||
|         ); | ||||
|         assert_eq!( | ||||
|             verified_vote_packets.get(&label2).unwrap().1.packets.len(), | ||||
|             verified_vote_packets | ||||
|                 .get_vote_packets(&label2) | ||||
|                 .unwrap() | ||||
|                 .1 | ||||
|                 .packets | ||||
|                 .len(), | ||||
|             0 | ||||
|         ); | ||||
|  | ||||
|         // Test timestamp for next batch overwrites the original | ||||
|         s.send(vec![(label2.clone(), Packets::default())]).unwrap(); | ||||
|         verified_vote_packets | ||||
|             .get_and_process_vote_packets(&r, &mut update_version) | ||||
|             .receive_and_process_vote_packets(&r, &mut update_version) | ||||
|             .unwrap(); | ||||
|         let update_version2 = verified_vote_packets.get(&label2).unwrap().0; | ||||
|         let update_version2 = verified_vote_packets.get_vote_packets(&label2).unwrap().0; | ||||
|         assert!(update_version2 > update_version1); | ||||
|  | ||||
|         // Test empty doesn't bump the version | ||||
|         let before = update_version; | ||||
|         assert_matches!( | ||||
|             verified_vote_packets.get_and_process_vote_packets(&r, &mut update_version), | ||||
|             verified_vote_packets.receive_and_process_vote_packets(&r, &mut update_version), | ||||
|             Err(Error::CrossbeamRecvTimeoutError(RecvTimeoutError::Timeout)) | ||||
|         ); | ||||
|         assert_eq!(before, update_version); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user