Derives Pod for CalculateHashIntermediate (#33267)

This commit is contained in:
Brooks 2023-09-15 12:47:38 -04:00 committed by GitHub
parent 4c42413c1f
commit f77b3d9389
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 37 additions and 29 deletions

View File

@ -10667,10 +10667,10 @@ pub mod tests {
) )
.unwrap(); .unwrap();
let mut expected = vec![Vec::new(); bins]; let mut expected = vec![Vec::new(); bins];
expected[0].push(raw_expected[0].clone()); expected[0].push(raw_expected[0]);
expected[0].push(raw_expected[1].clone()); expected[0].push(raw_expected[1]);
expected[bins - 1].push(raw_expected[2].clone()); expected[bins - 1].push(raw_expected[2]);
expected[bins - 1].push(raw_expected[3].clone()); expected[bins - 1].push(raw_expected[3]);
assert_scan(result, vec![expected], bins, 0, bins); assert_scan(result, vec![expected], bins, 0, bins);
let bins = 4; let bins = 4;
@ -10689,10 +10689,10 @@ pub mod tests {
) )
.unwrap(); .unwrap();
let mut expected = vec![Vec::new(); bins]; let mut expected = vec![Vec::new(); bins];
expected[0].push(raw_expected[0].clone()); expected[0].push(raw_expected[0]);
expected[1].push(raw_expected[1].clone()); expected[1].push(raw_expected[1]);
expected[2].push(raw_expected[2].clone()); expected[2].push(raw_expected[2]);
expected[bins - 1].push(raw_expected[3].clone()); expected[bins - 1].push(raw_expected[3]);
assert_scan(result, vec![expected], bins, 0, bins); assert_scan(result, vec![expected], bins, 0, bins);
let bins = 256; let bins = 256;
@ -10711,10 +10711,10 @@ pub mod tests {
) )
.unwrap(); .unwrap();
let mut expected = vec![Vec::new(); bins]; let mut expected = vec![Vec::new(); bins];
expected[0].push(raw_expected[0].clone()); expected[0].push(raw_expected[0]);
expected[127].push(raw_expected[1].clone()); expected[127].push(raw_expected[1]);
expected[128].push(raw_expected[2].clone()); expected[128].push(raw_expected[2]);
expected[bins - 1].push(raw_expected.last().unwrap().clone()); expected[bins - 1].push(*raw_expected.last().unwrap());
assert_scan(result, vec![expected], bins, 0, bins); assert_scan(result, vec![expected], bins, 0, bins);
} }
@ -10773,8 +10773,8 @@ pub mod tests {
) )
.unwrap(); .unwrap();
let mut expected = vec![Vec::new(); half_bins]; let mut expected = vec![Vec::new(); half_bins];
expected[0].push(raw_expected[0].clone()); expected[0].push(raw_expected[0]);
expected[0].push(raw_expected[1].clone()); expected[0].push(raw_expected[1]);
assert_scan(result, vec![expected], bins, 0, half_bins); assert_scan(result, vec![expected], bins, 0, half_bins);
// just the second bin of 2 // just the second bin of 2
@ -10795,8 +10795,8 @@ pub mod tests {
let mut expected = vec![Vec::new(); half_bins]; let mut expected = vec![Vec::new(); half_bins];
let starting_bin_index = 0; let starting_bin_index = 0;
expected[starting_bin_index].push(raw_expected[2].clone()); expected[starting_bin_index].push(raw_expected[2]);
expected[starting_bin_index].push(raw_expected[3].clone()); expected[starting_bin_index].push(raw_expected[3]);
assert_scan(result, vec![expected], bins, 1, bins - 1); assert_scan(result, vec![expected], bins, 1, bins - 1);
// 1 bin at a time of 4 // 1 bin at a time of 4
@ -10818,7 +10818,7 @@ pub mod tests {
) )
.unwrap(); .unwrap();
let mut expected = vec![Vec::new(); 1]; let mut expected = vec![Vec::new(); 1];
expected[0].push(expected_item.clone()); expected[0].push(*expected_item);
assert_scan(result, vec![expected], bins, bin, 1); assert_scan(result, vec![expected], bins, bin, 1);
} }
@ -10843,7 +10843,7 @@ pub mod tests {
let mut expected = vec![]; let mut expected = vec![];
if let Some(index) = bin_locations.iter().position(|&r| r == bin) { if let Some(index) = bin_locations.iter().position(|&r| r == bin) {
expected = vec![Vec::new(); range]; expected = vec![Vec::new(); range];
expected[0].push(raw_expected[index].clone()); expected[0].push(raw_expected[index]);
} }
let mut result2 = (0..range).map(|_| Vec::default()).collect::<Vec<_>>(); let mut result2 = (0..range).map(|_| Vec::default()).collect::<Vec<_>>();
if let Some(m) = result.get(0) { if let Some(m) = result.get(0) {
@ -10888,7 +10888,7 @@ pub mod tests {
.unwrap(); .unwrap();
assert_eq!(result.len(), 1); // 2 chunks, but 1 is empty so not included assert_eq!(result.len(), 1); // 2 chunks, but 1 is empty so not included
let mut expected = vec![Vec::new(); range]; let mut expected = vec![Vec::new(); range];
expected[0].push(raw_expected[1].clone()); expected[0].push(raw_expected[1]);
let mut result2 = (0..range).map(|_| Vec::default()).collect::<Vec<_>>(); let mut result2 = (0..range).map(|_| Vec::default()).collect::<Vec<_>>();
result[0].load_all(&mut result2, 0, &PubkeyBinCalculator24::new(range)); result[0].load_all(&mut result2, 0, &PubkeyBinCalculator24::new(range));
assert_eq!(result2.len(), 1); assert_eq!(result2.len(), 1);

View File

@ -6,6 +6,7 @@ use {
pubkey_bins::PubkeyBinCalculator24, pubkey_bins::PubkeyBinCalculator24,
rent_collector::RentCollector, rent_collector::RentCollector,
}, },
bytemuck::{Pod, Zeroable},
log::*, log::*,
memmap2::MmapMut, memmap2::MmapMut,
rayon::prelude::*, rayon::prelude::*,
@ -277,13 +278,20 @@ impl HashStats {
/// Note this can be saved/loaded during hash calculation to a memory mapped file whose contents are /// Note this can be saved/loaded during hash calculation to a memory mapped file whose contents are
/// [CalculateHashIntermediate] /// [CalculateHashIntermediate]
#[repr(C)] #[repr(C)]
#[derive(Default, Debug, PartialEq, Eq, Clone)] #[derive(Default, Debug, PartialEq, Eq, Clone, Copy, Pod, Zeroable)]
pub struct CalculateHashIntermediate { pub struct CalculateHashIntermediate {
pub hash: Hash, pub hash: Hash,
pub lamports: u64, pub lamports: u64,
pub pubkey: Pubkey, pub pubkey: Pubkey,
} }
// In order to safely guarantee CalculateHashIntermediate is Pod, it cannot have any padding
const _: () = assert!(
std::mem::size_of::<CalculateHashIntermediate>()
== std::mem::size_of::<Hash>() + std::mem::size_of::<u64>() + std::mem::size_of::<Pubkey>(),
"CalculateHashIntermediate cannot have any padding"
);
#[derive(Default, Debug, PartialEq, Eq)] #[derive(Default, Debug, PartialEq, Eq)]
pub struct CumulativeOffset { pub struct CumulativeOffset {
pub index: Vec<usize>, pub index: Vec<usize>,
@ -1808,7 +1816,7 @@ mod tests {
lamports: 1, lamports: 1,
pubkey, pubkey,
}; };
account_maps.push(val.clone()); account_maps.push(val);
let vecs = vec![account_maps.to_vec()]; let vecs = vec![account_maps.to_vec()];
let slice = convert_to_slice(&vecs); let slice = convert_to_slice(&vecs);
@ -1846,19 +1854,19 @@ mod tests {
lamports: 1, lamports: 1,
pubkey: key, pubkey: key,
}; };
account_maps.push(val.clone()); account_maps.push(val);
let val2 = CalculateHashIntermediate { let val2 = CalculateHashIntermediate {
hash, hash,
lamports: 2, lamports: 2,
pubkey: key2, pubkey: key2,
}; };
account_maps.push(val2.clone()); account_maps.push(val2);
let val3 = CalculateHashIntermediate { let val3 = CalculateHashIntermediate {
hash, hash,
lamports: 3, lamports: 3,
pubkey: key2, pubkey: key2,
}; };
account_maps2.push(val3.clone()); account_maps2.push(val3);
let mut vecs = vec![account_maps.to_vec(), account_maps2.to_vec()]; let mut vecs = vec![account_maps.to_vec(), account_maps2.to_vec()];
if reverse { if reverse {
@ -1896,19 +1904,19 @@ mod tests {
lamports: 2, lamports: 2,
pubkey: key2, pubkey: key2,
}; };
account_maps.push(val2.clone()); account_maps.push(val2);
let val = CalculateHashIntermediate { let val = CalculateHashIntermediate {
hash, hash,
lamports: 1, lamports: 1,
pubkey: key, pubkey: key,
}; };
account_maps.push(val.clone()); account_maps.push(val);
let val3 = CalculateHashIntermediate { let val3 = CalculateHashIntermediate {
hash, hash,
lamports: 3, lamports: 3,
pubkey: key2, pubkey: key2,
}; };
account_maps2.push(val3.clone()); account_maps2.push(val3);
let mut vecs = vec![account_maps.to_vec(), account_maps2.to_vec()]; let mut vecs = vec![account_maps.to_vec(), account_maps2.to_vec()];
if reverse { if reverse {

View File

@ -120,7 +120,7 @@ impl CacheHashDataFile {
"{pubkey_to_bin_index}, {start_bin_index}" "{pubkey_to_bin_index}, {start_bin_index}"
); // this would indicate we put a pubkey in too high of a bin ); // this would indicate we put a pubkey in too high of a bin
pubkey_to_bin_index -= start_bin_index; pubkey_to_bin_index -= start_bin_index;
accumulator[pubkey_to_bin_index].push(d.clone()); // may want to avoid clone here accumulator[pubkey_to_bin_index].push(*d); // may want to avoid copy here
} }
m2.stop(); m2.stop();
@ -348,7 +348,7 @@ impl CacheHashData {
x.iter().for_each(|item| { x.iter().for_each(|item| {
let d = cache_file.get_mut(i as u64); let d = cache_file.get_mut(i as u64);
i += 1; i += 1;
*d = item.clone(); *d = *item;
}) })
}); });
assert_eq!(i, entries); assert_eq!(i, entries);