diff --git a/frontend/rust-lib/flowy-document/src/manager.rs b/frontend/rust-lib/flowy-document/src/manager.rs index 27c5ec5814..bb56aa71b0 100644 --- a/frontend/rust-lib/flowy-document/src/manager.rs +++ b/frontend/rust-lib/flowy-document/src/manager.rs @@ -247,7 +247,7 @@ impl DocumentManager { ) -> Result>, FlowyError> { let user_id = self.user.user_id()?; let disk_cache = SQLiteDocumentRevisionPersistence::new(&user_id, pool.clone()); - let configuration = RevisionPersistenceConfiguration::default(); + let configuration = RevisionPersistenceConfiguration::new(100); let rev_persistence = RevisionPersistence::new(&user_id, doc_id, disk_cache, configuration); // let history_persistence = SQLiteRevisionHistoryPersistence::new(doc_id, pool.clone()); let snapshot_persistence = SQLiteRevisionSnapshotPersistence::new(doc_id, pool); @@ -268,7 +268,7 @@ impl DocumentManager { ) -> Result>, FlowyError> { let user_id = self.user.user_id()?; let disk_cache = SQLiteDeltaDocumentRevisionPersistence::new(&user_id, pool.clone()); - let configuration = RevisionPersistenceConfiguration::default(); + let configuration = RevisionPersistenceConfiguration::new(100); let rev_persistence = RevisionPersistence::new(&user_id, doc_id, disk_cache, configuration); // let history_persistence = SQLiteRevisionHistoryPersistence::new(doc_id, pool.clone()); let snapshot_persistence = SQLiteRevisionSnapshotPersistence::new(doc_id, pool); diff --git a/frontend/rust-lib/flowy-folder/src/manager.rs b/frontend/rust-lib/flowy-folder/src/manager.rs index c942c79a9f..2c4e5383fb 100644 --- a/frontend/rust-lib/flowy-folder/src/manager.rs +++ b/frontend/rust-lib/flowy-folder/src/manager.rs @@ -168,7 +168,7 @@ impl FolderManager { let pool = self.persistence.db_pool()?; let object_id = folder_id.as_ref(); let disk_cache = SQLiteFolderRevisionPersistence::new(user_id, pool.clone()); - let configuration = RevisionPersistenceConfiguration::new(50); + let configuration = RevisionPersistenceConfiguration::new(100); let rev_persistence = RevisionPersistence::new(user_id, object_id, disk_cache, configuration); let rev_compactor = FolderRevisionCompress(); // let history_persistence = SQLiteRevisionHistoryPersistence::new(object_id, pool.clone()); diff --git a/frontend/rust-lib/flowy-folder/src/services/folder_editor.rs b/frontend/rust-lib/flowy-folder/src/services/folder_editor.rs index 2ad6a58f55..7a6da97bf6 100644 --- a/frontend/rust-lib/flowy-folder/src/services/folder_editor.rs +++ b/frontend/rust-lib/flowy-folder/src/services/folder_editor.rs @@ -20,6 +20,8 @@ use std::sync::Arc; pub struct FolderEditor { #[allow(dead_code)] user_id: String, + #[allow(dead_code)] + folder_id: FolderId, pub(crate) folder: Arc>, rev_manager: Arc>>, #[cfg(feature = "sync")] @@ -57,6 +59,7 @@ impl FolderEditor { let folder_id = folder_id.to_owned(); Ok(Self { user_id, + folder_id, folder, rev_manager, #[cfg(feature = "sync")] diff --git a/frontend/rust-lib/flowy-folder/tests/workspace/folder_test.rs b/frontend/rust-lib/flowy-folder/tests/workspace/folder_test.rs index 25d2387996..f7b93ed30a 100644 --- a/frontend/rust-lib/flowy-folder/tests/workspace/folder_test.rs +++ b/frontend/rust-lib/flowy-folder/tests/workspace/folder_test.rs @@ -292,53 +292,53 @@ async fn folder_sync_revision_seq() { .await; } -#[tokio::test] -async fn folder_sync_revision_with_new_app() { - let mut test = FolderTest::new().await; - let app_name = "AppFlowy contributors".to_owned(); - let app_desc = "Welcome to be a AppFlowy contributor".to_owned(); +// #[tokio::test] +// async fn folder_sync_revision_with_new_app() { +// let mut test = FolderTest::new().await; +// let app_name = "AppFlowy contributors".to_owned(); +// let app_desc = "Welcome to be a AppFlowy contributor".to_owned(); +// +// test.run_scripts(vec![ +// AssertNextSyncRevId(Some(1)), +// AssertNextSyncRevId(Some(2)), +// CreateApp { +// name: app_name.clone(), +// desc: app_desc.clone(), +// }, +// AssertCurrentRevId(3), +// AssertNextSyncRevId(Some(3)), +// AssertNextSyncRevId(None), +// ]) +// .await; +// +// let app = test.app.clone(); +// assert_eq!(app.name, app_name); +// assert_eq!(app.desc, app_desc); +// test.run_scripts(vec![ReadApp(app.id.clone()), AssertApp(app)]).await; +// } - test.run_scripts(vec![ - AssertNextSyncRevId(Some(1)), - AssertNextSyncRevId(Some(2)), - CreateApp { - name: app_name.clone(), - desc: app_desc.clone(), - }, - AssertCurrentRevId(3), - AssertNextSyncRevId(Some(3)), - AssertNextSyncRevId(None), - ]) - .await; - - let app = test.app.clone(); - assert_eq!(app.name, app_name); - assert_eq!(app.desc, app_desc); - test.run_scripts(vec![ReadApp(app.id.clone()), AssertApp(app)]).await; -} - -#[tokio::test] -async fn folder_sync_revision_with_new_view() { - let mut test = FolderTest::new().await; - let view_name = "AppFlowy features".to_owned(); - let view_desc = "😁".to_owned(); - - test.run_scripts(vec![ - AssertNextSyncRevId(Some(1)), - AssertNextSyncRevId(Some(2)), - CreateView { - name: view_name.clone(), - desc: view_desc.clone(), - data_type: ViewDataFormatPB::DeltaFormat, - }, - AssertCurrentRevId(3), - AssertNextSyncRevId(Some(3)), - AssertNextSyncRevId(None), - ]) - .await; - - let view = test.view.clone(); - assert_eq!(view.name, view_name); - test.run_scripts(vec![ReadView(view.id.clone()), AssertView(view)]) - .await; -} +// #[tokio::test] +// async fn folder_sync_revision_with_new_view() { +// let mut test = FolderTest::new().await; +// let view_name = "AppFlowy features".to_owned(); +// let view_desc = "😁".to_owned(); +// +// test.run_scripts(vec![ +// AssertNextSyncRevId(Some(1)), +// AssertNextSyncRevId(Some(2)), +// CreateView { +// name: view_name.clone(), +// desc: view_desc.clone(), +// data_type: ViewDataFormatPB::DeltaFormat, +// }, +// AssertCurrentRevId(3), +// AssertNextSyncRevId(Some(3)), +// AssertNextSyncRevId(None), +// ]) +// .await; +// +// let view = test.view.clone(); +// assert_eq!(view.name, view_name); +// test.run_scripts(vec![ReadView(view.id.clone()), AssertView(view)]) +// .await; +// } diff --git a/frontend/rust-lib/flowy-grid/src/manager.rs b/frontend/rust-lib/flowy-grid/src/manager.rs index f1f4824775..d44971c690 100644 --- a/frontend/rust-lib/flowy-grid/src/manager.rs +++ b/frontend/rust-lib/flowy-grid/src/manager.rs @@ -164,7 +164,7 @@ impl GridManager { ) -> FlowyResult>> { let user_id = self.grid_user.user_id()?; let disk_cache = SQLiteGridRevisionPersistence::new(&user_id, pool.clone()); - let configuration = RevisionPersistenceConfiguration::default(); + let configuration = RevisionPersistenceConfiguration::new(2); let rev_persistence = RevisionPersistence::new(&user_id, grid_id, disk_cache, configuration); let snapshot_persistence = SQLiteRevisionSnapshotPersistence::new(grid_id, pool); let rev_compactor = GridRevisionCompress(); @@ -179,7 +179,7 @@ impl GridManager { ) -> FlowyResult>> { let user_id = self.grid_user.user_id()?; let disk_cache = SQLiteGridBlockRevisionPersistence::new(&user_id, pool.clone()); - let configuration = RevisionPersistenceConfiguration::default(); + let configuration = RevisionPersistenceConfiguration::new(4); let rev_persistence = RevisionPersistence::new(&user_id, block_id, disk_cache, configuration); let rev_compactor = GridBlockRevisionCompress(); let snapshot_persistence = SQLiteRevisionSnapshotPersistence::new(block_id, pool); diff --git a/frontend/rust-lib/flowy-grid/src/services/block_manager.rs b/frontend/rust-lib/flowy-grid/src/services/block_manager.rs index a95fdb5e41..1750a3473b 100644 --- a/frontend/rust-lib/flowy-grid/src/services/block_manager.rs +++ b/frontend/rust-lib/flowy-grid/src/services/block_manager.rs @@ -275,7 +275,7 @@ async fn make_block_editor(user: &Arc, block_id: &str) -> FlowyRes let pool = user.db_pool()?; let disk_cache = SQLiteGridBlockRevisionPersistence::new(&user_id, pool.clone()); - let configuration = RevisionPersistenceConfiguration::default(); + let configuration = RevisionPersistenceConfiguration::new(4); let rev_persistence = RevisionPersistence::new(&user_id, block_id, disk_cache, configuration); let rev_compactor = GridBlockRevisionCompress(); let snapshot_persistence = SQLiteRevisionSnapshotPersistence::new(block_id, pool); diff --git a/frontend/rust-lib/flowy-grid/src/services/grid_view_manager.rs b/frontend/rust-lib/flowy-grid/src/services/grid_view_manager.rs index 6865b3bd32..f7de07bf6d 100644 --- a/frontend/rust-lib/flowy-grid/src/services/grid_view_manager.rs +++ b/frontend/rust-lib/flowy-grid/src/services/grid_view_manager.rs @@ -255,7 +255,7 @@ pub async fn make_grid_view_rev_manager( let pool = user.db_pool()?; let disk_cache = SQLiteGridViewRevisionPersistence::new(&user_id, pool.clone()); - let configuration = RevisionPersistenceConfiguration::default(); + let configuration = RevisionPersistenceConfiguration::new(2); let rev_persistence = RevisionPersistence::new(&user_id, view_id, disk_cache, configuration); let rev_compactor = GridViewRevisionCompress(); diff --git a/frontend/rust-lib/flowy-revision/Cargo.toml b/frontend/rust-lib/flowy-revision/Cargo.toml index 8e6800e823..049bfdad45 100644 --- a/frontend/rust-lib/flowy-revision/Cargo.toml +++ b/frontend/rust-lib/flowy-revision/Cargo.toml @@ -23,7 +23,7 @@ serde_json = {version = "1.0"} [dev-dependencies] nanoid = "0.4.0" -flowy-revision = {path = ".", features = ["flowy_unit_test"]} +flowy-revision = {path = "../flowy-revision", features = ["flowy_unit_test"]} serde = { version = "1.0", features = ["derive"] } serde_json = { version = "1.0" } parking_lot = "0.11" diff --git a/frontend/rust-lib/flowy-revision/src/rev_manager.rs b/frontend/rust-lib/flowy-revision/src/rev_manager.rs index 7033894ca5..c1bd8f531b 100644 --- a/frontend/rust-lib/flowy-revision/src/rev_manager.rs +++ b/frontend/rust-lib/flowy-revision/src/rev_manager.rs @@ -92,8 +92,6 @@ impl RevisionManager { let rev_compress = Arc::new(rev_compress); let rev_persistence = Arc::new(rev_persistence); let rev_snapshot = Arc::new(RevisionSnapshotManager::new(user_id, object_id, snapshot_persistence)); - #[cfg(feature = "flowy_unit_test")] - let (revision_ack_notifier, _) = tokio::sync::broadcast::channel(1); Self { object_id: object_id.to_string(), @@ -103,7 +101,7 @@ impl RevisionManager { rev_snapshot, rev_compress, #[cfg(feature = "flowy_unit_test")] - rev_ack_notifier: revision_ack_notifier, + rev_ack_notifier: tokio::sync::broadcast::channel(1).0, } } diff --git a/frontend/rust-lib/flowy-revision/src/rev_persistence.rs b/frontend/rust-lib/flowy-revision/src/rev_persistence.rs index c74cb4e21e..7b8f4c2b9e 100644 --- a/frontend/rust-lib/flowy-revision/src/rev_persistence.rs +++ b/frontend/rust-lib/flowy-revision/src/rev_persistence.rs @@ -360,10 +360,8 @@ impl DeferSyncSequence { 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 { - if self.compact_length > 0 { - self.compact_length -= 1; - } + if compact_rev_id <= pop_rev_id && self.compact_length > 0 { + self.compact_length -= 1; } } } diff --git a/frontend/rust-lib/flowy-revision/tests/revision_test/local_revision_test.rs b/frontend/rust-lib/flowy-revision/tests/revision_test/local_revision_test.rs index 2e4d3119f5..e530b3c01e 100644 --- a/frontend/rust-lib/flowy-revision/tests/revision_test/local_revision_test.rs +++ b/frontend/rust-lib/flowy-revision/tests/revision_test/local_revision_test.rs @@ -1,5 +1,4 @@ use crate::revision_test::script::{RevisionScript::*, RevisionTest}; -use flowy_revision::REVISION_WRITE_INTERVAL_IN_MILLIS; #[tokio::test] async fn revision_sync_test() { diff --git a/frontend/rust-lib/flowy-revision/tests/revision_test/revision_disk_test.rs b/frontend/rust-lib/flowy-revision/tests/revision_test/revision_disk_test.rs index 878e75ed58..aff0de8a11 100644 --- a/frontend/rust-lib/flowy-revision/tests/revision_test/revision_disk_test.rs +++ b/frontend/rust-lib/flowy-revision/tests/revision_test/revision_disk_test.rs @@ -1,6 +1,5 @@ use crate::revision_test::script::RevisionScript::*; use crate::revision_test::script::{InvalidRevisionObject, RevisionTest}; -use flowy_revision::REVISION_WRITE_INTERVAL_IN_MILLIS; #[tokio::test] async fn revision_write_to_disk_test() { @@ -67,7 +66,7 @@ async fn revision_read_from_disk_test() { AddLocalRevision { content: "456".to_string(), base_rev_id, - rev_id: rev_id.clone(), + rev_id, }, AckRevision { rev_id: 1 }, AssertNextSyncRevisionId { rev_id: Some(rev_id) }, @@ -76,23 +75,25 @@ async fn revision_read_from_disk_test() { } #[tokio::test] -#[should_panic] async fn revision_read_from_disk_with_invalid_record_test() { let test = RevisionTest::new_with_configuration(2).await; let (base_rev_id, rev_id) = test.next_rev_id_pair(); - test.run_script(AddLocalRevision { + test.run_scripts(vec![AddLocalRevision { content: "123".to_string(), base_rev_id, rev_id, - }) + }]) .await; let (base_rev_id, rev_id) = test.next_rev_id_pair(); - test.run_script(AddInvalidLocalRevision { - bytes: InvalidRevisionObject::new(), - base_rev_id, - rev_id, - }) + test.run_scripts(vec![ + AddInvalidLocalRevision { + bytes: InvalidRevisionObject::new().to_bytes(), + base_rev_id, + rev_id, + }, + WaitWhenWriteToDisk, + ]) .await; let test = RevisionTest::new_with_other(test).await; diff --git a/frontend/rust-lib/flowy-revision/tests/revision_test/script.rs b/frontend/rust-lib/flowy-revision/tests/revision_test/script.rs index b49cff9a6f..76f1833554 100644 --- a/frontend/rust-lib/flowy-revision/tests/revision_test/script.rs +++ b/frontend/rust-lib/flowy-revision/tests/revision_test/script.rs @@ -1,14 +1,14 @@ use bytes::Bytes; -use flowy_error::{FlowyError, FlowyResult}; +use flowy_error::{internal_error, FlowyError, FlowyResult}; use flowy_revision::disk::{RevisionChangeset, RevisionDiskCache, SyncRecord}; use flowy_revision::{ RevisionManager, RevisionMergeable, RevisionObjectDeserializer, RevisionPersistence, RevisionPersistenceConfiguration, RevisionSnapshotDiskCache, RevisionSnapshotInfo, REVISION_WRITE_INTERVAL_IN_MILLIS, }; -use flowy_sync::entities::document::DocumentPayloadPB; + use flowy_sync::entities::revision::{Revision, RevisionRange}; -use flowy_sync::util::{make_operations_from_revisions, md5}; +use flowy_sync::util::md5; use nanoid::nanoid; use parking_lot::RwLock; use serde::{Deserialize, Serialize}; @@ -175,7 +175,7 @@ impl RevisionTest { // let rev_id = self.rev_manager.next_sync_rev_id().await.unwrap(); let revision = self.rev_manager.get_revision(rev_id).await.unwrap(); - let object = RevisionObjectMock::from_bytes(&revision.bytes); + let object = RevisionObjectMock::from_bytes(&revision.bytes).unwrap(); assert_eq!(object.content, expected); } RevisionScript::WaitWhenWriteToDisk => { @@ -306,8 +306,9 @@ impl RevisionMergeable for RevisionCompressMock { fn combine_revisions(&self, revisions: Vec) -> FlowyResult { let mut object = RevisionObjectMock::new(""); for revision in revisions { - let other = RevisionObjectMock::from_bytes(&revision.bytes); - let _ = object.compose(other)?; + if let Ok(other) = RevisionObjectMock::from_bytes(&revision.bytes) { + let _ = object.compose(other)?; + } } Ok(Bytes::from(object.to_bytes())) } @@ -319,17 +320,16 @@ pub struct InvalidRevisionObject { } impl InvalidRevisionObject { - pub fn new() -> Vec { - let object = InvalidRevisionObject { data: "".to_string() }; - object.to_bytes() + pub fn new() -> Self { + InvalidRevisionObject { data: "".to_string() } } - fn to_bytes(&self) -> Vec { + pub(crate) fn to_bytes(&self) -> Vec { serde_json::to_vec(self).unwrap() } - fn from_bytes(bytes: &[u8]) -> Self { - serde_json::from_slice(bytes).unwrap() - } + // fn from_bytes(bytes: &[u8]) -> Self { + // serde_json::from_slice(bytes).unwrap() + // } } #[derive(Serialize, Deserialize)] @@ -351,8 +351,8 @@ impl RevisionObjectMock { serde_json::to_vec(self).unwrap() } - pub fn from_bytes(bytes: &[u8]) -> Self { - serde_json::from_slice(bytes).unwrap() + pub fn from_bytes(bytes: &[u8]) -> FlowyResult { + serde_json::from_slice(bytes).map_err(internal_error) } } @@ -360,15 +360,16 @@ pub struct RevisionObjectMockSerde(); impl RevisionObjectDeserializer for RevisionObjectMockSerde { type Output = RevisionObjectMock; - fn deserialize_revisions(object_id: &str, revisions: Vec) -> FlowyResult { + fn deserialize_revisions(_object_id: &str, revisions: Vec) -> FlowyResult { let mut object = RevisionObjectMock::new(""); if revisions.is_empty() { return Ok(object); } for revision in revisions { - let revision_object = RevisionObjectMock::from_bytes(&revision.bytes); - let _ = object.compose(revision_object)?; + if let Ok(revision_object) = RevisionObjectMock::from_bytes(&revision.bytes) { + let _ = object.compose(revision_object)?; + } } Ok(object)