Skip to content

Commit eba78a6

Browse files
authored
Fix Gridstore has pointer lookup to account for nature of pending operation (#7638)
1 parent 4f13b99 commit eba78a6

2 files changed

Lines changed: 30 additions & 7 deletions

File tree

lib/gridstore/src/gridstore.rs

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -878,12 +878,14 @@ mod tests {
878878
Put(PointOffset, Payload),
879879
Delete(PointOffset),
880880
Update(PointOffset, Payload),
881+
Get(PointOffset),
882+
Flush,
881883
}
882884

883885
impl Operation {
884886
fn random(rng: &mut impl Rng, max_point_offset: u32) -> Self {
885887
let point_offset = rng.random_range(0..=max_point_offset);
886-
let operation = rng.random_range(0..3);
888+
let operation = rng.random_range(0..4);
887889
match operation {
888890
0 => {
889891
let size_factor = rng.random_range(1..10);
@@ -896,6 +898,8 @@ mod tests {
896898
let payload = random_payload(rng, size_factor);
897899
Operation::Update(point_offset, payload)
898900
}
901+
3 => Operation::Get(point_offset),
902+
4 => Operation::Flush,
899903
_ => unreachable!(),
900904
}
901905
}
@@ -905,14 +909,14 @@ mod tests {
905909
fn test_behave_like_hashmap(
906910
#[values(1_048_576, 2_097_152, DEFAULT_PAGE_SIZE_BYTES)] page_size: usize,
907911
) {
908-
use std::collections::HashMap;
912+
use ahash::AHashMap;
909913

910914
let (dir, mut storage) = empty_storage_sized(page_size);
911915

912916
let rng = &mut rand::rngs::SmallRng::from_os_rng();
913-
let max_point_offset = 100000u32;
917+
let max_point_offset = 10000u32;
914918

915-
let mut model_hashmap = HashMap::new();
919+
let mut model_hashmap = AHashMap::with_capacity(max_point_offset as usize);
916920

917921
let operations = (0..100000u32)
918922
.map(|_| Operation::random(rng, max_point_offset))
@@ -925,10 +929,15 @@ mod tests {
925929
for operation in operations {
926930
match operation {
927931
Operation::Put(point_offset, payload) => {
928-
storage
932+
let old1 = storage
929933
.put_value(point_offset, &payload, hw_counter_ref)
930934
.unwrap();
931-
model_hashmap.insert(point_offset, payload);
935+
let old2 = model_hashmap.insert(point_offset, payload);
936+
assert_eq!(
937+
old1,
938+
old2.is_some(),
939+
"put failed for point_offset: {point_offset} with {old1:?} vs {old2:?}",
940+
);
932941
}
933942
Operation::Delete(point_offset) => {
934943
let old1 = storage.delete_value(point_offset);
@@ -944,6 +953,20 @@ mod tests {
944953
.unwrap();
945954
model_hashmap.insert(point_offset, payload);
946955
}
956+
Operation::Get(point_offset) => {
957+
let v1_seq = storage.get_value::<true>(point_offset, &hw_counter);
958+
let v1_rand = storage.get_value::<false>(point_offset, &hw_counter);
959+
let v2 = model_hashmap.get(&point_offset).cloned();
960+
assert_eq!(
961+
v1_seq, v2,
962+
"get sequential failed for point_offset: {point_offset} with {v1_seq:?} vs {v2:?}",
963+
);
964+
assert_eq!(
965+
v1_rand, v2,
966+
"get_rand sequential failed for point_offset: {point_offset} with {v1_rand:?} vs {v2:?}",
967+
);
968+
}
969+
Operation::Flush => storage.flusher()().unwrap(),
947970
}
948971
}
949972

lib/gridstore/src/tracker.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ impl Tracker {
361361
}
362362

363363
pub fn has_pointer(&self, point_offset: PointOffset) -> bool {
364-
self.pending_updates.contains_key(&point_offset) || self.get(point_offset).is_some()
364+
self.get(point_offset).is_some()
365365
}
366366

367367
pub fn set(&mut self, point_offset: PointOffset, value_pointer: ValuePointer) {

0 commit comments

Comments
 (0)