add min to roots_tracker (#17806)

This commit is contained in:
Jeff Washington (jwash)
2021-06-08 08:32:16 -06:00
committed by GitHub
parent 6f193bf357
commit 58fe1d0764

View File

@ -284,6 +284,24 @@ impl RollingBitField {
self.max - self.min self.max - self.min
} }
pub fn min(&self) -> Option<u64> {
if self.is_empty() {
None
} else if self.excess.is_empty() {
Some(self.min)
} else {
let mut min = if self.all_items_in_excess() {
u64::MAX
} else {
self.min
};
for item in &self.excess {
min = std::cmp::min(min, *item);
}
Some(min)
}
}
pub fn insert(&mut self, key: u64) { pub fn insert(&mut self, key: u64) {
let mut bits_empty = self.count == 0 || self.all_items_in_excess(); let mut bits_empty = self.count == 0 || self.all_items_in_excess();
let update_bits = if bits_empty { let update_bits = if bits_empty {
@ -478,6 +496,10 @@ impl RootsTracker {
previous_uncleaned_roots: HashSet::new(), previous_uncleaned_roots: HashSet::new(),
} }
} }
pub fn min_root(&self) -> Option<Slot> {
self.roots.min()
}
} }
#[derive(Debug, Default)] #[derive(Debug, Default)]
@ -1685,8 +1707,10 @@ pub mod tests {
solana_logger::setup(); solana_logger::setup();
let len = 16; let len = 16;
let mut bitfield = RollingBitField::new(len); let mut bitfield = RollingBitField::new(len);
assert_eq!(bitfield.min(), None);
bitfield.insert(0); bitfield.insert(0);
assert_eq!(bitfield.min(), Some(0));
let too_big = len + 1; let too_big = len + 1;
bitfield.insert(too_big); bitfield.insert(too_big);
assert!(bitfield.contains(&0)); assert!(bitfield.contains(&0));
@ -1694,6 +1718,7 @@ pub mod tests {
assert_eq!(bitfield.len(), 2); assert_eq!(bitfield.len(), 2);
assert_eq!(bitfield.excess.len(), 1); assert_eq!(bitfield.excess.len(), 1);
assert_eq!(bitfield.min, too_big); assert_eq!(bitfield.min, too_big);
assert_eq!(bitfield.min(), Some(0));
assert_eq!(bitfield.max, too_big + 1); assert_eq!(bitfield.max, too_big + 1);
// delete the thing that is NOT in excess // delete the thing that is NOT in excess
@ -1706,6 +1731,7 @@ pub mod tests {
assert!(bitfield.contains(&too_big_times_2)); assert!(bitfield.contains(&too_big_times_2));
assert_eq!(bitfield.len(), 2); assert_eq!(bitfield.len(), 2);
assert_eq!(bitfield.excess.len(), 1); assert_eq!(bitfield.excess.len(), 1);
assert_eq!(bitfield.min(), bitfield.excess.iter().min().copied());
assert_eq!(bitfield.min, too_big_times_2); assert_eq!(bitfield.min, too_big_times_2);
assert_eq!(bitfield.max, too_big_times_2 + 1); assert_eq!(bitfield.max, too_big_times_2 + 1);
@ -2062,6 +2088,7 @@ pub mod tests {
assert_eq!(hashset.is_empty(), bitfield.is_empty()); assert_eq!(hashset.is_empty(), bitfield.is_empty());
if !bitfield.is_empty() { if !bitfield.is_empty() {
let mut min = Slot::MAX; let mut min = Slot::MAX;
let mut overall_min = Slot::MAX;
let mut max = Slot::MIN; let mut max = Slot::MIN;
for item in bitfield.get_all() { for item in bitfield.get_all() {
assert!(hashset.contains(&item)); assert!(hashset.contains(&item));
@ -2069,7 +2096,9 @@ pub mod tests {
min = std::cmp::min(min, item); min = std::cmp::min(min, item);
max = std::cmp::max(max, item); max = std::cmp::max(max, item);
} }
overall_min = std::cmp::min(overall_min, item);
} }
assert_eq!(bitfield.min(), Some(overall_min));
assert_eq!(bitfield.get_all().len(), hashset.len()); assert_eq!(bitfield.get_all().len(), hashset.len());
// range isn't tracked for excess items // range isn't tracked for excess items
if bitfield.excess.len() != bitfield.len() { if bitfield.excess.len() != bitfield.len() {
@ -2087,6 +2116,8 @@ pub mod tests {
width, width,
); );
} }
} else {
assert_eq!(bitfield.min(), None);
} }
} }