Skip to content

Commit 7361172

Browse files
committed
fix: require write lock to make sure exclusive accest to sync_seq
1 parent 6dfed4a commit 7361172

File tree

1 file changed

+12
-5
lines changed

1 file changed

+12
-5
lines changed

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

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,13 @@ impl RevisionPersistence {
7373
revision: &'a Revision,
7474
compactor: &Arc<dyn RevisionCompactor + 'a>,
7575
) -> FlowyResult<i64> {
76-
let result = self.sync_seq.read().await.compact();
76+
let mut sync_seq_write_guard = self.sync_seq.write().await;
77+
let result = sync_seq_write_guard.compact();
7778
match result {
7879
None => {
7980
tracing::Span::current().record("rev_id", &revision.rev_id);
8081
self.add(revision.clone(), RevisionState::Sync, true).await?;
81-
self.sync_seq.write().await.add(revision.rev_id)?;
82+
sync_seq_write_guard.add(revision.rev_id)?;
8283
Ok(revision.rev_id)
8384
}
8485
Some((range, mut compact_seq)) => {
@@ -101,8 +102,10 @@ impl RevisionPersistence {
101102

102103
// replace the revisions in range with compact revision
103104
self.compact(&range, compact_revision).await?;
104-
debug_assert_eq!(self.sync_seq.read().await.len(), compact_seq.len());
105-
self.sync_seq.write().await.reset(compact_seq);
105+
//
106+
debug_assert_eq!(compact_seq.len(), 2);
107+
debug_assert_eq!(sync_seq_write_guard.len(), compact_seq.len());
108+
sync_seq_write_guard.reset(compact_seq);
106109
Ok(rev_id)
107110
}
108111
}
@@ -315,7 +318,11 @@ impl RevisionSyncSequence {
315318

316319
// Compact the rev_ids into one except the current synchronizing rev_id.
317320
fn compact(&self) -> Option<(RevisionRange, VecDeque<i64>)> {
318-
self.next_rev_id()?;
321+
// Make sure there are two rev_id going to sync. No need to compact if there is only
322+
// one rev_id in queue.
323+
if self.next_rev_id().is_none() {
324+
return None;
325+
}
319326

320327
let mut new_seq = self.0.clone();
321328
let mut drained = new_seq.drain(1..).collect::<VecDeque<_>>();

0 commit comments

Comments
 (0)