prevent excess allocation with AccountsIndexIterator (#18605)

This commit is contained in:
Jeff Washington (jwash)
2021-07-13 11:11:17 -05:00
committed by GitHub
parent d092fa1f03
commit 0bd8710d34

View File

@ -566,19 +566,18 @@ impl<'a, T: 'static + Clone> Iterator for AccountsIndexIterator<'a, T> {
return None; return None;
} }
let chunk: Vec<(Pubkey, AccountMapEntry<T>)> = self let mut chunk: Vec<(Pubkey, AccountMapEntry<T>)> = Vec::with_capacity(ITER_BATCH_SIZE);
.account_maps 'outer: for i in self.account_maps.iter() {
.iter() for (pubkey, account_map_entry) in
.map(|i| { i.read().unwrap().range((self.start_bound, self.end_bound))
i.read() {
.unwrap() if chunk.len() >= ITER_BATCH_SIZE {
.range((self.start_bound, self.end_bound)) break 'outer;
.map(|(pubkey, account_map_entry)| (*pubkey, account_map_entry.clone())) }
.collect::<Vec<_>>() let item = (*pubkey, account_map_entry.clone());
}) chunk.push(item);
.flatten() }
.take(ITER_BATCH_SIZE) }
.collect();
if chunk.is_empty() { if chunk.is_empty() {
self.is_finished = true; self.is_finished = true;