max_slot_in_storages_exclusive -> INclusive (#24450)

This commit is contained in:
Jeff Washington (jwash) 2022-04-19 13:59:41 -05:00 committed by GitHub
parent 94b0186a96
commit d23c04bb68
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 37 deletions

View File

@ -5223,7 +5223,7 @@ impl AccountsDb {
*slot,
config.rent_collector,
&stats,
max_slot + 1, // this wants an 'exclusive' number
max_slot,
find_unskipped_slot,
self.filler_account_suffix.as_ref(),
);
@ -5729,7 +5729,7 @@ impl AccountsDb {
slot,
config.rent_collector,
stats,
storage.range().end,
storage.range().end.saturating_sub(1), // 'end' is exclusive, convert to inclusive
find_unskipped_slot,
filler_account_suffix,
);

View File

@ -392,7 +392,7 @@ impl ExpectedRentCollection {
storage_slot: Slot,
rent_collector: &RentCollector,
stats: &HashStats,
max_slot_in_storages_exclusive: Slot,
max_slot_in_storages_inclusive: Slot,
find_unskipped_slot: impl Fn(Slot) -> Option<Slot>,
filler_account_suffix: Option<&Pubkey>,
) -> Option<Hash> {
@ -403,7 +403,7 @@ impl ExpectedRentCollection {
loaded_account,
storage_slot,
rent_collector,
max_slot_in_storages_exclusive,
max_slot_in_storages_inclusive,
find_unskipped_slot,
filler_account_suffix,
);
@ -439,7 +439,7 @@ impl ExpectedRentCollection {
Some(recalc_hash)
}
/// figure out whether the account stored at 'storage_slot' would have normally been rewritten at a slot that has already occurred: after 'storage_slot' but before 'max_slot_in_storages_exclusive'
/// figure out whether the account stored at 'storage_slot' would have normally been rewritten at a slot that has already occurred: after 'storage_slot' but <= 'max_slot_in_storages_inclusive'
/// returns Some(...) if the account would have normally been rewritten
/// returns None if the account was updated wrt rent already or if it is known that there must exist a future rewrite of this account (for example, non-zero rent is due)
fn new(
@ -447,7 +447,7 @@ impl ExpectedRentCollection {
loaded_account: &impl ReadableAccount,
storage_slot: Slot,
rent_collector: &RentCollector,
max_slot_in_storages_exclusive: Slot,
max_slot_in_storages_inclusive: Slot,
find_unskipped_slot: impl Fn(Slot) -> Option<Slot>,
filler_account_suffix: Option<&Pubkey>,
) -> Option<Self> {
@ -455,9 +455,6 @@ impl ExpectedRentCollection {
.epoch_schedule
.get_slots_in_epoch(rent_collector.epoch);
assert!(max_slot_in_storages_exclusive > 0);
let max_slot_in_storages_inclusive = max_slot_in_storages_exclusive.saturating_sub(1);
let partition_from_pubkey =
crate::bank::Bank::partition_from_pubkey(pubkey, slots_per_epoch);
let (epoch_of_max_storage_slot, partition_index_from_max_slot) = rent_collector
@ -563,7 +560,7 @@ pub mod tests {
let pubkey = Pubkey::new(&[5; 32]);
let owner = solana_sdk::pubkey::new_rand();
let mut account = AccountSharedData::new(1, 0, &owner);
let max_slot_in_storages_exclusive = 1;
let max_slot_in_storages_inclusive = 0;
let epoch_schedule = EpochSchedule::default();
let first_normal_slot = epoch_schedule.first_normal_slot;
let storage_slot = first_normal_slot;
@ -587,7 +584,7 @@ pub mod tests {
&account,
storage_slot,
&rent_collector,
max_slot_in_storages_exclusive,
max_slot_in_storages_inclusive,
find_unskipped_slot,
None,
);
@ -603,10 +600,8 @@ pub mod tests {
// several epochs ahead of now
// first slot of new epoch is max slot EXclusive
// so last slot of prior epoch is max slot INclusive
let max_slot_in_storages_exclusive = slots_per_epoch * 3 + first_normal_slot;
// -1 is because get_epoch takes slot and `max_slot_in_storages_exclusive` is EXclusive
rent_collector.epoch = epoch_schedule.get_epoch(max_slot_in_storages_exclusive - 1);
//let first_slot_in_max_epoch = max_slot_in_storages_exclusive - slots_per_epoch;
let max_slot_in_storages_inclusive = slots_per_epoch * 3 + first_normal_slot - 1;
rent_collector.epoch = epoch_schedule.get_epoch(max_slot_in_storages_inclusive);
let partition_from_pubkey = 8470; // function of 432k slots and 'pubkey' above
let first_slot_in_max_epoch = 1388256;
let expected_rent_collection_slot_max_epoch =
@ -616,7 +611,7 @@ pub mod tests {
&account,
storage_slot,
&rent_collector,
max_slot_in_storages_exclusive,
max_slot_in_storages_inclusive,
find_unskipped_slot,
None,
);
@ -640,7 +635,7 @@ pub mod tests {
&account,
expected_rent_collection_slot_max_epoch,
&rent_collector,
max_slot_in_storages_exclusive,
max_slot_in_storages_inclusive,
find_unskipped_slot,
None,
);
@ -667,7 +662,7 @@ pub mod tests {
&account,
expected_rent_collection_slot_max_epoch + if greater { 1 } else { 0 },
&rent_collector,
max_slot_in_storages_exclusive,
max_slot_in_storages_inclusive,
find_unskipped_slot,
None,
);
@ -684,7 +679,7 @@ pub mod tests {
);
}
// test rewrite would have occurred in previous epoch from max_slot_in_storages_exclusive's epoch
// test rewrite would have occurred in previous epoch from max_slot_in_storages_inclusive's epoch
// the change is in 'rent_epoch' returned in 'expected'
for previous_epoch in [false, true] {
let expected = ExpectedRentCollection::new(
@ -692,7 +687,7 @@ pub mod tests {
&account,
expected_rent_collection_slot_max_epoch,
&rent_collector,
max_slot_in_storages_exclusive + if previous_epoch { slots_per_epoch } else { 0 },
max_slot_in_storages_inclusive + if previous_epoch { slots_per_epoch } else { 0 },
find_unskipped_slot,
None,
);
@ -725,7 +720,7 @@ pub mod tests {
&account,
expected_rent_collection_slot_max_epoch,
&rent_collector,
max_slot_in_storages_exclusive,
max_slot_in_storages_inclusive,
find_unskipped_slot,
None,
);
@ -746,7 +741,7 @@ pub mod tests {
}
account.set_rent_epoch(original_rent_epoch);
let storage_slot = max_slot_in_storages_exclusive - slots_per_epoch - 1;
let storage_slot = max_slot_in_storages_inclusive - slots_per_epoch;
// check partition from pubkey code
for end_partition_index in [0, 1, 2, 100, slots_per_epoch - 2, slots_per_epoch - 1] {
// generate a pubkey range
@ -764,7 +759,7 @@ pub mod tests {
&account,
storage_slot,
&rent_collector,
max_slot_in_storages_exclusive,
max_slot_in_storages_inclusive,
find_unskipped_slot,
None,
);
@ -778,17 +773,17 @@ pub mod tests {
expected_rent_collection_slot_max_epoch: first_slot_in_max_epoch + end_partition_index,
rent_epoch: rent_collector.epoch,
}),
"range: {:?}, pubkey: {:?}, end_partition_index: {}, max_slot_in_storages_exclusive: {}",
"range: {:?}, pubkey: {:?}, end_partition_index: {}, max_slot_in_storages_inclusive: {}",
range,
pubkey,
end_partition_index,
max_slot_in_storages_exclusive,
max_slot_in_storages_inclusive,
);
}
}
// check max_slot_in_storages_exclusive related code
// so sweep through max_slot_in_storages_exclusive values within an epoch
// check max_slot_in_storages_inclusive related code
// so sweep through max_slot_in_storages_inclusive values within an epoch
let first_slot_in_max_epoch = first_normal_slot + slots_per_epoch;
rent_collector.epoch = epoch_schedule.get_epoch(first_slot_in_max_epoch);
// an epoch in the past so we always collect rent
@ -807,13 +802,13 @@ pub mod tests {
// partition_index=0 means first slot of second normal epoch
// second normal epoch because we want to deal with accounts stored in the first normal epoch
// + 1 because of exclusive
let max_slot_in_storages_exclusive = first_slot_in_max_epoch + partition_index + 1;
let max_slot_in_storages_inclusive = first_slot_in_max_epoch + partition_index;
let expected = ExpectedRentCollection::new(
&pubkey,
&account,
storage_slot,
&rent_collector,
max_slot_in_storages_exclusive,
max_slot_in_storages_inclusive,
find_unskipped_slot,
None,
);
@ -838,9 +833,9 @@ pub mod tests {
expected_rent_collection_slot_max_epoch,
rent_epoch: expected_rent_epoch,
}),
"partition_index: {}, max_slot_in_storages_exclusive: {}, storage_slot: {}, first_normal_slot: {}",
"partition_index: {}, max_slot_in_storages_inclusive: {}, storage_slot: {}, first_normal_slot: {}",
partition_index,
max_slot_in_storages_exclusive,
max_slot_in_storages_inclusive,
storage_slot,
first_normal_slot,
);
@ -855,7 +850,7 @@ pub mod tests {
&account,
storage_slot,
&rent_collector,
max_slot_in_storages_exclusive,
max_slot_in_storages_inclusive,
find_unskipped_slot,
None,
);
@ -887,7 +882,7 @@ pub mod tests {
&account,
storage_slot,
&rent_collector,
max_slot_in_storages_exclusive,
max_slot_in_storages_inclusive,
find_unskipped_slot,
None,
);
@ -1009,13 +1004,12 @@ pub mod tests {
epoch_schedule.get_epoch_and_slot_index(first_slot_in_max_epoch)
);
account.set_rent_epoch(1);
let max_slot_in_storages_exclusive = max_slot_in_storages_inclusive + 1;
let expected = ExpectedRentCollection::new(
&pubkey,
&account,
storage_slot,
&rent_collector,
max_slot_in_storages_exclusive,
max_slot_in_storages_inclusive,
find_unskipped_slot,
None,
);
@ -1048,7 +1042,7 @@ pub mod tests {
&account,
storage_slot,
&rent_collector,
max_slot_in_storages_exclusive,
max_slot_in_storages_inclusive,
find_unskipped_slot,
// treat this pubkey like a filler account so we get a 'LeaveAloneNoRent' result
Some(&pubkey),
@ -1079,7 +1073,7 @@ pub mod tests {
storage_slot,
&rent_collector,
&HashStats::default(),
max_slot_in_storages_exclusive,
max_slot_in_storages_inclusive,
find_unskipped_slot,
None,
);