From 7b7bfcac93cda27ea723f20992466f68aea18746 Mon Sep 17 00:00:00 2001 From: hailin Date: Tue, 24 Feb 2026 01:45:24 -0800 Subject: [PATCH] =?UTF-8?q?fix(snapshot):=20onModuleInit=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=89=AB=E6=8F=8F=E4=B8=B4=E6=97=B6=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=B8=85=E7=90=86=E5=AD=A4=E5=84=BF=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SQLite 可能因重建丢失任务记录,导致 onModuleInit 仅靠查数据库 无法清理遗留的临时目录。新增逻辑:启动时扫描临时目录所有子目录, 若数据库中不存在对应任务则直接删除。 Co-Authored-By: Claude Opus 4.6 --- .../services/snapshot-orchestrator.service.ts | 11 +++++++++++ .../infrastructure/storage/local-storage.adapter.ts | 8 ++++++++ 2 files changed, 19 insertions(+) diff --git a/backend/services/snapshot-service/src/application/services/snapshot-orchestrator.service.ts b/backend/services/snapshot-service/src/application/services/snapshot-orchestrator.service.ts index 752bc4a8..912b0cb1 100644 --- a/backend/services/snapshot-service/src/application/services/snapshot-orchestrator.service.ts +++ b/backend/services/snapshot-service/src/application/services/snapshot-orchestrator.service.ts @@ -36,12 +36,23 @@ export class SnapshotOrchestratorService implements OnModuleInit { } async onModuleInit(): Promise { + // 1. 标记数据库中遗留的 RUNNING 任务为 FAILED const stale = await this.repo.findByStatus(SnapshotStatus.RUNNING); for (const task of stale) { await this.repo.updateTaskStatus(task.id, SnapshotStatus.FAILED, '服务重启,任务中断'); this.localStorage.deleteTask(task.id); this.logger.warn(`遗留任务已标记失败: ${task.id}`); } + + // 2. 扫描临时目录,清理数据库中不存在的孤儿目录 + const dirIds = this.localStorage.listTaskDirs(); + for (const dirId of dirIds) { + const task = await this.repo.findById(dirId); + if (!task) { + this.localStorage.deleteTask(dirId); + this.logger.warn(`清理孤儿临时目录: ${dirId}`); + } + } } getAvailableTargets(): BackupTarget[] { diff --git a/backend/services/snapshot-service/src/infrastructure/storage/local-storage.adapter.ts b/backend/services/snapshot-service/src/infrastructure/storage/local-storage.adapter.ts index 6b56a55c..21b145c7 100644 --- a/backend/services/snapshot-service/src/infrastructure/storage/local-storage.adapter.ts +++ b/backend/services/snapshot-service/src/infrastructure/storage/local-storage.adapter.ts @@ -36,6 +36,14 @@ export class LocalStorageAdapter { } } + /** 列出临时目录中所有任务子目录的 ID */ + listTaskDirs(): string[] { + if (!fs.existsSync(this.tempDir)) return []; + return fs.readdirSync(this.tempDir, { withFileTypes: true }) + .filter((e) => e.isDirectory()) + .map((e) => e.name); + } + cleanupExpired(retentionHours: number): string[] { const threshold = Date.now() - retentionHours * 60 * 60 * 1000; const deletedIds: string[] = [];