|
@@ -2,16 +2,18 @@ use crate::services::grid_editor::GridRevisionEditor;
|
|
|
use crate::services::persistence::block_index::BlockIndexCache;
|
|
|
use crate::services::persistence::kv::GridKVPersistence;
|
|
|
use crate::services::persistence::GridDatabase;
|
|
|
+use crate::services::tasks::GridTaskScheduler;
|
|
|
use bytes::Bytes;
|
|
|
use dashmap::DashMap;
|
|
|
use flowy_database::ConnectionPool;
|
|
|
use flowy_error::{FlowyError, FlowyResult};
|
|
|
-use flowy_grid_data_model::revision::{BuildGridContext, GridRevision, GridSettingRevision};
|
|
|
+use flowy_grid_data_model::revision::{BuildGridContext, GridRevision};
|
|
|
use flowy_revision::disk::{SQLiteGridBlockMetaRevisionPersistence, SQLiteGridRevisionPersistence};
|
|
|
use flowy_revision::{RevisionManager, RevisionPersistence, RevisionWebSocket};
|
|
|
use flowy_sync::client_grid::{make_block_meta_delta, make_grid_delta};
|
|
|
use flowy_sync::entities::revision::{RepeatedRevision, Revision};
|
|
|
use std::sync::Arc;
|
|
|
+use tokio::sync::RwLock;
|
|
|
|
|
|
pub trait GridUser: Send + Sync {
|
|
|
fn user_id(&self) -> Result<String, FlowyError>;
|
|
@@ -20,11 +22,12 @@ pub trait GridUser: Send + Sync {
|
|
|
}
|
|
|
|
|
|
pub struct GridManager {
|
|
|
- editor_map: Arc<DashMap<String, Arc<GridRevisionEditor>>>,
|
|
|
+ grid_editors: Arc<DashMap<String, Arc<GridRevisionEditor>>>,
|
|
|
grid_user: Arc<dyn GridUser>,
|
|
|
block_index_cache: Arc<BlockIndexCache>,
|
|
|
#[allow(dead_code)]
|
|
|
kv_persistence: Arc<GridKVPersistence>,
|
|
|
+ task_scheduler: Arc<RwLock<GridTaskScheduler>>,
|
|
|
}
|
|
|
|
|
|
impl GridManager {
|
|
@@ -35,12 +38,14 @@ impl GridManager {
|
|
|
) -> Self {
|
|
|
let grid_editors = Arc::new(DashMap::new());
|
|
|
let kv_persistence = Arc::new(GridKVPersistence::new(database.clone()));
|
|
|
- let block_index_persistence = Arc::new(BlockIndexCache::new(database));
|
|
|
+ let block_index_cache = Arc::new(BlockIndexCache::new(database));
|
|
|
+ let task_scheduler = GridTaskScheduler::new();
|
|
|
Self {
|
|
|
- editor_map: grid_editors,
|
|
|
+ grid_editors,
|
|
|
grid_user,
|
|
|
kv_persistence,
|
|
|
- block_index_cache: block_index_persistence,
|
|
|
+ block_index_cache,
|
|
|
+ task_scheduler,
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -77,7 +82,7 @@ impl GridManager {
|
|
|
pub fn close_grid<T: AsRef<str>>(&self, grid_id: T) -> FlowyResult<()> {
|
|
|
let grid_id = grid_id.as_ref();
|
|
|
tracing::Span::current().record("grid_id", &grid_id);
|
|
|
- self.editor_map.remove(grid_id);
|
|
|
+ self.grid_editors.remove(grid_id);
|
|
|
Ok(())
|
|
|
}
|
|
|
|
|
@@ -85,7 +90,7 @@ impl GridManager {
|
|
|
pub fn delete_grid<T: AsRef<str>>(&self, grid_id: T) -> FlowyResult<()> {
|
|
|
let grid_id = grid_id.as_ref();
|
|
|
tracing::Span::current().record("grid_id", &grid_id);
|
|
|
- self.editor_map.remove(grid_id);
|
|
|
+ self.grid_editors.remove(grid_id);
|
|
|
Ok(())
|
|
|
}
|
|
|
|
|
@@ -93,23 +98,23 @@ impl GridManager {
|
|
|
|
|
|
// #[tracing::instrument(level = "debug", skip(self), err)]
|
|
|
pub fn get_grid_editor(&self, grid_id: &str) -> FlowyResult<Arc<GridRevisionEditor>> {
|
|
|
- match self.editor_map.get(grid_id) {
|
|
|
+ match self.grid_editors.get(grid_id) {
|
|
|
None => Err(FlowyError::internal().context("Should call open_grid function first")),
|
|
|
Some(editor) => Ok(editor.clone()),
|
|
|
}
|
|
|
}
|
|
|
|
|
|
async fn get_or_create_grid_editor(&self, grid_id: &str) -> FlowyResult<Arc<GridRevisionEditor>> {
|
|
|
- match self.editor_map.get(grid_id) {
|
|
|
+ match self.grid_editors.get(grid_id) {
|
|
|
None => {
|
|
|
tracing::trace!("Create grid editor with id: {}", grid_id);
|
|
|
let db_pool = self.grid_user.db_pool()?;
|
|
|
let editor = self.make_grid_editor(grid_id, db_pool).await?;
|
|
|
|
|
|
- if self.editor_map.contains_key(grid_id) {
|
|
|
+ if self.grid_editors.contains_key(grid_id) {
|
|
|
tracing::warn!("Grid:{} already exists in cache", grid_id);
|
|
|
}
|
|
|
- self.editor_map.insert(grid_id.to_string(), editor.clone());
|
|
|
+ self.grid_editors.insert(grid_id.to_string(), editor.clone());
|
|
|
Ok(editor)
|
|
|
}
|
|
|
Some(editor) => Ok(editor.clone()),
|
|
@@ -124,7 +129,14 @@ impl GridManager {
|
|
|
) -> Result<Arc<GridRevisionEditor>, FlowyError> {
|
|
|
let user = self.grid_user.clone();
|
|
|
let rev_manager = self.make_grid_rev_manager(grid_id, pool.clone())?;
|
|
|
- let grid_editor = GridRevisionEditor::new(grid_id, user, rev_manager, self.block_index_cache.clone()).await?;
|
|
|
+ let grid_editor = GridRevisionEditor::new(
|
|
|
+ grid_id,
|
|
|
+ user,
|
|
|
+ rev_manager,
|
|
|
+ self.block_index_cache.clone(),
|
|
|
+ self.task_scheduler.clone(),
|
|
|
+ )
|
|
|
+ .await?;
|
|
|
Ok(grid_editor)
|
|
|
}
|
|
|
|
|
@@ -164,10 +176,10 @@ pub async fn make_grid_view_data(
|
|
|
});
|
|
|
|
|
|
// Create grid's block
|
|
|
- let grid_block_meta_delta = make_block_meta_delta(&block_meta_data);
|
|
|
+ let grid_block_meta_delta = make_block_meta_delta(block_meta_data);
|
|
|
let block_meta_delta_data = grid_block_meta_delta.to_delta_bytes();
|
|
|
let repeated_revision: RepeatedRevision =
|
|
|
- Revision::initial_revision(user_id, &block_id, block_meta_delta_data).into();
|
|
|
+ Revision::initial_revision(user_id, block_id, block_meta_delta_data).into();
|
|
|
let _ = grid_manager
|
|
|
.create_grid_block_meta(&block_id, repeated_revision)
|
|
|
.await?;
|