AcctIdx: hold_range_in_memory (#19955)
This commit is contained in:
committed by
GitHub
parent
24b136a993
commit
4dc2f08198
@@ -813,6 +813,15 @@ impl Accounts {
|
||||
)
|
||||
}
|
||||
|
||||
pub fn hold_range_in_memory<R>(&self, range: &R, start_holding: bool)
|
||||
where
|
||||
R: RangeBounds<Pubkey> + std::fmt::Debug,
|
||||
{
|
||||
self.accounts_db
|
||||
.accounts_index
|
||||
.hold_range_in_memory(range, start_holding)
|
||||
}
|
||||
|
||||
pub fn load_to_collect_rent_eagerly<R: RangeBounds<Pubkey> + std::fmt::Debug>(
|
||||
&self,
|
||||
ancestors: &Ancestors,
|
||||
@@ -1240,6 +1249,62 @@ mod tests {
|
||||
load_accounts_with_fee(tx, ka, &fee_calculator, error_counters)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_hold_range_in_memory() {
|
||||
let accts = Accounts::default_for_tests();
|
||||
let range = Pubkey::new(&[0; 32])..=Pubkey::new(&[0xff; 32]);
|
||||
accts.hold_range_in_memory(&range, true);
|
||||
accts.hold_range_in_memory(&range, false);
|
||||
accts.hold_range_in_memory(&range, true);
|
||||
accts.hold_range_in_memory(&range, true);
|
||||
accts.hold_range_in_memory(&range, false);
|
||||
accts.hold_range_in_memory(&range, false);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_hold_range_in_memory2() {
|
||||
let accts = Accounts::default_for_tests();
|
||||
let range = Pubkey::new(&[0; 32])..=Pubkey::new(&[0xff; 32]);
|
||||
let idx = &accts.accounts_db.accounts_index;
|
||||
let bins = idx.account_maps.len();
|
||||
// use bins * 2 to get the first half of the range within bin 0
|
||||
let bins_2 = bins * 2;
|
||||
let binner = crate::pubkey_bins::PubkeyBinCalculator16::new(bins_2);
|
||||
let range2 =
|
||||
binner.lowest_pubkey_from_bin(0, bins_2)..binner.lowest_pubkey_from_bin(1, bins_2);
|
||||
let range2_inclusive = range2.start..=range2.end;
|
||||
assert_eq!(0, idx.bin_calculator.bin_from_pubkey(&range2.start));
|
||||
assert_eq!(0, idx.bin_calculator.bin_from_pubkey(&range2.end));
|
||||
accts.hold_range_in_memory(&range, true);
|
||||
error!("{}{}, bins: {}", file!(), line!(), bins);
|
||||
idx.account_maps.iter().enumerate().for_each(|(_bin, map)| {
|
||||
let map = map.read().unwrap();
|
||||
assert_eq!(
|
||||
map.cache_ranges_held.read().unwrap().to_vec(),
|
||||
vec![Some(range.clone())]
|
||||
);
|
||||
});
|
||||
error!("{}{}", file!(), line!());
|
||||
accts.hold_range_in_memory(&range2, true);
|
||||
error!("{}{}", file!(), line!());
|
||||
idx.account_maps.iter().enumerate().for_each(|(bin, map)| {
|
||||
let map = map.read().unwrap();
|
||||
let expected = if bin == 0 {
|
||||
vec![Some(range.clone()), Some(range2_inclusive.clone())]
|
||||
} else {
|
||||
vec![Some(range.clone())]
|
||||
};
|
||||
assert_eq!(
|
||||
map.cache_ranges_held.read().unwrap().to_vec(),
|
||||
expected,
|
||||
"bin: {}",
|
||||
bin
|
||||
);
|
||||
});
|
||||
accts.hold_range_in_memory(&range, false);
|
||||
accts.hold_range_in_memory(&range2, false);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_load_accounts_no_account_0_exists() {
|
||||
let accounts: Vec<(Pubkey, AccountSharedData)> = Vec::new();
|
||||
|
Reference in New Issue
Block a user