* sentinel value for zero lamport accounts in hash scanning
* fix test
(cherry picked from commit f85be6259b)
Co-authored-by: Jeff Washington (jwash) <75863576+jeffwashington@users.noreply.github.com>
			
			
This commit is contained in:
		| @@ -167,22 +167,22 @@ type ReclaimResult = (AccountSlots, AppendVecOffsets); | |||||||
| type StorageFinder<'a> = Box<dyn Fn(Slot, usize) -> Arc<AccountStorageEntry> + 'a>; | type StorageFinder<'a> = Box<dyn Fn(Slot, usize) -> Arc<AccountStorageEntry> + 'a>; | ||||||
| type ShrinkCandidates = HashMap<Slot, HashMap<AppendVecId, Arc<AccountStorageEntry>>>; | type ShrinkCandidates = HashMap<Slot, HashMap<AppendVecId, Arc<AccountStorageEntry>>>; | ||||||
|  |  | ||||||
|  | const ZERO_RAW_LAMPORTS_SENTINEL: u64 = std::u64::MAX; | ||||||
|  |  | ||||||
| #[derive(Default, Debug, PartialEq, Clone)] | #[derive(Default, Debug, PartialEq, Clone)] | ||||||
| struct CalculateHashIntermediate { | struct CalculateHashIntermediate { | ||||||
|     pub version: u64, |     pub version: u64, | ||||||
|     pub hash: Hash, |     pub hash: Hash, | ||||||
|     pub lamports: u64, |     pub lamports: u64, | ||||||
|     pub raw_lamports: u64, |  | ||||||
|     pub slot: Slot, |     pub slot: Slot, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl CalculateHashIntermediate { | impl CalculateHashIntermediate { | ||||||
|     pub fn new(version: u64, hash: Hash, lamports: u64, raw_lamports: u64, slot: Slot) -> Self { |     pub fn new(version: u64, hash: Hash, lamports: u64, slot: Slot) -> Self { | ||||||
|         Self { |         Self { | ||||||
|             version, |             version, | ||||||
|             hash, |             hash, | ||||||
|             lamports, |             lamports, | ||||||
|             raw_lamports, |  | ||||||
|             slot, |             slot, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -3698,7 +3698,7 @@ impl AccountsDB { | |||||||
|                     .filter_map(|inp| { |                     .filter_map(|inp| { | ||||||
|                         let (pubkey, sv) = inp; |                         let (pubkey, sv) = inp; | ||||||
|                         let item = sv.get(); |                         let item = sv.get(); | ||||||
|                         if item.raw_lamports != 0 { |                         if item.lamports != ZERO_RAW_LAMPORTS_SENTINEL { | ||||||
|                             Some((*pubkey, item.hash, item.lamports)) |                             Some((*pubkey, item.hash, item.lamports)) | ||||||
|                         } else { |                         } else { | ||||||
|                             None |                             None | ||||||
| @@ -3822,18 +3822,20 @@ impl AccountsDB { | |||||||
|              slot: Slot| { |              slot: Slot| { | ||||||
|                 let version = loaded_account.write_version(); |                 let version = loaded_account.write_version(); | ||||||
|                 let raw_lamports = loaded_account.lamports(); |                 let raw_lamports = loaded_account.lamports(); | ||||||
|                 let balance = Self::account_balance_for_capitalization( |                 let balance = if raw_lamports == 0 { | ||||||
|  |                     ZERO_RAW_LAMPORTS_SENTINEL | ||||||
|  |                 } else { | ||||||
|  |                     Self::account_balance_for_capitalization( | ||||||
|                         raw_lamports, |                         raw_lamports, | ||||||
|                         loaded_account.owner(), |                         loaded_account.owner(), | ||||||
|                         loaded_account.executable(), |                         loaded_account.executable(), | ||||||
|                         simple_capitalization_enabled, |                         simple_capitalization_enabled, | ||||||
|                 ); |                     ) | ||||||
|  |                 }; | ||||||
|                 let source_item = CalculateHashIntermediate::new( |                 let source_item = CalculateHashIntermediate::new( | ||||||
|                     version, |                     version, | ||||||
|                     *loaded_account.loaded_hash(), |                     *loaded_account.loaded_hash(), | ||||||
|                     balance, |                     balance, | ||||||
|                     raw_lamports, |  | ||||||
|                     slot, |                     slot, | ||||||
|                 ); |                 ); | ||||||
|                 Self::handle_one_loaded_account(loaded_account.pubkey(), source_item, &map); |                 Self::handle_one_loaded_account(loaded_account.pubkey(), source_item, &map); | ||||||
| @@ -5087,13 +5089,14 @@ pub mod tests { | |||||||
|         let key = Pubkey::new(&[11u8; 32]); |         let key = Pubkey::new(&[11u8; 32]); | ||||||
|         let account_maps: DashMap<Pubkey, CalculateHashIntermediate> = DashMap::new(); |         let account_maps: DashMap<Pubkey, CalculateHashIntermediate> = DashMap::new(); | ||||||
|         let hash = Hash::new(&[1u8; 32]); |         let hash = Hash::new(&[1u8; 32]); | ||||||
|         let val = CalculateHashIntermediate::new(0, hash, 88, 490, Slot::default()); |         let val = CalculateHashIntermediate::new(0, hash, 88, Slot::default()); | ||||||
|         account_maps.insert(key, val); |         account_maps.insert(key, val); | ||||||
|  |  | ||||||
|         // 2nd key - zero lamports, so will be removed |         // 2nd key - zero lamports, so will be removed | ||||||
|         let key = Pubkey::new(&[12u8; 32]); |         let key = Pubkey::new(&[12u8; 32]); | ||||||
|         let hash = Hash::new(&[2u8; 32]); |         let hash = Hash::new(&[2u8; 32]); | ||||||
|         let val = CalculateHashIntermediate::new(0, hash, 1, 0, Slot::default()); |         let val = | ||||||
|  |             CalculateHashIntermediate::new(0, hash, ZERO_RAW_LAMPORTS_SENTINEL, Slot::default()); | ||||||
|         account_maps.insert(key, val); |         account_maps.insert(key, val); | ||||||
|  |  | ||||||
|         let result = |         let result = | ||||||
| @@ -5104,7 +5107,7 @@ pub mod tests { | |||||||
|         // 3rd key - with pubkey value before 1st key so it will be sorted first |         // 3rd key - with pubkey value before 1st key so it will be sorted first | ||||||
|         let key = Pubkey::new(&[10u8; 32]); |         let key = Pubkey::new(&[10u8; 32]); | ||||||
|         let hash = Hash::new(&[2u8; 32]); |         let hash = Hash::new(&[2u8; 32]); | ||||||
|         let val = CalculateHashIntermediate::new(0, hash, 20, 20, Slot::default()); |         let val = CalculateHashIntermediate::new(0, hash, 20, Slot::default()); | ||||||
|         account_maps.insert(key, val); |         account_maps.insert(key, val); | ||||||
|  |  | ||||||
|         let result = AccountsDB::rest_of_hash_calculation((account_maps, Measure::start(""))); |         let result = AccountsDB::rest_of_hash_calculation((account_maps, Measure::start(""))); | ||||||
| @@ -5119,32 +5122,32 @@ pub mod tests { | |||||||
|         let account_maps: DashMap<Pubkey, CalculateHashIntermediate> = DashMap::new(); |         let account_maps: DashMap<Pubkey, CalculateHashIntermediate> = DashMap::new(); | ||||||
|         let key = Pubkey::new_unique(); |         let key = Pubkey::new_unique(); | ||||||
|         let hash = Hash::new_unique(); |         let hash = Hash::new_unique(); | ||||||
|         let val = CalculateHashIntermediate::new(1, hash, 1, 2, 1); |         let val = CalculateHashIntermediate::new(1, hash, 1, 1); | ||||||
|  |  | ||||||
|         AccountsDB::handle_one_loaded_account(&key, val.clone(), &account_maps); |         AccountsDB::handle_one_loaded_account(&key, val.clone(), &account_maps); | ||||||
|         assert_eq!(*account_maps.get(&key).unwrap(), val); |         assert_eq!(*account_maps.get(&key).unwrap(), val); | ||||||
|  |  | ||||||
|         // slot same, version < |         // slot same, version < | ||||||
|         let hash2 = Hash::new_unique(); |         let hash2 = Hash::new_unique(); | ||||||
|         let val2 = CalculateHashIntermediate::new(0, hash2, 4, 5, 1); |         let val2 = CalculateHashIntermediate::new(0, hash2, 4, 1); | ||||||
|         AccountsDB::handle_one_loaded_account(&key, val2, &account_maps); |         AccountsDB::handle_one_loaded_account(&key, val2, &account_maps); | ||||||
|         assert_eq!(*account_maps.get(&key).unwrap(), val); |         assert_eq!(*account_maps.get(&key).unwrap(), val); | ||||||
|  |  | ||||||
|         // slot same, vers = |         // slot same, vers = | ||||||
|         let hash3 = Hash::new_unique(); |         let hash3 = Hash::new_unique(); | ||||||
|         let val3 = CalculateHashIntermediate::new(1, hash3, 2, 3, 1); |         let val3 = CalculateHashIntermediate::new(1, hash3, 2, 1); | ||||||
|         AccountsDB::handle_one_loaded_account(&key, val3.clone(), &account_maps); |         AccountsDB::handle_one_loaded_account(&key, val3.clone(), &account_maps); | ||||||
|         assert_eq!(*account_maps.get(&key).unwrap(), val3); |         assert_eq!(*account_maps.get(&key).unwrap(), val3); | ||||||
|  |  | ||||||
|         // slot same, vers > |         // slot same, vers > | ||||||
|         let hash4 = Hash::new_unique(); |         let hash4 = Hash::new_unique(); | ||||||
|         let val4 = CalculateHashIntermediate::new(2, hash4, 6, 7, 1); |         let val4 = CalculateHashIntermediate::new(2, hash4, 6, 1); | ||||||
|         AccountsDB::handle_one_loaded_account(&key, val4.clone(), &account_maps); |         AccountsDB::handle_one_loaded_account(&key, val4.clone(), &account_maps); | ||||||
|         assert_eq!(*account_maps.get(&key).unwrap(), val4); |         assert_eq!(*account_maps.get(&key).unwrap(), val4); | ||||||
|  |  | ||||||
|         // slot >, version < |         // slot >, version < | ||||||
|         let hash5 = Hash::new_unique(); |         let hash5 = Hash::new_unique(); | ||||||
|         let val5 = CalculateHashIntermediate::new(0, hash5, 8, 9, 2); |         let val5 = CalculateHashIntermediate::new(0, hash5, 8, 2); | ||||||
|         AccountsDB::handle_one_loaded_account(&key, val5.clone(), &account_maps); |         AccountsDB::handle_one_loaded_account(&key, val5.clone(), &account_maps); | ||||||
|         assert_eq!(*account_maps.get(&key).unwrap(), val5); |         assert_eq!(*account_maps.get(&key).unwrap(), val5); | ||||||
|     } |     } | ||||||
| @@ -5156,7 +5159,7 @@ pub mod tests { | |||||||
|         let key = Pubkey::new_unique(); |         let key = Pubkey::new_unique(); | ||||||
|         let hash = Hash::new_unique(); |         let hash = Hash::new_unique(); | ||||||
|         let account_maps: DashMap<Pubkey, CalculateHashIntermediate> = DashMap::new(); |         let account_maps: DashMap<Pubkey, CalculateHashIntermediate> = DashMap::new(); | ||||||
|         let val = CalculateHashIntermediate::new(0, hash, 1, 2, Slot::default()); |         let val = CalculateHashIntermediate::new(0, hash, 1, Slot::default()); | ||||||
|         account_maps.insert(key, val.clone()); |         account_maps.insert(key, val.clone()); | ||||||
|  |  | ||||||
|         let result = AccountsDB::remove_zero_balance_accounts(account_maps); |         let result = AccountsDB::remove_zero_balance_accounts(account_maps); | ||||||
| @@ -5164,7 +5167,8 @@ pub mod tests { | |||||||
|  |  | ||||||
|         // zero original lamports |         // zero original lamports | ||||||
|         let account_maps: DashMap<Pubkey, CalculateHashIntermediate> = DashMap::new(); |         let account_maps: DashMap<Pubkey, CalculateHashIntermediate> = DashMap::new(); | ||||||
|         let val = CalculateHashIntermediate::new(0, hash, 1, 0, Slot::default()); |         let val = | ||||||
|  |             CalculateHashIntermediate::new(0, hash, ZERO_RAW_LAMPORTS_SENTINEL, Slot::default()); | ||||||
|         account_maps.insert(key, val); |         account_maps.insert(key, val); | ||||||
|  |  | ||||||
|         let result = AccountsDB::remove_zero_balance_accounts(account_maps); |         let result = AccountsDB::remove_zero_balance_accounts(account_maps); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user