fix: get lamport by frontiers bug

This commit is contained in:
Zixuan Chen 2023-07-18 01:30:56 +08:00
parent 5a233501cc
commit 3d3c54eb92
2 changed files with 31 additions and 2 deletions

View file

@ -798,6 +798,34 @@ mod failed_tests {
) )
} }
#[test]
fn fuzz_1() {
test_multi_sites(
5,
&mut [
List {
site: 3,
container_idx: 30,
key: 0,
value: Null,
},
SyncAll,
Map {
site: 0,
container_idx: 0,
key: 14,
value: Null,
},
Map {
site: 3,
container_idx: 248,
key: 255,
value: Null,
},
],
);
}
#[test] #[test]
fn notify_causal_order_check() { fn notify_causal_order_check() {
test_multi_sites( test_multi_sites(

View file

@ -103,6 +103,7 @@ impl Dag for AppDag {
} }
impl AppDag { impl AppDag {
// PERF: this may be painfully slow
/// get the version vector for a certain op. /// get the version vector for a certain op.
/// It's the version when the op is applied /// It's the version when the op is applied
pub fn get_vv(&self, id: ID) -> Option<ImVersionVector> { pub fn get_vv(&self, id: ID) -> Option<ImVersionVector> {
@ -184,13 +185,13 @@ impl AppDag {
let id = frontiers[0]; let id = frontiers[0];
let Some(rle) = self.map.get(&id.peer) else { unreachable!() }; let Some(rle) = self.map.get(&id.peer) else { unreachable!() };
let Some(x) = rle.get_by_atom_index(id.counter) else { unreachable!("{} not found", id) }; let Some(x) = rle.get_by_atom_index(id.counter) else { unreachable!("{} not found", id) };
x.element.lamport_end() (id.counter - x.element.cnt) as Lamport + x.element.lamport + 1
}; };
for id in frontiers[1..].iter() { for id in frontiers[1..].iter() {
let Some(rle) = self.map.get(&id.peer) else { unreachable!() }; let Some(rle) = self.map.get(&id.peer) else { unreachable!() };
let Some(x) = rle.get_by_atom_index(id.counter) else { unreachable!() }; let Some(x) = rle.get_by_atom_index(id.counter) else { unreachable!() };
lamport = lamport.max(x.element.lamport_end()); lamport = lamport.max((id.counter - x.element.cnt) as Lamport + x.element.lamport + 1);
} }
lamport lamport