chore: try to fix when load data from cloud cause windows delay rendering (#6708)

This commit is contained in:
Nathan.fooo 2024-11-04 13:53:02 +08:00 committed by GitHub
parent a1d0dba0a5
commit 3fbdcab7b0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 79 additions and 53 deletions

View file

@ -150,7 +150,7 @@ impl AppFlowyCollabBuilder {
level = "trace",
skip(self, data_source, collab_db, builder_config, data)
)]
pub fn create_document(
pub async fn create_document(
&self,
object: CollabObject,
data_source: DataSource,
@ -160,7 +160,7 @@ impl AppFlowyCollabBuilder {
) -> Result<Arc<RwLock<Document>>, Error> {
let expected_collab_type = CollabType::Document;
assert_eq!(object.collab_type, expected_collab_type);
let mut collab = self.build_collab(&object, &collab_db, data_source)?;
let mut collab = self.build_collab(&object, &collab_db, data_source).await?;
collab.enable_undo_redo();
let document = match data {
@ -192,7 +192,7 @@ impl AppFlowyCollabBuilder {
level = "trace",
skip(self, object, doc_state, collab_db, builder_config, folder_notifier)
)]
pub fn create_folder(
pub async fn create_folder(
&self,
object: CollabObject,
doc_state: DataSource,
@ -205,11 +205,11 @@ impl AppFlowyCollabBuilder {
assert_eq!(object.collab_type, expected_collab_type);
let folder = match folder_data {
None => {
let collab = self.build_collab(&object, &collab_db, doc_state)?;
let collab = self.build_collab(&object, &collab_db, doc_state).await?;
Folder::open(object.uid, collab, folder_notifier)?
},
Some(data) => {
let collab = self.build_collab(&object, &collab_db, doc_state)?;
let collab = self.build_collab(&object, &collab_db, doc_state).await?;
let folder = Folder::create(object.uid, collab, folder_notifier, data);
if let Err(err) = self.write_collab_to_disk(
object.uid,
@ -233,7 +233,7 @@ impl AppFlowyCollabBuilder {
level = "trace",
skip(self, object, doc_state, collab_db, builder_config, notifier)
)]
pub fn create_user_awareness(
pub async fn create_user_awareness(
&self,
object: CollabObject,
doc_state: DataSource,
@ -243,7 +243,7 @@ impl AppFlowyCollabBuilder {
) -> Result<Arc<RwLock<UserAwareness>>, Error> {
let expected_collab_type = CollabType::UserAwareness;
assert_eq!(object.collab_type, expected_collab_type);
let collab = self.build_collab(&object, &collab_db, doc_state)?;
let collab = self.build_collab(&object, &collab_db, doc_state).await?;
let user_awareness = UserAwareness::create(collab, notifier)?;
let user_awareness = Arc::new(RwLock::new(user_awareness));
self.finalize(object, builder_config, user_awareness)
@ -266,27 +266,34 @@ impl AppFlowyCollabBuilder {
self.finalize(object, builder_config, workspace)
}
pub fn build_collab(
pub async fn build_collab(
&self,
object: &CollabObject,
collab_db: &Weak<CollabKVDB>,
data_source: DataSource,
) -> Result<Collab, Error> {
let mut collab = CollabBuilder::new(object.uid, &object.object_id, data_source)
.with_device_id(self.workspace_integrate.device_id()?)
.build()?;
let object = object.clone();
let collab_db = collab_db.clone();
let device_id = self.workspace_integrate.device_id()?;
let collab = tokio::task::spawn_blocking(move || {
let mut collab = CollabBuilder::new(object.uid, &object.object_id, data_source)
.with_device_id(device_id)
.build()?;
let persistence_config = CollabPersistenceConfig::default();
let db_plugin = RocksdbDiskPlugin::new_with_config(
object.uid,
object.workspace_id.clone(),
object.object_id.to_string(),
object.collab_type.clone(),
collab_db,
persistence_config,
);
collab.add_plugin(Box::new(db_plugin));
collab.initialize();
Ok::<_, Error>(collab)
})
.await??;
let persistence_config = CollabPersistenceConfig::default();
let db_plugin = RocksdbDiskPlugin::new_with_config(
object.uid,
object.workspace_id.clone(),
object.object_id.to_string(),
object.collab_type.clone(),
collab_db.clone(),
persistence_config.clone(),
);
collab.add_plugin(Box::new(db_plugin));
collab.initialize();
Ok(collab)
}

View file

@ -870,7 +870,8 @@ impl DatabaseCollabService for WorkspaceDatabaseCollabServiceImpl {
let collab_db = self.collab_db()?;
let collab = self
.collab_builder
.build_collab(&object, &collab_db, data_source)?;
.build_collab(&object, &collab_db, data_source)
.await?;
Ok(collab)
}

View file

@ -42,7 +42,7 @@ pub(crate) async fn get_encode_collab_handler(
let manager = upgrade_document(manager)?;
let params: OpenDocumentParams = data.into_inner().try_into()?;
let doc_id = params.document_id;
let state = manager.get_encoded_collab_with_view_id(&doc_id)?;
let state = manager.get_encoded_collab_with_view_id(&doc_id).await?;
data_result_ok(EncodedCollabPB {
state_vector: Vec::from(state.state_vector),
doc_state: Vec::from(state.doc_state),

View file

@ -82,13 +82,15 @@ impl DocumentManager {
}
/// Get the encoded collab of the document.
pub fn get_encoded_collab_with_view_id(&self, doc_id: &str) -> FlowyResult<EncodedCollab> {
pub async fn get_encoded_collab_with_view_id(&self, doc_id: &str) -> FlowyResult<EncodedCollab> {
let uid = self.user_service.user_id()?;
let workspace_id = self.user_service.workspace_id()?;
let doc_state =
CollabPersistenceImpl::new(self.user_service.collab_db(uid)?, uid, workspace_id)
.into_data_source();
let collab = self.collab_for_document(uid, doc_id, doc_state, false)?;
let collab = self
.collab_for_document(uid, doc_id, doc_state, false)
.await?;
let encoded_collab = collab
.try_read()
.unwrap()
@ -167,7 +169,7 @@ impl DocumentManager {
}
}
fn collab_for_document(
async fn collab_for_document(
&self,
uid: i64,
doc_id: &str,
@ -180,13 +182,16 @@ impl DocumentManager {
self
.collab_builder
.collab_object(&workspace_id, uid, doc_id, CollabType::Document)?;
let document = self.collab_builder.create_document(
collab_object,
data_source,
db,
CollabBuilderConfig::default().sync_enable(sync_enable),
None,
)?;
let document = self
.collab_builder
.create_document(
collab_object,
data_source,
db,
CollabBuilderConfig::default().sync_enable(sync_enable),
None,
)
.await?;
Ok(document)
}
@ -243,7 +248,9 @@ impl DocumentManager {
doc_id,
self.user_service.workspace_id()
);
let result = self.collab_for_document(uid, doc_id, doc_state, enable_sync);
let result = self
.collab_for_document(uid, doc_id, doc_state, enable_sync)
.await;
match result {
Ok(document) => {
// Only push the document to the cache if the sync is enabled.

View file

@ -170,14 +170,17 @@ impl FolderManager {
self
.collab_builder
.collab_object(workspace_id, uid, object_id, CollabType::Folder)?;
let result = self.collab_builder.create_folder(
collab_object,
data_source,
collab_db,
config,
folder_notifier,
None,
);
let result = self
.collab_builder
.create_folder(
collab_object,
data_source,
collab_db,
config,
folder_notifier,
None,
)
.await;
// If opening the folder fails due to missing required data (indicated by a `FolderError::NoRequiredData`),
// the function logs an informational message and attempts to clear the folder data by deleting its
@ -213,14 +216,17 @@ impl FolderManager {
let doc_state = CollabPersistenceImpl::new(collab_db.clone(), uid, workspace_id.to_string())
.into_data_source();
let folder = self.collab_builder.create_folder(
collab_object,
doc_state,
collab_db,
CollabBuilderConfig::default().sync_enable(true),
notifier,
folder_data,
)?;
let folder = self
.collab_builder
.create_folder(
collab_object,
doc_state,
collab_db,
CollabBuilderConfig::default().sync_enable(true),
notifier,
folder_data,
)
.await?;
Ok(folder)
}

View file

@ -170,7 +170,8 @@ impl UserManager {
collab_db,
doc_state,
None,
)?;
)
.await?;
info!("User awareness initialized successfully");
self.user_awareness.store(Some(awareness));
if let Some(mut is_loading) = self.is_loading_awareness.get_mut(&object_id) {
@ -238,6 +239,7 @@ impl UserManager {
doc_state,
None,
)
.await
} else {
let result = cloud_services
.get_user_service()?
@ -256,6 +258,7 @@ impl UserManager {
DataSource::DocStateV1(data),
None,
)
.await
},
Err(err) => {
if err.is_record_not_found() {
@ -275,6 +278,7 @@ impl UserManager {
doc_state,
None,
)
.await
} else {
Err(err)
}
@ -315,7 +319,7 @@ impl UserManager {
/// This function constructs a collaboration instance based on the given session and raw data,
/// using a collaboration builder. This instance is specifically geared towards handling
/// user awareness.
fn collab_for_user_awareness(
async fn collab_for_user_awareness(
collab_builder: &Weak<AppFlowyCollabBuilder>,
workspace_id: &str,
uid: i64,
@ -338,6 +342,7 @@ impl UserManager {
CollabBuilderConfig::default().sync_enable(true),
notifier,
)
.await
.context("Build collab for user awareness failed")?;
Ok(collab)
}