Skip to content

Commit ebdd28c

Browse files
committed
chore: add ref count map
1 parent de4c1b2 commit ebdd28c

File tree

6 files changed

+136
-50
lines changed

6 files changed

+136
-50
lines changed

frontend/rust-lib/flowy-grid/src/event_handler.rs

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ pub(crate) async fn update_grid_setting_handler(
4242
) -> Result<(), FlowyError> {
4343
let params: GridSettingChangesetParams = data.into_inner().try_into()?;
4444

45-
let editor = manager.get_grid_editor(&params.grid_id)?;
45+
let editor = manager.get_grid_editor(&params.grid_id).await?;
4646
if let Some(insert_params) = params.insert_group {
4747
let _ = editor.insert_group(insert_params).await?;
4848
}
@@ -67,7 +67,7 @@ pub(crate) async fn get_grid_blocks_handler(
6767
manager: AppData<Arc<GridManager>>,
6868
) -> DataResult<RepeatedBlockPB, FlowyError> {
6969
let params: QueryGridBlocksParams = data.into_inner().try_into()?;
70-
let editor = manager.get_grid_editor(&params.grid_id)?;
70+
let editor = manager.get_grid_editor(&params.grid_id).await?;
7171
let repeated_grid_block = editor.get_blocks(Some(params.block_ids)).await?;
7272
data_result(repeated_grid_block)
7373
}
@@ -78,7 +78,7 @@ pub(crate) async fn get_fields_handler(
7878
manager: AppData<Arc<GridManager>>,
7979
) -> DataResult<RepeatedFieldPB, FlowyError> {
8080
let params: QueryFieldParams = data.into_inner().try_into()?;
81-
let editor = manager.get_grid_editor(&params.grid_id)?;
81+
let editor = manager.get_grid_editor(&params.grid_id).await?;
8282
let field_orders = params
8383
.field_ids
8484
.items
@@ -96,7 +96,7 @@ pub(crate) async fn update_field_handler(
9696
manager: AppData<Arc<GridManager>>,
9797
) -> Result<(), FlowyError> {
9898
let changeset: FieldChangesetParams = data.into_inner().try_into()?;
99-
let editor = manager.get_grid_editor(&changeset.grid_id)?;
99+
let editor = manager.get_grid_editor(&changeset.grid_id).await?;
100100
let _ = editor.update_field(changeset).await?;
101101
Ok(())
102102
}
@@ -107,7 +107,7 @@ pub(crate) async fn update_field_type_option_handler(
107107
manager: AppData<Arc<GridManager>>,
108108
) -> Result<(), FlowyError> {
109109
let params: UpdateFieldTypeOptionParams = data.into_inner().try_into()?;
110-
let editor = manager.get_grid_editor(&params.grid_id)?;
110+
let editor = manager.get_grid_editor(&params.grid_id).await?;
111111
let _ = editor
112112
.update_field_type_option(&params.grid_id, &params.field_id, params.type_option_data)
113113
.await?;
@@ -120,7 +120,7 @@ pub(crate) async fn delete_field_handler(
120120
manager: AppData<Arc<GridManager>>,
121121
) -> Result<(), FlowyError> {
122122
let params: FieldIdParams = data.into_inner().try_into()?;
123-
let editor = manager.get_grid_editor(&params.grid_id)?;
123+
let editor = manager.get_grid_editor(&params.grid_id).await?;
124124
let _ = editor.delete_field(&params.field_id).await?;
125125
Ok(())
126126
}
@@ -131,7 +131,7 @@ pub(crate) async fn switch_to_field_handler(
131131
manager: AppData<Arc<GridManager>>,
132132
) -> Result<(), FlowyError> {
133133
let params: EditFieldParams = data.into_inner().try_into()?;
134-
let editor = manager.get_grid_editor(&params.grid_id)?;
134+
let editor = manager.get_grid_editor(&params.grid_id).await?;
135135
editor
136136
.switch_to_field_type(&params.field_id, &params.field_type)
137137
.await?;
@@ -157,7 +157,7 @@ pub(crate) async fn duplicate_field_handler(
157157
manager: AppData<Arc<GridManager>>,
158158
) -> Result<(), FlowyError> {
159159
let params: FieldIdParams = data.into_inner().try_into()?;
160-
let editor = manager.get_grid_editor(&params.grid_id)?;
160+
let editor = manager.get_grid_editor(&params.grid_id).await?;
161161
let _ = editor.duplicate_field(&params.field_id).await?;
162162
Ok(())
163163
}
@@ -169,7 +169,7 @@ pub(crate) async fn get_field_type_option_data_handler(
169169
manager: AppData<Arc<GridManager>>,
170170
) -> DataResult<FieldTypeOptionDataPB, FlowyError> {
171171
let params: FieldTypeOptionIdParams = data.into_inner().try_into()?;
172-
let editor = manager.get_grid_editor(&params.grid_id)?;
172+
let editor = manager.get_grid_editor(&params.grid_id).await?;
173173
match editor.get_field_rev(&params.field_id).await {
174174
None => Err(FlowyError::record_not_found()),
175175
Some(field_rev) => {
@@ -192,7 +192,7 @@ pub(crate) async fn create_field_type_option_data_handler(
192192
manager: AppData<Arc<GridManager>>,
193193
) -> DataResult<FieldTypeOptionDataPB, FlowyError> {
194194
let params: CreateFieldParams = data.into_inner().try_into()?;
195-
let editor = manager.get_grid_editor(&params.grid_id)?;
195+
let editor = manager.get_grid_editor(&params.grid_id).await?;
196196
let field_rev = editor
197197
.create_new_field_rev(&params.field_type, params.type_option_data)
198198
.await?;
@@ -212,7 +212,7 @@ pub(crate) async fn move_field_handler(
212212
manager: AppData<Arc<GridManager>>,
213213
) -> Result<(), FlowyError> {
214214
let params: MoveFieldParams = data.into_inner().try_into()?;
215-
let editor = manager.get_grid_editor(&params.grid_id)?;
215+
let editor = manager.get_grid_editor(&params.grid_id).await?;
216216
let _ = editor.move_field(params).await?;
217217
Ok(())
218218
}
@@ -237,7 +237,7 @@ pub(crate) async fn get_row_handler(
237237
manager: AppData<Arc<GridManager>>,
238238
) -> DataResult<OptionalRowPB, FlowyError> {
239239
let params: RowIdParams = data.into_inner().try_into()?;
240-
let editor = manager.get_grid_editor(&params.grid_id)?;
240+
let editor = manager.get_grid_editor(&params.grid_id).await?;
241241
let row = editor.get_row_rev(&params.row_id).await?.map(make_row_from_row_rev);
242242

243243
data_result(OptionalRowPB { row })
@@ -249,7 +249,7 @@ pub(crate) async fn delete_row_handler(
249249
manager: AppData<Arc<GridManager>>,
250250
) -> Result<(), FlowyError> {
251251
let params: RowIdParams = data.into_inner().try_into()?;
252-
let editor = manager.get_grid_editor(&params.grid_id)?;
252+
let editor = manager.get_grid_editor(&params.grid_id).await?;
253253
let _ = editor.delete_row(&params.row_id).await?;
254254
Ok(())
255255
}
@@ -260,7 +260,7 @@ pub(crate) async fn duplicate_row_handler(
260260
manager: AppData<Arc<GridManager>>,
261261
) -> Result<(), FlowyError> {
262262
let params: RowIdParams = data.into_inner().try_into()?;
263-
let editor = manager.get_grid_editor(&params.grid_id)?;
263+
let editor = manager.get_grid_editor(&params.grid_id).await?;
264264
let _ = editor.duplicate_row(&params.row_id).await?;
265265
Ok(())
266266
}
@@ -271,7 +271,7 @@ pub(crate) async fn move_row_handler(
271271
manager: AppData<Arc<GridManager>>,
272272
) -> Result<(), FlowyError> {
273273
let params: MoveRowParams = data.into_inner().try_into()?;
274-
let editor = manager.get_grid_editor(&params.view_id)?;
274+
let editor = manager.get_grid_editor(&params.view_id).await?;
275275
let _ = editor.move_row(params).await?;
276276
Ok(())
277277
}
@@ -282,7 +282,7 @@ pub(crate) async fn create_table_row_handler(
282282
manager: AppData<Arc<GridManager>>,
283283
) -> DataResult<RowPB, FlowyError> {
284284
let params: CreateRowParams = data.into_inner().try_into()?;
285-
let editor = manager.get_grid_editor(params.grid_id.as_ref())?;
285+
let editor = manager.get_grid_editor(params.grid_id.as_ref()).await?;
286286
let row = editor.create_row(params).await?;
287287
data_result(row)
288288
}
@@ -293,7 +293,7 @@ pub(crate) async fn get_cell_handler(
293293
manager: AppData<Arc<GridManager>>,
294294
) -> DataResult<GridCellPB, FlowyError> {
295295
let params: GridCellIdParams = data.into_inner().try_into()?;
296-
let editor = manager.get_grid_editor(&params.grid_id)?;
296+
let editor = manager.get_grid_editor(&params.grid_id).await?;
297297
match editor.get_cell(&params).await {
298298
None => data_result(GridCellPB::empty(&params.field_id)),
299299
Some(cell) => data_result(cell),
@@ -306,7 +306,7 @@ pub(crate) async fn update_cell_handler(
306306
manager: AppData<Arc<GridManager>>,
307307
) -> Result<(), FlowyError> {
308308
let changeset: CellChangesetPB = data.into_inner();
309-
let editor = manager.get_grid_editor(&changeset.grid_id)?;
309+
let editor = manager.get_grid_editor(&changeset.grid_id).await?;
310310
let _ = editor.update_cell(changeset).await?;
311311
Ok(())
312312
}
@@ -317,7 +317,7 @@ pub(crate) async fn new_select_option_handler(
317317
manager: AppData<Arc<GridManager>>,
318318
) -> DataResult<SelectOptionPB, FlowyError> {
319319
let params: CreateSelectOptionParams = data.into_inner().try_into()?;
320-
let editor = manager.get_grid_editor(&params.grid_id)?;
320+
let editor = manager.get_grid_editor(&params.grid_id).await?;
321321
match editor.get_field_rev(&params.field_id).await {
322322
None => Err(ErrorCode::InvalidData.into()),
323323
Some(field_rev) => {
@@ -334,7 +334,7 @@ pub(crate) async fn update_select_option_handler(
334334
manager: AppData<Arc<GridManager>>,
335335
) -> Result<(), FlowyError> {
336336
let changeset: SelectOptionChangeset = data.into_inner().try_into()?;
337-
let editor = manager.get_grid_editor(&changeset.cell_identifier.grid_id)?;
337+
let editor = manager.get_grid_editor(&changeset.cell_identifier.grid_id).await?;
338338

339339
let _ = editor
340340
.modify_field_rev(&changeset.cell_identifier.field_id, |field_rev| {
@@ -391,7 +391,7 @@ pub(crate) async fn get_select_option_handler(
391391
manager: AppData<Arc<GridManager>>,
392392
) -> DataResult<SelectOptionCellDataPB, FlowyError> {
393393
let params: GridCellIdParams = data.into_inner().try_into()?;
394-
let editor = manager.get_grid_editor(&params.grid_id)?;
394+
let editor = manager.get_grid_editor(&params.grid_id).await?;
395395
match editor.get_field_rev(&params.field_id).await {
396396
None => {
397397
tracing::error!("Can't find the select option field with id: {}", params.field_id);
@@ -420,7 +420,7 @@ pub(crate) async fn update_select_option_cell_handler(
420420
manager: AppData<Arc<GridManager>>,
421421
) -> Result<(), FlowyError> {
422422
let params: SelectOptionCellChangesetParams = data.into_inner().try_into()?;
423-
let editor = manager.get_grid_editor(&params.cell_identifier.grid_id)?;
423+
let editor = manager.get_grid_editor(&params.cell_identifier.grid_id).await?;
424424
let _ = editor.update_cell(params.into()).await?;
425425
Ok(())
426426
}
@@ -431,7 +431,7 @@ pub(crate) async fn update_date_cell_handler(
431431
manager: AppData<Arc<GridManager>>,
432432
) -> Result<(), FlowyError> {
433433
let params: DateChangesetParams = data.into_inner().try_into()?;
434-
let editor = manager.get_grid_editor(&params.cell_identifier.grid_id)?;
434+
let editor = manager.get_grid_editor(&params.cell_identifier.grid_id).await?;
435435
let _ = editor.update_cell(params.into()).await?;
436436
Ok(())
437437
}
@@ -442,7 +442,7 @@ pub(crate) async fn get_groups_handler(
442442
manager: AppData<Arc<GridManager>>,
443443
) -> DataResult<RepeatedGridGroupPB, FlowyError> {
444444
let params: GridIdPB = data.into_inner();
445-
let editor = manager.get_grid_editor(&params.value)?;
445+
let editor = manager.get_grid_editor(&params.value).await?;
446446
let group = editor.load_groups().await?;
447447
data_result(group)
448448
}
@@ -453,7 +453,7 @@ pub(crate) async fn create_board_card_handler(
453453
manager: AppData<Arc<GridManager>>,
454454
) -> DataResult<RowPB, FlowyError> {
455455
let params: CreateRowParams = data.into_inner().try_into()?;
456-
let editor = manager.get_grid_editor(params.grid_id.as_ref())?;
456+
let editor = manager.get_grid_editor(params.grid_id.as_ref()).await?;
457457
let row = editor.create_row(params).await?;
458458
data_result(row)
459459
}
@@ -464,7 +464,7 @@ pub(crate) async fn move_group_handler(
464464
manager: AppData<Arc<GridManager>>,
465465
) -> FlowyResult<()> {
466466
let params: MoveGroupParams = data.into_inner().try_into()?;
467-
let editor = manager.get_grid_editor(params.view_id.as_ref())?;
467+
let editor = manager.get_grid_editor(params.view_id.as_ref()).await?;
468468
let _ = editor.move_group(params).await?;
469469
Ok(())
470470
}
@@ -475,7 +475,7 @@ pub(crate) async fn move_group_row_handler(
475475
manager: AppData<Arc<GridManager>>,
476476
) -> FlowyResult<()> {
477477
let params: MoveGroupRowParams = data.into_inner().try_into()?;
478-
let editor = manager.get_grid_editor(params.view_id.as_ref())?;
478+
let editor = manager.get_grid_editor(params.view_id.as_ref()).await?;
479479
let _ = editor.move_group_row(params).await?;
480480
Ok(())
481481
}

frontend/rust-lib/flowy-grid/src/manager.rs

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ use flowy_revision::{
1919
};
2020
use flowy_sync::client_grid::{make_grid_block_operations, make_grid_operations, make_grid_view_operations};
2121
use flowy_sync::entities::revision::Revision;
22+
use lib_infra::ref_map::{RefCountHashMap, RefCountValue};
23+
use std::collections::HashMap;
2224
use std::sync::Arc;
2325
use tokio::sync::RwLock;
2426

@@ -31,7 +33,7 @@ pub trait GridUser: Send + Sync {
3133
pub type GridTaskSchedulerRwLock = Arc<RwLock<GridTaskScheduler>>;
3234

3335
pub struct GridManager {
34-
grid_editors: Arc<DashMap<String, Arc<GridRevisionEditor>>>,
36+
grid_editors: RwLock<RefCountHashMap<Arc<GridRevisionEditor>>>,
3537
grid_user: Arc<dyn GridUser>,
3638
block_index_cache: Arc<BlockIndexCache>,
3739
#[allow(dead_code)]
@@ -46,7 +48,7 @@ impl GridManager {
4648
_rev_web_socket: Arc<dyn RevisionWebSocket>,
4749
database: Arc<dyn GridDatabase>,
4850
) -> Self {
49-
let grid_editors = Arc::new(DashMap::new());
51+
let grid_editors = RwLock::new(RefCountHashMap::new());
5052
let kv_persistence = Arc::new(GridKVPersistence::new(database.clone()));
5153
let block_index_cache = Arc::new(BlockIndexCache::new(database.clone()));
5254
let task_scheduler = GridTaskScheduler::new();
@@ -107,35 +109,33 @@ impl GridManager {
107109
pub async fn close_grid<T: AsRef<str>>(&self, grid_id: T) -> FlowyResult<()> {
108110
let grid_id = grid_id.as_ref();
109111
tracing::Span::current().record("grid_id", &grid_id);
110-
self.grid_editors.remove(grid_id);
112+
113+
self.grid_editors.write().await.remove(grid_id);
111114
self.task_scheduler.write().await.unregister_handler(grid_id);
112115
Ok(())
113116
}
114117

115118
// #[tracing::instrument(level = "debug", skip(self), err)]
116-
pub fn get_grid_editor(&self, grid_id: &str) -> FlowyResult<Arc<GridRevisionEditor>> {
117-
match self.grid_editors.get(grid_id) {
119+
pub async fn get_grid_editor(&self, grid_id: &str) -> FlowyResult<Arc<GridRevisionEditor>> {
120+
match self.grid_editors.read().await.get(grid_id) {
118121
None => Err(FlowyError::internal().context("Should call open_grid function first")),
119122
Some(editor) => Ok(editor.clone()),
120123
}
121124
}
122125

123126
async fn get_or_create_grid_editor(&self, grid_id: &str) -> FlowyResult<Arc<GridRevisionEditor>> {
124-
match self.grid_editors.get(grid_id) {
125-
None => {
126-
if let Some(editor) = self.grid_editors.get(grid_id) {
127-
tracing::warn!("Grid:{} already open", grid_id);
128-
Ok(editor.clone())
129-
} else {
130-
let db_pool = self.grid_user.db_pool()?;
131-
let editor = self.make_grid_rev_editor(grid_id, db_pool).await?;
132-
self.grid_editors.insert(grid_id.to_string(), editor.clone());
133-
self.task_scheduler.write().await.register_handler(editor.clone());
134-
Ok(editor)
135-
}
136-
}
137-
Some(editor) => Ok(editor.clone()),
127+
if let Some(editor) = self.grid_editors.read().await.get(grid_id) {
128+
return Ok(editor.clone());
138129
}
130+
131+
let db_pool = self.grid_user.db_pool()?;
132+
let editor = self.make_grid_rev_editor(grid_id, db_pool).await?;
133+
self.grid_editors
134+
.write()
135+
.await
136+
.insert(grid_id.to_string(), editor.clone());
137+
self.task_scheduler.write().await.register_handler(editor.clone());
138+
Ok(editor)
139139
}
140140

141141
#[tracing::instrument(level = "trace", skip(self, pool), err)]
@@ -240,3 +240,9 @@ pub async fn make_grid_view_data(
240240

241241
Ok(grid_rev_delta_bytes)
242242
}
243+
244+
impl RefCountValue for GridRevisionEditor {
245+
fn did_remove(&self) {
246+
self.close();
247+
}
248+
}

frontend/rust-lib/flowy-grid/src/services/grid_editor.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ impl GridRevisionEditor {
9494
Ok(editor)
9595
}
9696

97+
pub fn close(&self) {}
98+
9799
/// Save the type-option data to disk and send a `GridNotification::DidUpdateField` notification
98100
/// to dart side.
99101
///

0 commit comments

Comments
 (0)