Feat/restore from snapshot (#1699)

* feat: snapshot for folder

* feat: snapshot for document

Co-authored-by: nathan <nathan@appflowy.io>
This commit is contained in:
Nathan.fooo
2023-01-12 22:31:39 +08:00
committed by GitHub
parent 6a36bcd31d
commit 9215f5188c
30 changed files with 287 additions and 111 deletions

View File

@ -170,7 +170,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(100, false);
let configuration = RevisionPersistenceConfiguration::new(200, false);
let rev_persistence = RevisionPersistence::new(user_id, object_id, disk_cache, configuration);
let rev_compactor = FolderRevisionMergeable();

View File

@ -9,7 +9,8 @@ use flowy_revision::{
RevisionWebSocket,
};
use flowy_sync::client_folder::{FolderChangeset, FolderPad};
use flowy_sync::util::make_operations_from_revisions;
use flowy_sync::server_folder::FolderOperations;
use flowy_sync::util::{make_operations_from_revisions, recover_operation_from_revisions};
use lib_infra::future::FutureResult;
use lib_ot::core::EmptyAttributes;
use parking_lot::RwLock;
@ -102,8 +103,19 @@ impl RevisionObjectDeserializer for FolderRevisionSerde {
type Output = FolderPad;
fn deserialize_revisions(_object_id: &str, revisions: Vec<Revision>) -> FlowyResult<Self::Output> {
let pad = FolderPad::from_revisions(revisions)?;
Ok(pad)
let operations: FolderOperations = make_operations_from_revisions(revisions)?;
Ok(FolderPad::from_operations(operations)?)
}
fn recover_operations_from_revisions(revisions: Vec<Revision>) -> Option<Self::Output> {
if let Some(operations) = recover_operation_from_revisions(revisions, |operations| {
FolderPad::from_operations(operations.clone()).is_ok()
}) {
if let Ok(pad) = FolderPad::from_operations(operations) {
return Some(pad);
}
}
None
}
}

View File

@ -123,7 +123,7 @@ fn migration_flag_key(user_id: &str, version: &str) -> String {
md5(format!("{}{}", user_id, version,))
}
pub struct FolderRevisionResettable {
struct FolderRevisionResettable {
folder_id: String,
}

View File

@ -118,12 +118,12 @@ impl FolderPersistence {
write_to_disk: true,
};
let disk_cache = mk_text_block_revision_disk_cache(user_id, pool);
let disk_cache = make_folder_revision_disk_cache(user_id, pool);
disk_cache.delete_and_insert_records(folder_id.as_ref(), None, vec![record])
}
}
pub fn mk_text_block_revision_disk_cache(
pub fn make_folder_revision_disk_cache(
user_id: &str,
pool: Arc<ConnectionPool>,
) -> Arc<dyn RevisionDiskCache<Arc<ConnectionPool>, Error = FlowyError>> {

View File

@ -65,7 +65,7 @@ impl RevisionSnapshotDiskCache for SQLiteFolderRevisionSnapshotPersistence {
let conn = self.pool.get().map_err(internal_error)?;
let latest_record = dsl::folder_rev_snapshot
.filter(dsl::object_id.eq(&self.object_id))
.order(dsl::rev_id.desc())
.order(dsl::timestamp.desc())
// .select(max(dsl::rev_id))
// .select((dsl::id, dsl::object_id, dsl::rev_id, dsl::data))
.first::<FolderSnapshotRecord>(&*conn)?;

View File

@ -1,5 +1,5 @@
mod folder_rev_sqlite;
mod folder_snapshot_sqlite_impl;
mod folder_snapshot;
pub use folder_rev_sqlite::*;
pub use folder_snapshot_sqlite_impl::*;
pub use folder_snapshot::*;