chore: Cleanup and document a Blockstore chaining test (#29705)
This commit is contained in:
parent
f96af7929d
commit
2b88401ef7
|
@ -5395,49 +5395,29 @@ pub mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_handle_chaining_missing_slots() {
|
fn test_handle_chaining_missing_slots() {
|
||||||
|
solana_logger::setup();
|
||||||
let ledger_path = get_tmp_ledger_path_auto_delete!();
|
let ledger_path = get_tmp_ledger_path_auto_delete!();
|
||||||
let blockstore = Blockstore::open(ledger_path.path()).unwrap();
|
let blockstore = Blockstore::open(ledger_path.path()).unwrap();
|
||||||
|
|
||||||
let num_slots = 30;
|
let num_slots = 30;
|
||||||
let entries_per_slot = 5;
|
let entries_per_slot = 5;
|
||||||
|
// Make a bunch of shreds and split by whether slot is even or odd
|
||||||
|
let (shreds, _) = make_many_slot_entries(0, num_slots, entries_per_slot);
|
||||||
|
let shreds_per_slot = shreds.len() as u64 / num_slots;
|
||||||
|
let (even_slots, odd_slots): (Vec<_>, Vec<_>) =
|
||||||
|
shreds.into_iter().partition(|shred| shred.slot() % 2 == 0);
|
||||||
|
|
||||||
|
// Write the odd slot shreds
|
||||||
|
blockstore.insert_shreds(odd_slots, None, false).unwrap();
|
||||||
|
|
||||||
// Separate every other slot into two separate vectors
|
|
||||||
let mut slots = vec![];
|
|
||||||
let mut missing_slots = vec![];
|
|
||||||
let mut shreds_per_slot = 2;
|
|
||||||
for slot in 0..num_slots {
|
for slot in 0..num_slots {
|
||||||
let parent_slot = {
|
// The slots that were inserted (the odds) will ...
|
||||||
if slot == 0 {
|
// - Know who their parent is (parent encoded in the shreds)
|
||||||
0
|
// - Have empty next_slots since next_slots would be evens
|
||||||
} else {
|
// The slots that were not inserted (the evens) will ...
|
||||||
slot - 1
|
// - Still have a meta since their child linked back to them
|
||||||
}
|
// - Have next_slots link to child because of the above
|
||||||
};
|
// - Have an unknown parent since no shreds to indicate
|
||||||
let (slot_shreds, _) = make_slot_entries(
|
|
||||||
slot,
|
|
||||||
parent_slot,
|
|
||||||
entries_per_slot,
|
|
||||||
true, // merkle_variant
|
|
||||||
);
|
|
||||||
shreds_per_slot = slot_shreds.len();
|
|
||||||
|
|
||||||
if slot % 2 == 1 {
|
|
||||||
slots.extend(slot_shreds);
|
|
||||||
} else {
|
|
||||||
missing_slots.extend(slot_shreds);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write the shreds for every other slot
|
|
||||||
blockstore.insert_shreds(slots, None, false).unwrap();
|
|
||||||
|
|
||||||
// Check metadata
|
|
||||||
for slot in 0..num_slots {
|
|
||||||
// If "i" is the index of a slot we just inserted, then next_slots should be empty
|
|
||||||
// for slot "i" because no slots chain to that slot, because slot i + 1 is missing.
|
|
||||||
// However, if it's a slot we haven't inserted, aka one of the gaps, then one of the
|
|
||||||
// slots we just inserted will chain to that gap, so next_slots for that orphan slot
|
|
||||||
// won't be empty, but the parent slot is unknown so should equal std::u64::MAX.
|
|
||||||
let meta = blockstore.meta(slot).unwrap().unwrap();
|
let meta = blockstore.meta(slot).unwrap().unwrap();
|
||||||
if slot % 2 == 0 {
|
if slot % 2 == 0 {
|
||||||
assert_eq!(meta.next_slots, vec![slot + 1]);
|
assert_eq!(meta.next_slots, vec![slot + 1]);
|
||||||
|
@ -5447,34 +5427,30 @@ pub mod tests {
|
||||||
assert_eq!(meta.parent_slot, Some(slot - 1));
|
assert_eq!(meta.parent_slot, Some(slot - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
if slot == 0 {
|
// Slot 0 is the only connected slot
|
||||||
assert!(meta.is_connected());
|
assert!(!meta.is_connected() || meta.slot == 0);
|
||||||
} else {
|
|
||||||
assert!(!meta.is_connected());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write the shreds for the other half of the slots that we didn't insert earlier
|
// Write the even slot shreds that we did not earlier
|
||||||
blockstore
|
blockstore.insert_shreds(even_slots, None, false).unwrap();
|
||||||
.insert_shreds(missing_slots, None, false)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
for slot in 0..num_slots {
|
for slot in 0..num_slots {
|
||||||
// Check that all the slots chain correctly once the missing slots
|
|
||||||
// have been filled
|
|
||||||
let meta = blockstore.meta(slot).unwrap().unwrap();
|
let meta = blockstore.meta(slot).unwrap().unwrap();
|
||||||
|
// All slots except the last one should have a slot in next_slots
|
||||||
if slot != num_slots - 1 {
|
if slot != num_slots - 1 {
|
||||||
assert_eq!(meta.next_slots, vec![slot + 1]);
|
assert_eq!(meta.next_slots, vec![slot + 1]);
|
||||||
} else {
|
} else {
|
||||||
assert!(meta.next_slots.is_empty());
|
assert!(meta.next_slots.is_empty());
|
||||||
}
|
}
|
||||||
|
// All slots should have the link back to their parent
|
||||||
if slot == 0 {
|
if slot == 0 {
|
||||||
assert_eq!(meta.parent_slot, Some(0));
|
assert_eq!(meta.parent_slot, Some(0));
|
||||||
} else {
|
} else {
|
||||||
assert_eq!(meta.parent_slot, Some(slot - 1));
|
assert_eq!(meta.parent_slot, Some(slot - 1));
|
||||||
}
|
}
|
||||||
assert_eq!(meta.last_index, Some(shreds_per_slot as u64 - 1));
|
// All inserted slots were full and should be connected
|
||||||
|
assert_eq!(meta.last_index, Some(shreds_per_slot - 1));
|
||||||
|
assert!(meta.is_full());
|
||||||
assert!(meta.is_connected());
|
assert!(meta.is_connected());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue