From e85e60c0f2508f4d39af7779e91e9be0e6f5c3b0 Mon Sep 17 00:00:00 2001 From: Bartosz Sypytkowski Date: Tue, 17 Dec 2024 05:43:04 +0100 Subject: [PATCH] chore: revert from editing collab --- libs/database/src/collab/collab_storage.rs | 1 + .../src/collab/storage.rs | 56 ++++++++++++++++++- .../src/group/group_init.rs | 2 +- .../appflowy-collaborate/src/group/manager.rs | 4 +- .../src/indexer/indexer_scheduler.rs | 2 +- src/api/workspace.rs | 5 +- src/biz/collab/utils.rs | 1 + 7 files changed, 64 insertions(+), 7 deletions(-) diff --git a/libs/database/src/collab/collab_storage.rs b/libs/database/src/collab/collab_storage.rs index 6726328f..6a6cefc6 100644 --- a/libs/database/src/collab/collab_storage.rs +++ b/libs/database/src/collab/collab_storage.rs @@ -114,6 +114,7 @@ pub trait CollabStorage: Send + Sync + 'static { &self, origin: GetCollabOrigin, params: QueryCollabParams, + from_editing_collab: bool, ) -> AppResult; async fn batch_get_collab( diff --git a/services/appflowy-collaborate/src/collab/storage.rs b/services/appflowy-collaborate/src/collab/storage.rs index d838f43e..bdc0b06b 100644 --- a/services/appflowy-collaborate/src/collab/storage.rs +++ b/services/appflowy-collaborate/src/collab/storage.rs @@ -131,6 +131,47 @@ where .await?; Ok(()) } + async fn get_encode_collab_from_editing(&self, oid: &str) -> Option { + let object_id = oid.to_string(); + let (ret, rx) = tokio::sync::oneshot::channel(); + let timeout_duration = Duration::from_secs(5); + + // Attempt to send the command to the realtime server + if let Err(err) = self + .rt_cmd_sender + .send(CollaborationCommand::GetEncodeCollab { object_id, ret }) + .await + { + error!( + "Failed to send get encode collab command to realtime server: {}", + err + ); + return None; + } + + // Await the response from the realtime server with a timeout + match timeout(timeout_duration, rx).await { + Ok(Ok(Some(encode_collab))) => Some(encode_collab), + Ok(Ok(None)) => { + trace!("Editing collab not found: `{}`", oid); + None + }, + Ok(Err(err)) => { + error!( + "Failed to get collab from realtime server `{}`: {}", + oid, err + ); + None + }, + Err(_) => { + error!( + "Timeout trying to read collab `{}` from realtime server", + oid + ); + None + }, + } + } async fn batch_get_encode_collab_from_editing( &self, @@ -356,11 +397,12 @@ where } } - #[instrument(level = "trace", skip_all, fields(oid = %params.object_id))] + #[instrument(level = "trace", skip_all, fields(oid = %params.object_id, from_editing_collab = %from_editing_collab))] async fn get_encode_collab( &self, origin: GetCollabOrigin, params: QueryCollabParams, + from_editing_collab: bool, ) -> AppResult { params.validate()?; match origin { @@ -374,6 +416,18 @@ where GetCollabOrigin::Server => {}, } + // Early return if editing collab is initialized, as it indicates no need to query further. + if from_editing_collab { + // Attempt to retrieve encoded collab from the editing collab + if let Some(value) = self.get_encode_collab_from_editing(¶ms.object_id).await { + trace!( + "Did get encode collab {} from editing collab", + params.object_id + ); + return Ok(value); + } + } + let encode_collab = self .cache .get_encode_collab(¶ms.workspace_id, params.inner) diff --git a/services/appflowy-collaborate/src/group/group_init.rs b/services/appflowy-collaborate/src/group/group_init.rs index c39b9b96..cb17c703 100644 --- a/services/appflowy-collaborate/src/group/group_init.rs +++ b/services/appflowy-collaborate/src/group/group_init.rs @@ -1265,7 +1265,7 @@ impl CollabPersister { ); let result = self .storage - .get_encode_collab(GetCollabOrigin::Server, params) + .get_encode_collab(GetCollabOrigin::Server, params, false) .await; match result { Ok(encoded_collab) => encoded_collab.doc_state, diff --git a/services/appflowy-collaborate/src/group/manager.rs b/services/appflowy-collaborate/src/group/manager.rs index 3ca70680..78b16bcb 100644 --- a/services/appflowy-collaborate/src/group/manager.rs +++ b/services/appflowy-collaborate/src/group/manager.rs @@ -121,7 +121,7 @@ where let params = QueryCollabParams::new(object_id, collab_type.clone(), workspace_id); let res = self .storage - .get_encode_collab(GetCollabOrigin::Server, params) + .get_encode_collab(GetCollabOrigin::Server, params, false) .await; let state_vector = match res { Ok(collab) => Collab::new_with_source( @@ -175,7 +175,7 @@ where S: CollabStorage, { let encode_collab = storage - .get_encode_collab(GetCollabOrigin::User { uid }, params.clone()) + .get_encode_collab(GetCollabOrigin::User { uid }, params.clone(), false) .await?; let result = Collab::new_with_source( CollabOrigin::Server, diff --git a/services/appflowy-collaborate/src/indexer/indexer_scheduler.rs b/services/appflowy-collaborate/src/indexer/indexer_scheduler.rs index 04f3c990..0f0cc1de 100644 --- a/services/appflowy-collaborate/src/indexer/indexer_scheduler.rs +++ b/services/appflowy-collaborate/src/indexer/indexer_scheduler.rs @@ -345,7 +345,7 @@ fn get_unindexed_collabs( match &cid.collab_type { CollabType::Document => { let collab = storage - .get_encode_collab(GetCollabOrigin::Server, cid.clone().into()) + .get_encode_collab(GetCollabOrigin::Server, cid.clone().into(), false) .await?; yield UnindexedCollab { diff --git a/src/api/workspace.rs b/src/api/workspace.rs index 17dba969..3fe3c5ce 100644 --- a/src/api/workspace.rs +++ b/src/api/workspace.rs @@ -853,7 +853,7 @@ async fn get_collab_handler( let object_id = params.object_id.clone(); let encode_collab = state .collab_access_control_storage - .get_encode_collab(GetCollabOrigin::User { uid }, params) + .get_encode_collab(GetCollabOrigin::User { uid }, params, true) .await .map_err(AppResponseError::from)?; @@ -889,7 +889,7 @@ async fn v1_get_collab_handler( let encode_collab = state .collab_access_control_storage - .get_encode_collab(GetCollabOrigin::User { uid }, param) + .get_encode_collab(GetCollabOrigin::User { uid }, param, true) .await .map_err(AppResponseError::from)?; @@ -1174,6 +1174,7 @@ async fn create_collab_snapshot_handler( .get_encode_collab( GetCollabOrigin::User { uid }, QueryCollabParams::new(&object_id, collab_type.clone(), &workspace_id), + true, ) .await? .doc_state; diff --git a/src/biz/collab/utils.rs b/src/biz/collab/utils.rs index 87165fb7..c89bceb7 100644 --- a/src/biz/collab/utils.rs +++ b/src/biz/collab/utils.rs @@ -224,6 +224,7 @@ pub async fn get_latest_collab_encoded( collab_type, }, }, + true, ) .await }