disk index: add more tests (#31135)
This commit is contained in:
parent
0eec1ad57f
commit
0121be5a9f
|
@ -803,6 +803,50 @@ mod tests {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn batch_insert_duplicates_internal_simple() {
|
||||||
|
solana_logger::setup();
|
||||||
|
// add the same duplicate key several times.
|
||||||
|
// make sure the resulting index and returned `duplicates` is correct.
|
||||||
|
let random = 1;
|
||||||
|
let data_buckets = Vec::default();
|
||||||
|
let k = Pubkey::from([1u8; 32]);
|
||||||
|
for v in 10..12u64 {
|
||||||
|
for len in 1..4 {
|
||||||
|
let raw = (0..len).map(|l| (k, v + (l as u64))).collect::<Vec<_>>();
|
||||||
|
let mut hashed = Bucket::index_entries(raw.clone().into_iter(), len, random);
|
||||||
|
let hashed_raw = hashed.clone();
|
||||||
|
|
||||||
|
let mut index = create_test_index(None);
|
||||||
|
|
||||||
|
let mut duplicates = Vec::default();
|
||||||
|
assert!(Bucket::<u64>::batch_insert_non_duplicates_internal(
|
||||||
|
&mut index,
|
||||||
|
&Vec::default(),
|
||||||
|
&mut hashed,
|
||||||
|
&mut duplicates,
|
||||||
|
)
|
||||||
|
.is_ok());
|
||||||
|
|
||||||
|
assert_eq!(duplicates.len(), len - 1);
|
||||||
|
assert_eq!(hashed.len(), 0);
|
||||||
|
let single_hashed_raw_inserted = hashed_raw.last().unwrap();
|
||||||
|
let elem =
|
||||||
|
IndexEntryPlaceInBucket::new(single_hashed_raw_inserted.0 % index.capacity());
|
||||||
|
let (value, ref_count) = elem.read_value(&index, &data_buckets);
|
||||||
|
assert_eq!(ref_count, 1);
|
||||||
|
assert_eq!(value, &[single_hashed_raw_inserted.2]);
|
||||||
|
let expected_duplicates = hashed_raw
|
||||||
|
.iter()
|
||||||
|
.rev()
|
||||||
|
.skip(1)
|
||||||
|
.map(|(_hash, k, v)| (*k, *v, single_hashed_raw_inserted.2))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
assert_eq!(expected_duplicates, duplicates);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn batch_insert_non_duplicates_internal_simple() {
|
fn batch_insert_non_duplicates_internal_simple() {
|
||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
|
@ -907,4 +951,24 @@ mod tests {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[should_panic(expected = "batch insertion can only occur prior to any deletes")]
|
||||||
|
#[test]
|
||||||
|
fn batch_insert_after_delete() {
|
||||||
|
solana_logger::setup();
|
||||||
|
|
||||||
|
let tmpdir = tempdir().unwrap();
|
||||||
|
let paths: Vec<PathBuf> = vec![tmpdir.path().to_path_buf()];
|
||||||
|
assert!(!paths.is_empty());
|
||||||
|
let max_search = 2;
|
||||||
|
let mut bucket = Bucket::new(Arc::new(paths), max_search, Arc::default(), Arc::default());
|
||||||
|
|
||||||
|
let key = Pubkey::new_unique();
|
||||||
|
assert_eq!(bucket.read_value(&key), None);
|
||||||
|
|
||||||
|
bucket.update(&key, |_| Some((vec![0], 0)));
|
||||||
|
bucket.delete_key(&key);
|
||||||
|
|
||||||
|
bucket.batch_insert_non_duplicates(std::iter::empty(), 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -489,16 +489,34 @@ mod tests {
|
||||||
&& thread_rng().gen_range(0, 2) == 0;
|
&& thread_rng().gen_range(0, 2) == 0;
|
||||||
if batch_insert_now {
|
if batch_insert_now {
|
||||||
// batch insert into the map with 1 bucket 50% of the time
|
// batch insert into the map with 1 bucket 50% of the time
|
||||||
assert!(map
|
let mut batch_additions = additions
|
||||||
.get_bucket_from_index(0)
|
|
||||||
.batch_insert_non_duplicates(
|
|
||||||
additions
|
|
||||||
.clone()
|
.clone()
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(k, mut v)| (k, v.0.pop().unwrap())),
|
.map(|(k, mut v)| (k, v.0.pop().unwrap()))
|
||||||
to_add,
|
.collect::<Vec<_>>();
|
||||||
|
let mut duplicates = 0;
|
||||||
|
if batch_additions.len() > 1 && thread_rng().gen_range(0, 2) == 0 {
|
||||||
|
// insert a duplicate sometimes
|
||||||
|
let item_to_duplicate =
|
||||||
|
thread_rng().gen_range(0, batch_additions.len());
|
||||||
|
let where_to_insert_duplicate =
|
||||||
|
thread_rng().gen_range(0, batch_additions.len());
|
||||||
|
batch_additions.insert(
|
||||||
|
where_to_insert_duplicate,
|
||||||
|
batch_additions[item_to_duplicate],
|
||||||
|
);
|
||||||
|
duplicates += 1;
|
||||||
|
}
|
||||||
|
let count = batch_additions.len();
|
||||||
|
assert_eq!(
|
||||||
|
map.get_bucket_from_index(0)
|
||||||
|
.batch_insert_non_duplicates(
|
||||||
|
batch_additions.into_iter(),
|
||||||
|
count,
|
||||||
)
|
)
|
||||||
.is_empty());
|
.len(),
|
||||||
|
duplicates
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
additions.clone().into_iter().for_each(|(k, v)| {
|
additions.clone().into_iter().for_each(|(k, v)| {
|
||||||
if insert {
|
if insert {
|
||||||
|
|
Loading…
Reference in New Issue