Handle 0-lamport account in index generation (#19041) (#19160)

* Handle 0-lamport account in index generation

* rename duplicate to dirty keys

Co-authored-by: Carl Lin <carl@solana.com>
(cherry picked from commit 5a4979f25f)

Co-authored-by: sakridge <sakridge@gmail.com>
This commit is contained in:
mergify[bot]
2021-08-11 09:49:19 +00:00
committed by GitHub
parent c9f763ea6e
commit 03b930515b

View File

@ -1388,21 +1388,24 @@ impl<T: 'static + Clone + IsCached + ZeroLamport + std::marker::Sync + std::mark
items.for_each(|(pubkey, account_info)| { items.for_each(|(pubkey, account_info)| {
let bin = get_bin_pubkey(pubkey); let bin = get_bin_pubkey(pubkey);
// this value is equivalent to what update() below would have created if we inserted a new item // this value is equivalent to what update() below would have created if we inserted a new item
let is_zero_lamport = account_info.is_zero_lamport();
let info = WriteAccountMapEntry::new_entry_after_update(slot, account_info); let info = WriteAccountMapEntry::new_entry_after_update(slot, account_info);
binned[bin].1.push((*pubkey, info)); binned[bin].1.push((*pubkey, info, is_zero_lamport));
}); });
binned.retain(|x| !x.1.is_empty()); binned.retain(|x| !x.1.is_empty());
let insertion_time = AtomicU64::new(0); let insertion_time = AtomicU64::new(0);
let duplicate_keys = binned let dirty_pubkeys = binned
.into_iter() .into_iter()
.map(|(pubkey_bin, items)| { .map(|(pubkey_bin, items)| {
let mut _reclaims = SlotList::new(); let mut _reclaims = SlotList::new();
let mut w_account_maps = self.account_maps[pubkey_bin].write().unwrap(); let mut w_account_maps = self.account_maps[pubkey_bin].write().unwrap();
let mut insert_time = Measure::start("insert_into_primary_index"); // really should be in each loop let mut insert_time = Measure::start("insert_into_primary_index"); // really should be in each loop
let mut duplicate_keys = Vec::with_capacity(items.len()); let mut dirty_pubkeys = Vec::with_capacity(items.len());
items.into_iter().for_each(|(pubkey, new_item)| { items
.into_iter()
.for_each(|(pubkey, new_item, is_zero_lamport)| {
let already_exists = self.insert_new_entry_if_missing_with_lock( let already_exists = self.insert_new_entry_if_missing_with_lock(
pubkey, pubkey,
&mut w_account_maps, &mut w_account_maps,
@ -1410,17 +1413,19 @@ impl<T: 'static + Clone + IsCached + ZeroLamport + std::marker::Sync + std::mark
); );
if let Some((mut w_account_entry, account_info, pubkey)) = already_exists { if let Some((mut w_account_entry, account_info, pubkey)) = already_exists {
w_account_entry.update(slot, account_info, &mut _reclaims); w_account_entry.update(slot, account_info, &mut _reclaims);
duplicate_keys.push(pubkey); dirty_pubkeys.push(pubkey);
} else if is_zero_lamport {
dirty_pubkeys.push(pubkey);
} }
}); });
insert_time.stop(); insert_time.stop();
insertion_time.fetch_add(insert_time.as_us(), Ordering::Relaxed); insertion_time.fetch_add(insert_time.as_us(), Ordering::Relaxed);
duplicate_keys dirty_pubkeys
}) })
.flatten() .flatten()
.collect::<Vec<_>>(); .collect::<Vec<_>>();
(duplicate_keys, insertion_time.load(Ordering::Relaxed)) (dirty_pubkeys, insertion_time.load(Ordering::Relaxed))
} }
// Updates the given pubkey at the given slot with the new account information. // Updates the given pubkey at the given slot with the new account information.