Fix skipped slot detection for eager rent collect (#10890)
This commit is contained in:
parent
da7a31b662
commit
f1c1152948
|
@ -1875,21 +1875,6 @@ impl Bank {
|
|||
let (parent_epoch, mut parent_slot_index) =
|
||||
self.get_epoch_and_slot_index(self.parent_slot());
|
||||
|
||||
let mut partitions = vec![];
|
||||
if parent_epoch < current_epoch {
|
||||
if current_slot_index > 0 {
|
||||
// Generate special partitions because there are skipped slots
|
||||
// exactly at the epoch transition.
|
||||
|
||||
let parent_last_slot_index = self.get_slots_in_epoch(parent_epoch) - 1;
|
||||
|
||||
// ... for parent epoch
|
||||
partitions.push(self.partition_from_slot_indexes_with_gapped_epochs(
|
||||
parent_slot_index,
|
||||
parent_last_slot_index,
|
||||
parent_epoch,
|
||||
));
|
||||
|
||||
let should_enable = match self.operating_mode() {
|
||||
OperatingMode::Development => true,
|
||||
OperatingMode::Preview => current_epoch >= Epoch::max_value(),
|
||||
|
@ -1905,9 +1890,32 @@ impl Bank {
|
|||
should_enable
|
||||
}
|
||||
};
|
||||
|
||||
let mut partitions = vec![];
|
||||
if parent_epoch < current_epoch {
|
||||
// this needs to be gated because this potentially can change the behavior
|
||||
// (= bank hash) at each start of epochs
|
||||
if should_enable {
|
||||
let slot_skipped = if should_enable {
|
||||
(self.slot() - self.parent_slot()) > 1
|
||||
} else {
|
||||
current_slot_index > 0
|
||||
};
|
||||
if slot_skipped {
|
||||
// Generate special partitions because there are skipped slots
|
||||
// exactly at the epoch transition.
|
||||
|
||||
let parent_last_slot_index = self.get_slots_in_epoch(parent_epoch) - 1;
|
||||
|
||||
// ... for parent epoch
|
||||
partitions.push(self.partition_from_slot_indexes_with_gapped_epochs(
|
||||
parent_slot_index,
|
||||
parent_last_slot_index,
|
||||
parent_epoch,
|
||||
));
|
||||
|
||||
// this needs to be gated because this potentially can change the behavior
|
||||
// (= bank hash) at each start of epochs
|
||||
if should_enable && current_slot_index > 0 {
|
||||
// ... for current epoch
|
||||
partitions.push(self.partition_from_slot_indexes_with_gapped_epochs(
|
||||
0,
|
||||
|
@ -3642,7 +3650,7 @@ mod tests {
|
|||
}
|
||||
|
||||
#[test]
|
||||
fn test_rent_eager_across_epoch_with_gap() {
|
||||
fn test_rent_eager_across_epoch_with_full_gap() {
|
||||
let (genesis_config, _mint_keypair) = create_genesis_config(1);
|
||||
|
||||
let mut bank = Arc::new(Bank::new(&genesis_config));
|
||||
|
@ -3659,6 +3667,30 @@ mod tests {
|
|||
bank.rent_collection_partitions(),
|
||||
vec![(14, 31, 32), (0, 0, 64), (0, 17, 64)]
|
||||
);
|
||||
bank = Arc::new(new_from_parent(&bank));
|
||||
assert_eq!(bank.rent_collection_partitions(), vec![(17, 18, 64)]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_rent_eager_across_epoch_with_half_gap() {
|
||||
let (genesis_config, _mint_keypair) = create_genesis_config(1);
|
||||
|
||||
let mut bank = Arc::new(Bank::new(&genesis_config));
|
||||
assert_eq!(bank.rent_collection_partitions(), vec![(0, 0, 32)]);
|
||||
|
||||
bank = Arc::new(new_from_parent(&bank));
|
||||
assert_eq!(bank.rent_collection_partitions(), vec![(0, 1, 32)]);
|
||||
for _ in 2..15 {
|
||||
bank = Arc::new(new_from_parent(&bank));
|
||||
}
|
||||
assert_eq!(bank.rent_collection_partitions(), vec![(13, 14, 32)]);
|
||||
bank = Arc::new(Bank::new_from_parent(&bank, &Pubkey::default(), 32));
|
||||
assert_eq!(
|
||||
bank.rent_collection_partitions(),
|
||||
vec![(14, 31, 32), (0, 0, 64)]
|
||||
);
|
||||
bank = Arc::new(new_from_parent(&bank));
|
||||
assert_eq!(bank.rent_collection_partitions(), vec![(0, 1, 64)]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
Loading…
Reference in New Issue