huskies: merge 664_story_crdt_lamport_clock_inner_seq_must_resume_from_max_own_author_seq_1_instead_of_resetting_to_1_on_restart_phase_c
This commit is contained in:
@@ -47,6 +47,21 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the current Lamport sequence number for this list.
|
||||
pub fn our_seq(&self) -> SequenceNumber {
|
||||
self.our_seq
|
||||
}
|
||||
|
||||
/// Advance the internal sequence counter to at least `seq`.
|
||||
///
|
||||
/// After `advance_seq(n)`, the next local op will carry `seq = max(our_seq, n) + 1`
|
||||
/// instead of the default `1`. Used on restart to resume the Lamport clock
|
||||
/// from the document-wide floor so that newly-created registers don't
|
||||
/// re-emit low sequence numbers.
|
||||
pub fn advance_seq(&mut self, seq: SequenceNumber) {
|
||||
self.our_seq = max(self.our_seq, seq);
|
||||
}
|
||||
|
||||
/// Locally insert some content causally after the given operation
|
||||
pub fn insert<U: Into<JsonValue>>(&mut self, after: OpId, content: U) -> Op<JsonValue> {
|
||||
let mut op = Op::new(
|
||||
@@ -365,6 +380,18 @@ mod test {
|
||||
assert_eq!(list.view(), vec![1, 4, 2, 3]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_advance_seq_resumes_from_floor() {
|
||||
let mut list = ListCrdt::<i64>::new(make_author(1), vec![]);
|
||||
list.advance_seq(100);
|
||||
assert_eq!(list.our_seq(), 100);
|
||||
let op = list.insert(ROOT_ID, 42);
|
||||
assert_eq!(
|
||||
op.seq, 101,
|
||||
"first op after advance_seq(100) must have seq=101"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_list_idempotence() {
|
||||
let mut list = ListCrdt::<i64>::new(make_author(1), vec![]);
|
||||
|
||||
@@ -37,6 +37,21 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the current Lamport sequence number for this register.
|
||||
pub fn our_seq(&self) -> SequenceNumber {
|
||||
self.our_seq
|
||||
}
|
||||
|
||||
/// Advance the internal sequence counter to at least `seq`.
|
||||
///
|
||||
/// After `advance_seq(n)`, the next local op will carry `seq = max(our_seq, n) + 1`
|
||||
/// instead of the default `1`. Used on restart to resume the Lamport clock
|
||||
/// from the document-wide floor so that newly-created registers don't
|
||||
/// re-emit low sequence numbers.
|
||||
pub fn advance_seq(&mut self, seq: SequenceNumber) {
|
||||
self.our_seq = max(self.our_seq, seq);
|
||||
}
|
||||
|
||||
/// Sets the current value of the register
|
||||
pub fn set<U: Into<JsonValue>>(&mut self, content: U) -> Op<JsonValue> {
|
||||
let mut op = Op::new(
|
||||
@@ -174,6 +189,18 @@ mod test {
|
||||
assert_eq!(register.view(), Some(1));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_advance_seq_resumes_from_floor() {
|
||||
let mut register = LwwRegisterCrdt::<i64>::new(make_author(1), vec![]);
|
||||
register.advance_seq(100);
|
||||
assert_eq!(register.our_seq(), 100);
|
||||
let op = register.set(42);
|
||||
assert_eq!(
|
||||
op.seq, 101,
|
||||
"first op after advance_seq(100) must have seq=101"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_lww_consistent_tiebreak() {
|
||||
let mut register1 = LwwRegisterCrdt::new(make_author(1), vec![]);
|
||||
|
||||
Reference in New Issue
Block a user