From df5266d7c92da24196a0c5e5734344d6de985acb Mon Sep 17 00:00:00 2001 From: appflowy Date: Sat, 1 Jan 2022 16:53:12 +0800 Subject: [PATCH] fix https://github.com/AppFlowy-IO/appflowy/issues/196 --- backend/src/services/core/view/controller.rs | 2 +- backend/tests/api_test/workspace_test.rs | 2 +- .../flowy_sdk/lib/dispatch/dispatch.dart | 1 + .../src/services/doc/edit/editor.rs | 2 +- .../src/services/doc/revision/cache/cache.rs | 39 ++++++++++++------- .../src/services/doc/revision/manager.rs | 14 ++++--- .../src/services/doc/web_socket/web_socket.rs | 2 +- .../src/sql_tables/doc/rev_table.rs | 1 + .../src/entities/view/view_create.rs | 2 +- 9 files changed, 41 insertions(+), 24 deletions(-) diff --git a/backend/src/services/core/view/controller.rs b/backend/src/services/core/view/controller.rs index ed08f63b70..dc0d7a78ab 100644 --- a/backend/src/services/core/view/controller.rs +++ b/backend/src/services/core/view/controller.rs @@ -10,7 +10,7 @@ use backend_service::errors::{invalid_params, ServerError}; use bytes::Bytes; use chrono::Utc; use flowy_collaboration::{ - entities::revision::{RepeatedRevision, RevType, Revision}, + entities::revision::{RepeatedRevision, Revision}, protobuf::CreateDocParams, }; use flowy_core_data_model::{ diff --git a/backend/tests/api_test/workspace_test.rs b/backend/tests/api_test/workspace_test.rs index 1ef0c2f82f..558eeef8fd 100644 --- a/backend/tests/api_test/workspace_test.rs +++ b/backend/tests/api_test/workspace_test.rs @@ -5,7 +5,7 @@ use flowy_collaboration::{ document::{Document, PlainDoc}, entities::{ doc::{CreateDocParams, DocumentId}, - revision::{md5, RepeatedRevision, RevType, Revision}, + revision::{md5, RepeatedRevision, Revision}, }, }; use flowy_core_data_model::entities::{ diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dispatch.dart b/frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dispatch.dart index 2746f739af..1dd5d2728a 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dispatch.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dispatch.dart @@ -3,6 +3,7 @@ import 'package:dartz/dartz.dart'; import 'package:flowy_log/flowy_log.dart'; // ignore: unnecessary_import import 'package:flowy_sdk/protobuf/dart-ffi/ffi_response.pb.dart'; +import 'package:flowy_sdk/protobuf/dart-ffi/ffi_request.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-net/event.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-net/network_state.pb.dart'; diff --git a/frontend/rust-lib/flowy-document/src/services/doc/edit/editor.rs b/frontend/rust-lib/flowy-document/src/services/doc/edit/editor.rs index 161f99c1cd..167902af56 100644 --- a/frontend/rust-lib/flowy-document/src/services/doc/edit/editor.rs +++ b/frontend/rust-lib/flowy-document/src/services/doc/edit/editor.rs @@ -9,7 +9,7 @@ use crate::{ use bytes::Bytes; use flowy_collaboration::{ document::history::UndoResult, - entities::revision::{RevId, RevType, Revision}, + entities::revision::{RevId, Revision}, errors::CollaborateResult, }; use flowy_database::ConnectionPool; diff --git a/frontend/rust-lib/flowy-document/src/services/doc/revision/cache/cache.rs b/frontend/rust-lib/flowy-document/src/services/doc/revision/cache/cache.rs index 277ec83193..fbb974da10 100644 --- a/frontend/rust-lib/flowy-document/src/services/doc/revision/cache/cache.rs +++ b/frontend/rust-lib/flowy-document/src/services/doc/revision/cache/cache.rs @@ -6,20 +6,16 @@ use crate::{ }, sql_tables::{RevisionChangeset, RevisionTableState}, }; -use dashmap::DashMap; + use flowy_collaboration::entities::revision::{Revision, RevisionRange, RevisionState}; use flowy_database::ConnectionPool; use flowy_error::{internal_error, FlowyResult}; -use lib_infra::future::FutureResult; -use lib_ot::errors::OTError; -use std::{ - collections::VecDeque, - sync::{ - atomic::{AtomicI64, Ordering::SeqCst}, - Arc, - }, + +use std::sync::{ + atomic::{AtomicI64, Ordering::SeqCst}, + Arc, }; -use tokio::{sync::RwLock, task::spawn_blocking}; +use tokio::task::spawn_blocking; pub struct RevisionCache { doc_id: String, @@ -41,12 +37,21 @@ impl RevisionCache { } } - pub async fn add(&self, revision: Revision, state: RevisionState) -> FlowyResult { + pub async fn add( + &self, + revision: Revision, + state: RevisionState, + write_to_disk: bool, + ) -> FlowyResult { if self.memory_cache.contains(&revision.rev_id) { return Err(FlowyError::internal().context(format!("Duplicate remote revision id: {}", revision.rev_id))); } let rev_id = revision.rev_id; - let record = RevisionRecord { revision, state }; + let record = RevisionRecord { + revision, + state, + write_to_disk, + }; self.memory_cache.add(&record).await; self.set_latest_rev_id(rev_id); Ok(record) @@ -111,6 +116,7 @@ impl RevisionCache { .map(|revision| RevisionRecord { revision, state: RevisionState::Local, + write_to_disk: true, }) .collect::>(); @@ -128,9 +134,13 @@ impl RevisionCache { } impl RevisionMemoryCacheDelegate for Arc { - fn checkpoint_tick(&self, records: Vec) -> FlowyResult<()> { + fn checkpoint_tick(&self, mut records: Vec) -> FlowyResult<()> { let conn = &*self.pool.get().map_err(internal_error)?; - self.write_revision_records(records, &conn) + records.retain(|record| record.write_to_disk); + if !records.is_empty() { + let _ = self.write_revision_records(records, &conn)?; + } + Ok(()) } fn receive_ack(&self, doc_id: &str, rev_id: i64) { @@ -150,6 +160,7 @@ impl RevisionMemoryCacheDelegate for Arc { pub struct RevisionRecord { pub revision: Revision, pub state: RevisionState, + pub write_to_disk: bool, } impl RevisionRecord { diff --git a/frontend/rust-lib/flowy-document/src/services/doc/revision/manager.rs b/frontend/rust-lib/flowy-document/src/services/doc/revision/manager.rs index c7ff0449f4..f3e18cb2f1 100644 --- a/frontend/rust-lib/flowy-document/src/services/doc/revision/manager.rs +++ b/frontend/rust-lib/flowy-document/src/services/doc/revision/manager.rs @@ -7,7 +7,7 @@ use dashmap::DashMap; use flowy_collaboration::{ entities::{ doc::DocumentInfo, - revision::{RepeatedRevision, RevType, Revision, RevisionRange, RevisionState}, + revision::{RepeatedRevision, Revision, RevisionRange, RevisionState}, }, util::{md5, RevIdCounter}, }; @@ -68,13 +68,13 @@ impl RevisionManager { #[tracing::instrument(level = "debug", skip(self, revision))] pub async fn add_remote_revision(&self, revision: &Revision) -> Result<(), FlowyError> { self.rev_id_counter.set(revision.rev_id); - let _ = self.cache.add(revision.clone(), RevisionState::Ack).await?; + let _ = self.cache.add(revision.clone(), RevisionState::Ack, true).await?; Ok(()) } #[tracing::instrument(level = "debug", skip(self, revision))] pub async fn add_local_revision(&self, revision: &Revision) -> Result<(), FlowyError> { - let record = self.cache.add(revision.clone(), RevisionState::Local).await?; + let record = self.cache.add(revision.clone(), RevisionState::Local, true).await?; self.sync_seq.add_revision(record).await?; Ok(()) } @@ -206,14 +206,18 @@ impl RevisionLoader { &self.user_id, doc_md5, ); - let _ = self.cache.add(revision.clone(), RevisionState::Ack).await?; + let _ = self.cache.add(revision.clone(), RevisionState::Ack, true).await?; revisions = vec![revision]; } else { for record in &records { match record.state { RevisionState::Local => { // - match self.cache.add(record.revision.clone(), RevisionState::Local).await { + match self + .cache + .add(record.revision.clone(), RevisionState::Local, false) + .await + { Ok(_) => {}, Err(e) => tracing::error!("{}", e), } diff --git a/frontend/rust-lib/flowy-document/src/services/doc/web_socket/web_socket.rs b/frontend/rust-lib/flowy-document/src/services/doc/web_socket/web_socket.rs index 04bfde8c7c..377f96572e 100644 --- a/frontend/rust-lib/flowy-document/src/services/doc/web_socket/web_socket.rs +++ b/frontend/rust-lib/flowy-document/src/services/doc/web_socket/web_socket.rs @@ -10,7 +10,7 @@ use crate::services::doc::{ use bytes::Bytes; use flowy_collaboration::{ entities::{ - revision::{RepeatedRevision, RevType, Revision, RevisionRange}, + revision::{RepeatedRevision, Revision, RevisionRange}, ws::{DocumentClientWSData, NewDocumentUser}, }, errors::CollaborateResult, diff --git a/frontend/rust-lib/flowy-document/src/sql_tables/doc/rev_table.rs b/frontend/rust-lib/flowy-document/src/sql_tables/doc/rev_table.rs index 4fa5813890..34a0143d63 100644 --- a/frontend/rust-lib/flowy-document/src/sql_tables/doc/rev_table.rs +++ b/frontend/rust-lib/flowy-document/src/sql_tables/doc/rev_table.rs @@ -80,6 +80,7 @@ pub(crate) fn mk_revision_record_from_table(user_id: &str, table: RevisionTable) RevisionRecord { revision, state: table.state.into(), + write_to_disk: false, } } diff --git a/shared-lib/flowy-core-data-model/src/entities/view/view_create.rs b/shared-lib/flowy-core-data-model/src/entities/view/view_create.rs index ee85b476ad..329a67771b 100644 --- a/shared-lib/flowy-core-data-model/src/entities/view/view_create.rs +++ b/shared-lib/flowy-core-data-model/src/entities/view/view_create.rs @@ -98,7 +98,7 @@ impl CreateViewParams { } } - pub fn take_view_data(&mut self) -> String { ::std::mem::replace(&mut self.view_data, String::new()) } + pub fn take_view_data(&mut self) -> String { std::mem::take(&mut self.view_data) } } impl TryInto for CreateViewRequest {