diff --git a/crates/loro-internal/src/fuzz/recursive_refactored.rs b/crates/loro-internal/src/fuzz/recursive_refactored.rs index 84c82f40..c80ae97f 100644 --- a/crates/loro-internal/src/fuzz/recursive_refactored.rs +++ b/crates/loro-internal/src/fuzz/recursive_refactored.rs @@ -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] fn notify_causal_order_check() { test_multi_sites( diff --git a/crates/loro-internal/src/refactor/oplog/dag.rs b/crates/loro-internal/src/refactor/oplog/dag.rs index 4dc0ecdc..85f43479 100644 --- a/crates/loro-internal/src/refactor/oplog/dag.rs +++ b/crates/loro-internal/src/refactor/oplog/dag.rs @@ -103,6 +103,7 @@ impl Dag for AppDag { } impl AppDag { + // PERF: this may be painfully slow /// get the version vector for a certain op. /// It's the version when the op is applied pub fn get_vv(&self, id: ID) -> Option { @@ -184,13 +185,13 @@ impl AppDag { let id = frontiers[0]; 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) }; - x.element.lamport_end() + (id.counter - x.element.cnt) as Lamport + x.element.lamport + 1 }; for id in frontiers[1..].iter() { let Some(rle) = self.map.get(&id.peer) 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