Skip to content

Commit e729c0a

Browse files
committed
chore: add documentation
1 parent ff7aab7 commit e729c0a

File tree

2 files changed

+53
-14
lines changed

2 files changed

+53
-14
lines changed

frontend/rust-lib/flowy-revision/src/rev_persistence.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,14 @@ where
104104
new_revision: &'a Revision,
105105
rev_compress: &Arc<dyn RevisionMergeable + 'a>,
106106
) -> FlowyResult<i64> {
107-
let mut sync_seq_write_guard = self.sync_seq.write().await;
108-
if sync_seq_write_guard.step > self.configuration.merge_threshold {
109-
let compact_seq = sync_seq_write_guard.compact();
107+
let mut sync_seq = self.sync_seq.write().await;
108+
let step = sync_seq.step;
109+
110+
// Before the new_revision pushed into the sync_seq, we check if the current `step` of the
111+
// sync_seq is less equal or greater than the merge threshold. If yes, it's need to merged
112+
// with the new_revision into one revision.
113+
if step >= self.configuration.merge_threshold - 1 {
114+
let compact_seq = sync_seq.compact();
110115
let range = RevisionRange {
111116
start: *compact_seq.front().unwrap(),
112117
end: *compact_seq.back().unwrap(),
@@ -119,20 +124,18 @@ where
119124
revisions.push(new_revision.clone());
120125

121126
// compact multiple revisions into one
122-
let compact_revision = rev_compress.merge_revisions(&self.user_id, &self.object_id, revisions)?;
123-
let rev_id = compact_revision.rev_id;
124-
tracing::Span::current().record("rev_id", &rev_id);
125-
126-
// insert new revision
127-
let _ = sync_seq_write_guard.dry_push(rev_id)?;
127+
let merged_revision = rev_compress.merge_revisions(&self.user_id, &self.object_id, revisions)?;
128+
let rev_id = merged_revision.rev_id;
129+
tracing::Span::current().record("rev_id", &merged_revision.rev_id);
130+
let _ = sync_seq.dry_push(merged_revision.rev_id)?;
128131

129132
// replace the revisions in range with compact revision
130-
self.compact(&range, compact_revision).await?;
133+
self.compact(&range, merged_revision).await?;
131134
Ok(rev_id)
132135
} else {
133136
tracing::Span::current().record("rev_id", &new_revision.rev_id);
134137
self.add(new_revision.clone(), RevisionState::Sync, true).await?;
135-
sync_seq_write_guard.push(new_revision.rev_id)?;
138+
sync_seq.push(new_revision.rev_id)?;
136139
Ok(new_revision.rev_id)
137140
}
138141
}
@@ -201,7 +204,6 @@ where
201204
let _ = self
202205
.disk_cache
203206
.delete_revision_records(&self.object_id, Some(rev_ids))?;
204-
205207
self.add(new_revision, RevisionState::Sync, true).await?;
206208
Ok(())
207209
}

frontend/rust-lib/flowy-revision/tests/revision_test/local_revision_test.rs

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ async fn revision_compress_three_revisions_test2() {
190190

191191
#[tokio::test]
192192
async fn revision_merge_per_5_revision_test() {
193-
let test = RevisionTest::new_with_configuration(4).await;
193+
let test = RevisionTest::new_with_configuration(5).await;
194194
for i in 0..20 {
195195
let content = format!("{}", i);
196196
let (base_rev_id, rev_id) = test.next_rev_id_pair();
@@ -202,5 +202,42 @@ async fn revision_merge_per_5_revision_test() {
202202
.await;
203203
}
204204

205-
test.run_scripts(vec![AssertNumberOfSyncRevisions { num: 5 }]).await;
205+
test.run_scripts(vec![
206+
AssertNumberOfSyncRevisions { num: 4 },
207+
AssertNextSyncRevisionContent {
208+
expected: "01234".to_string(),
209+
},
210+
AckRevision { rev_id: 1 },
211+
AssertNextSyncRevisionContent {
212+
expected: "56789".to_string(),
213+
},
214+
AckRevision { rev_id: 2 },
215+
AssertNextSyncRevisionContent {
216+
expected: "1011121314".to_string(),
217+
},
218+
AckRevision { rev_id: 3 },
219+
AssertNextSyncRevisionContent {
220+
expected: "1516171819".to_string(),
221+
},
222+
AckRevision { rev_id: 4 },
223+
AssertNextSyncRevisionId { rev_id: None },
224+
])
225+
.await;
226+
}
227+
228+
#[tokio::test]
229+
async fn revision_merge_per_100_revision_test() {
230+
let test = RevisionTest::new_with_configuration(100).await;
231+
for i in 0..1000 {
232+
let content = format!("{}", i);
233+
let (base_rev_id, rev_id) = test.next_rev_id_pair();
234+
test.run_script(AddLocalRevision {
235+
content,
236+
base_rev_id,
237+
rev_id,
238+
})
239+
.await;
240+
}
241+
242+
test.run_scripts(vec![AssertNumberOfSyncRevisions { num: 10 }]).await;
206243
}

0 commit comments

Comments
 (0)