Co-authored-by: Carl Lin <carl@solana.com>
(cherry picked from commit 2a9b127029
)
Co-authored-by: Jeff Washington (jwash) <75863576+jeffwashington@users.noreply.github.com>
This commit is contained in:
@ -4421,7 +4421,7 @@ impl AccountsDb {
|
|||||||
collect_time.stop();
|
collect_time.stop();
|
||||||
|
|
||||||
let mut sort_time = Measure::start("sort_storages");
|
let mut sort_time = Measure::start("sort_storages");
|
||||||
let storages = SortedStorages::new_with_slots(&combined_maps, &slots);
|
let storages = SortedStorages::new_with_slots(combined_maps.iter().zip(slots.iter()));
|
||||||
sort_time.stop();
|
sort_time.stop();
|
||||||
|
|
||||||
let timings = HashStats {
|
let timings = HashStats {
|
||||||
|
@ -45,24 +45,23 @@ impl<'a> SortedStorages<'a> {
|
|||||||
storage.slot() // this must be unique. Will be enforced in new_with_slots
|
storage.slot() // this must be unique. Will be enforced in new_with_slots
|
||||||
})
|
})
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
Self::new_with_slots(source, &slots)
|
Self::new_with_slots(source.iter().zip(slots.iter()))
|
||||||
}
|
}
|
||||||
|
|
||||||
// source[i] is in slot slots[i]
|
// source[i] is in slot slots[i]
|
||||||
// assumptions:
|
// assumptions:
|
||||||
// 1. slots vector contains unique slot #s.
|
// 1. slots vector contains unique slot #s.
|
||||||
// 2. slots and source are the same len
|
// 2. slots and source are the same len
|
||||||
pub fn new_with_slots(source: &'a [SnapshotStorage], slots: &[Slot]) -> Self {
|
pub fn new_with_slots<'b>(
|
||||||
assert_eq!(
|
source: impl Iterator<Item = (&'a SnapshotStorage, &'b Slot)> + Clone,
|
||||||
source.len(),
|
) -> Self {
|
||||||
slots.len(),
|
|
||||||
"source and slots are different lengths"
|
|
||||||
);
|
|
||||||
let mut min = Slot::MAX;
|
let mut min = Slot::MAX;
|
||||||
let mut max = Slot::MIN;
|
let mut max = Slot::MIN;
|
||||||
let slot_count = source.len();
|
let mut slot_count = 0;
|
||||||
let mut time = Measure::start("get slot");
|
let mut time = Measure::start("get slot");
|
||||||
slots.iter().for_each(|slot| {
|
let source_ = source.clone();
|
||||||
|
source_.for_each(|(_, slot)| {
|
||||||
|
slot_count += 1;
|
||||||
let slot = *slot;
|
let slot = *slot;
|
||||||
min = std::cmp::min(slot, min);
|
min = std::cmp::min(slot, min);
|
||||||
max = std::cmp::max(slot + 1, max);
|
max = std::cmp::max(slot + 1, max);
|
||||||
@ -81,10 +80,7 @@ impl<'a> SortedStorages<'a> {
|
|||||||
};
|
};
|
||||||
let len = max - min;
|
let len = max - min;
|
||||||
storages = vec![None; len as usize];
|
storages = vec![None; len as usize];
|
||||||
source
|
source.for_each(|(original_storages, slot)| {
|
||||||
.iter()
|
|
||||||
.zip(slots)
|
|
||||||
.for_each(|(original_storages, slot)| {
|
|
||||||
let index = (slot - min) as usize;
|
let index = (slot - min) as usize;
|
||||||
assert!(storages[index].is_none(), "slots are not unique"); // we should not encounter the same slot twice
|
assert!(storages[index].is_none(), "slots are not unique"); // we should not encounter the same slot twice
|
||||||
storages[index] = Some(original_storages);
|
storages[index] = Some(original_storages);
|
||||||
@ -132,18 +128,12 @@ pub mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "slots are not unique")]
|
#[should_panic(expected = "slots are not unique")]
|
||||||
fn test_sorted_storages_duplicate_slots() {
|
fn test_sorted_storages_duplicate_slots() {
|
||||||
SortedStorages::new_with_slots(&[Vec::new(), Vec::new()], &[0, 0]);
|
SortedStorages::new_with_slots([Vec::new(), Vec::new()].iter().zip([0, 0].iter()));
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
#[should_panic(expected = "source and slots are different lengths")]
|
|
||||||
fn test_sorted_storages_mismatched_lengths() {
|
|
||||||
SortedStorages::new_with_slots(&[Vec::new()], &[0, 0]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_sorted_storages_none() {
|
fn test_sorted_storages_none() {
|
||||||
let result = SortedStorages::new_with_slots(&[], &[]);
|
let result = SortedStorages::new_with_slots([].iter().zip([].iter()));
|
||||||
assert_eq!(result.range, Range::default());
|
assert_eq!(result.range, Range::default());
|
||||||
assert_eq!(result.slot_count, 0);
|
assert_eq!(result.slot_count, 0);
|
||||||
assert_eq!(result.storages.len(), 0);
|
assert_eq!(result.storages.len(), 0);
|
||||||
@ -156,7 +146,7 @@ pub mod tests {
|
|||||||
let vec_check = vec.clone();
|
let vec_check = vec.clone();
|
||||||
let slot = 4;
|
let slot = 4;
|
||||||
let vecs = [vec];
|
let vecs = [vec];
|
||||||
let result = SortedStorages::new_with_slots(&vecs, &[slot]);
|
let result = SortedStorages::new_with_slots(vecs.iter().zip([slot].iter()));
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
result.range,
|
result.range,
|
||||||
Range {
|
Range {
|
||||||
@ -175,7 +165,7 @@ pub mod tests {
|
|||||||
let vec_check = vec.clone();
|
let vec_check = vec.clone();
|
||||||
let slots = [4, 7];
|
let slots = [4, 7];
|
||||||
let vecs = [vec.clone(), vec];
|
let vecs = [vec.clone(), vec];
|
||||||
let result = SortedStorages::new_with_slots(&vecs, &slots);
|
let result = SortedStorages::new_with_slots(vecs.iter().zip(slots.iter()));
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
result.range,
|
result.range,
|
||||||
Range {
|
Range {
|
||||||
|
Reference in New Issue
Block a user