|
@@ -14,26 +14,26 @@ pub const REVISION_WRITE_INTERVAL_IN_MILLIS: u64 = 600;
|
|
|
|
|
|
#[derive(Clone)]
|
|
|
pub struct RevisionPersistenceConfiguration {
|
|
|
- // If the number of revisions that didn't sync to the server greater than the merge_threshold
|
|
|
+ // If the number of revisions that didn't sync to the server greater than the max_merge_len
|
|
|
// then these revisions will be merged into one revision.
|
|
|
- merge_threshold: usize,
|
|
|
+ max_merge_len: usize,
|
|
|
|
|
|
/// Indicates that the revisions that didn't sync to the server can be merged into one when
|
|
|
- /// `compact_lagging_revisions` get called.
|
|
|
+ /// `merge_lagging_revisions` get called.
|
|
|
merge_lagging: bool,
|
|
|
}
|
|
|
|
|
|
impl RevisionPersistenceConfiguration {
|
|
|
- pub fn new(merge_threshold: usize, merge_lagging: bool) -> Self {
|
|
|
- debug_assert!(merge_threshold > 1);
|
|
|
- if merge_threshold > 1 {
|
|
|
+ pub fn new(merge_max_length: usize, merge_lagging: bool) -> Self {
|
|
|
+ debug_assert!(merge_max_length > 1);
|
|
|
+ if merge_max_length > 1 {
|
|
|
Self {
|
|
|
- merge_threshold,
|
|
|
+ max_merge_len: merge_max_length,
|
|
|
merge_lagging,
|
|
|
}
|
|
|
} else {
|
|
|
Self {
|
|
|
- merge_threshold: 100,
|
|
|
+ max_merge_len: 100,
|
|
|
merge_lagging,
|
|
|
}
|
|
|
}
|
|
@@ -43,7 +43,7 @@ impl RevisionPersistenceConfiguration {
|
|
|
impl std::default::Default for RevisionPersistenceConfiguration {
|
|
|
fn default() -> Self {
|
|
|
Self {
|
|
|
- merge_threshold: 100,
|
|
|
+ max_merge_len: 100,
|
|
|
merge_lagging: false,
|
|
|
}
|
|
|
}
|
|
@@ -106,7 +106,7 @@ where
|
|
|
}
|
|
|
|
|
|
#[tracing::instrument(level = "trace", skip_all, err)]
|
|
|
- pub async fn compact_lagging_revisions<'a>(
|
|
|
+ pub async fn merge_lagging_revisions<'a>(
|
|
|
&'a self,
|
|
|
rev_compress: &Arc<dyn RevisionMergeable + 'a>,
|
|
|
) -> FlowyResult<()> {
|
|
@@ -115,7 +115,7 @@ where
|
|
|
}
|
|
|
|
|
|
let mut sync_seq = self.sync_seq.write().await;
|
|
|
- let compact_seq = sync_seq.compact();
|
|
|
+ let compact_seq = sync_seq.pop_merge_rev_ids();
|
|
|
if !compact_seq.is_empty() {
|
|
|
let range = RevisionRange {
|
|
|
start: *compact_seq.front().unwrap(),
|
|
@@ -164,18 +164,18 @@ where
|
|
|
) -> FlowyResult<i64> {
|
|
|
let mut sync_seq = self.sync_seq.write().await;
|
|
|
|
|
|
- // Before the new_revision is pushed into the sync_seq, we check if the current `compact_length` of the
|
|
|
- // sync_seq is less equal to or greater than the merge threshold. If yes, it's needs to merged
|
|
|
+ // Before the new_revision is pushed into the sync_seq, we check if the current `merge_length` of the
|
|
|
+ // sync_seq is less equal to or greater than the `merge_max_length`. If yes, it's needs to merged
|
|
|
// with the new_revision into one revision.
|
|
|
- let mut compact_seq = VecDeque::default();
|
|
|
+ let mut merge_rev_ids = VecDeque::default();
|
|
|
// tracing::info!("{}", compact_seq)
|
|
|
- if sync_seq.compact_length >= self.configuration.merge_threshold - 1 {
|
|
|
- compact_seq.extend(sync_seq.compact());
|
|
|
+ if sync_seq.merge_length >= self.configuration.max_merge_len - 1 {
|
|
|
+ merge_rev_ids.extend(sync_seq.pop_merge_rev_ids());
|
|
|
}
|
|
|
- if !compact_seq.is_empty() {
|
|
|
+ if !merge_rev_ids.is_empty() {
|
|
|
let range = RevisionRange {
|
|
|
- start: *compact_seq.front().unwrap(),
|
|
|
- end: *compact_seq.back().unwrap(),
|
|
|
+ start: *merge_rev_ids.front().unwrap(),
|
|
|
+ end: *merge_rev_ids.back().unwrap(),
|
|
|
};
|
|
|
|
|
|
tracing::Span::current().record("compact_range", format!("{}", range).as_str());
|
|
@@ -186,13 +186,13 @@ where
|
|
|
|
|
|
// compact multiple revisions into one
|
|
|
let merged_revision = rev_compress.merge_revisions(&self.user_id, &self.object_id, revisions)?;
|
|
|
- let rev_id = merged_revision.rev_id;
|
|
|
+ let new_rev_id = merged_revision.rev_id;
|
|
|
tracing::Span::current().record("rev_id", merged_revision.rev_id);
|
|
|
- sync_seq.recv(merged_revision.rev_id)?;
|
|
|
+ sync_seq.recv(new_rev_id)?;
|
|
|
|
|
|
// replace the revisions in range with compact revision
|
|
|
self.compact(&range, merged_revision).await?;
|
|
|
- Ok(rev_id)
|
|
|
+ Ok(new_rev_id)
|
|
|
} else {
|
|
|
let rev_id = new_revision.rev_id;
|
|
|
tracing::Span::current().record("rev_id", rev_id);
|
|
@@ -333,7 +333,6 @@ where
|
|
|
.collect::<Vec<Revision>>())
|
|
|
}
|
|
|
|
|
|
- #[allow(dead_code)]
|
|
|
pub fn delete_revisions_from_range(&self, range: RevisionRange) -> FlowyResult<()> {
|
|
|
self.disk_cache
|
|
|
.delete_revision_records(&self.object_id, Some(range.to_rev_ids()))?;
|
|
@@ -370,8 +369,8 @@ impl<C> RevisionMemoryCacheDelegate for Arc<dyn RevisionDiskCache<C, Error = Flo
|
|
|
#[derive(Default)]
|
|
|
struct DeferSyncSequence {
|
|
|
rev_ids: VecDeque<i64>,
|
|
|
- compact_index: Option<usize>,
|
|
|
- compact_length: usize,
|
|
|
+ merge_start: Option<usize>,
|
|
|
+ merge_length: usize,
|
|
|
}
|
|
|
|
|
|
impl DeferSyncSequence {
|
|
@@ -381,14 +380,12 @@ impl DeferSyncSequence {
|
|
|
|
|
|
/// Pushes the new_rev_id to the end of the list and marks this new_rev_id is mergeable.
|
|
|
///
|
|
|
- /// When calling `compact` method, it will return a list of revision ids started from
|
|
|
- /// the `compact_start_pos`, and ends with the `compact_length`.
|
|
|
fn merge_recv(&mut self, new_rev_id: i64) -> FlowyResult<()> {
|
|
|
self.recv(new_rev_id)?;
|
|
|
|
|
|
- self.compact_length += 1;
|
|
|
- if self.compact_index.is_none() && !self.rev_ids.is_empty() {
|
|
|
- self.compact_index = Some(self.rev_ids.len() - 1);
|
|
|
+ self.merge_length += 1;
|
|
|
+ if self.merge_start.is_none() && !self.rev_ids.is_empty() {
|
|
|
+ self.merge_start = Some(self.rev_ids.len() - 1);
|
|
|
}
|
|
|
Ok(())
|
|
|
}
|
|
@@ -419,14 +416,14 @@ impl DeferSyncSequence {
|
|
|
}
|
|
|
|
|
|
let mut compact_rev_id = None;
|
|
|
- if let Some(compact_index) = self.compact_index {
|
|
|
+ if let Some(compact_index) = self.merge_start {
|
|
|
compact_rev_id = self.rev_ids.get(compact_index).cloned();
|
|
|
}
|
|
|
|
|
|
let pop_rev_id = self.rev_ids.pop_front();
|
|
|
if let (Some(compact_rev_id), Some(pop_rev_id)) = (compact_rev_id, pop_rev_id) {
|
|
|
- if compact_rev_id <= pop_rev_id && self.compact_length > 0 {
|
|
|
- self.compact_length -= 1;
|
|
|
+ if compact_rev_id <= pop_rev_id && self.merge_length > 0 {
|
|
|
+ self.merge_length -= 1;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -438,22 +435,22 @@ impl DeferSyncSequence {
|
|
|
}
|
|
|
|
|
|
fn clear(&mut self) {
|
|
|
- self.compact_index = None;
|
|
|
- self.compact_length = 0;
|
|
|
+ self.merge_start = None;
|
|
|
+ self.merge_length = 0;
|
|
|
self.rev_ids.clear();
|
|
|
}
|
|
|
|
|
|
- // Compact the rev_ids into one except the current synchronizing rev_id.
|
|
|
- fn compact(&mut self) -> VecDeque<i64> {
|
|
|
+ // Returns the rev_ids into one except the current synchronizing rev_id.
|
|
|
+ fn pop_merge_rev_ids(&mut self) -> VecDeque<i64> {
|
|
|
let mut compact_seq = VecDeque::with_capacity(self.rev_ids.len());
|
|
|
- if let Some(start) = self.compact_index {
|
|
|
+ if let Some(start) = self.merge_start {
|
|
|
if start < self.rev_ids.len() {
|
|
|
let seq = self.rev_ids.split_off(start);
|
|
|
compact_seq.extend(seq);
|
|
|
}
|
|
|
}
|
|
|
- self.compact_index = None;
|
|
|
- self.compact_length = 0;
|
|
|
+ self.merge_start = None;
|
|
|
+ self.merge_length = 0;
|
|
|
compact_seq
|
|
|
}
|
|
|
}
|