From ac0bae6be9c2d1b249103746154ff6593e95e9b4 Mon Sep 17 00:00:00 2001 From: mytharcher Date: Fri, 16 Aug 2024 06:49:53 +0000 Subject: [PATCH] fix(plugins): revert lock usage back for some plugins --- .../plugin-action-export/package.json | 1 + .../src/server/actions/export-xlsx.ts | 31 ++++++------------- .../plugin-action-import/package.json | 1 + .../src/server/actions/import-xlsx.ts | 28 ++++++----------- 4 files changed, 22 insertions(+), 39 deletions(-) diff --git a/packages/plugins/@nocobase/plugin-action-export/package.json b/packages/plugins/@nocobase/plugin-action-export/package.json index db10d0cfd8..85e9d7e1fc 100644 --- a/packages/plugins/@nocobase/plugin-action-export/package.json +++ b/packages/plugins/@nocobase/plugin-action-export/package.json @@ -14,6 +14,7 @@ "@formily/react": "2.x", "@formily/shared": "2.x", "@types/node-xlsx": "^0.15.1", + "async-mutex": "^0.5.0", "file-saver": "^2.0.5", "node-xlsx": "^0.16.1", "react": "^18.2.0", diff --git a/packages/plugins/@nocobase/plugin-action-export/src/server/actions/export-xlsx.ts b/packages/plugins/@nocobase/plugin-action-export/src/server/actions/export-xlsx.ts index 81430e65aa..f37f94ea8a 100644 --- a/packages/plugins/@nocobase/plugin-action-export/src/server/actions/export-xlsx.ts +++ b/packages/plugins/@nocobase/plugin-action-export/src/server/actions/export-xlsx.ts @@ -12,9 +12,10 @@ import { Repository } from '@nocobase/database'; import XlsxExporter from '../xlsx-exporter'; import XLSX from 'xlsx'; +import { Mutex } from 'async-mutex'; import { DataSource } from '@nocobase/data-source-manager'; -import PluginActionExportServer from '..'; -import { LockAcquireError } from '@nocobase/lock-manager'; + +const mutex = new Mutex(); async function exportXlsxAction(ctx: Context, next: Next) { const { title, filter, sort, fields, except } = ctx.action.params; @@ -52,27 +53,15 @@ async function exportXlsxAction(ctx: Context, next: Next) { } export async function exportXlsx(ctx: Context, next: Next) { - const plugin = ctx.app.pm.get(PluginActionExportServer) as PluginActionExportServer; - const { collection } = ctx.getCurrentRepository(); - const dataSource = ctx.dataSource as DataSource; - const lockKey = `${plugin.name}:${dataSource.name}:${collection.name}`; - let lock; - try { - lock = ctx.app.lockManager.tryAcquire(lockKey); - } catch (error) { - if (error instanceof LockAcquireError) { - throw new Error( - ctx.t(`another export action is running, please try again later.`, { - ns: 'action-export', - }), - { - cause: error, - }, - ); - } + if (mutex.isLocked()) { + throw new Error( + ctx.t(`another export action is running, please try again later.`, { + ns: 'action-export', + }), + ); } - const release = await lock.acquire(5000); + const release = await mutex.acquire(); try { await exportXlsxAction(ctx, next); diff --git a/packages/plugins/@nocobase/plugin-action-import/package.json b/packages/plugins/@nocobase/plugin-action-import/package.json index eb27d8035e..31fa642e5e 100644 --- a/packages/plugins/@nocobase/plugin-action-import/package.json +++ b/packages/plugins/@nocobase/plugin-action-import/package.json @@ -18,6 +18,7 @@ "@koa/multer": "^3.0.2", "@types/node-xlsx": "^0.15.1", "antd": "5.x", + "async-mutex": "^0.5.0", "file-saver": "^2.0.5", "mathjs": "^10.6.0", "node-xlsx": "^0.16.1", diff --git a/packages/plugins/@nocobase/plugin-action-import/src/server/actions/import-xlsx.ts b/packages/plugins/@nocobase/plugin-action-import/src/server/actions/import-xlsx.ts index 28f40122fa..2a3ab234b9 100644 --- a/packages/plugins/@nocobase/plugin-action-import/src/server/actions/import-xlsx.ts +++ b/packages/plugins/@nocobase/plugin-action-import/src/server/actions/import-xlsx.ts @@ -10,13 +10,14 @@ import { Context, Next } from '@nocobase/actions'; import { Repository } from '@nocobase/database'; import XLSX from 'xlsx'; +import { Mutex } from 'async-mutex'; import { XlsxImporter } from '../services/xlsx-importer'; import { DataSource } from '@nocobase/data-source-manager'; -import PluginActionImportServer from '..'; -import { LockAcquireError } from '@nocobase/lock-manager'; const IMPORT_LIMIT_COUNT = 2000; +const mutex = new Mutex(); + async function importXlsxAction(ctx: Context, next: Next) { let columns = (ctx.request.body as any).columns as any[]; if (typeof columns === 'string') { @@ -59,24 +60,15 @@ async function importXlsxAction(ctx: Context, next: Next) { } export async function importXlsx(ctx: Context, next: Next) { - const plugin = ctx.app.pm.get(PluginActionImportServer) as PluginActionImportServer; - const { collection } = ctx.getCurrentRepository(); - const dataSource = ctx.dataSource as DataSource; - const lockKey = `${plugin.name}:${dataSource.name}:${collection.name}`; - let lock; - try { - lock = ctx.app.lockManager.tryAcquire(lockKey); - } catch (error) { - if (error instanceof LockAcquireError) { - throw new Error( - ctx.t(`another import action is running, please try again later.`, { - ns: 'action-import', - }), - ); - } + if (mutex.isLocked()) { + throw new Error( + ctx.t(`another export action is running, please try again later.`, { + ns: 'action-export', + }), + ); } - const release = await lock.acquire(5000); + const release = await mutex.acquire(); try { await importXlsxAction(ctx, next);