From 0c7982697bf3856e4a43990c8f2d5728087139af Mon Sep 17 00:00:00 2001 From: dakkar Date: Tue, 29 Jul 2025 10:38:08 +0100 Subject: [PATCH] ignore missing local files when deleting them without this, clearing cached files would fail when some local files had already been deleted thanks to Siina for reporting the problem --- packages/backend/src/core/DriveService.ts | 28 ++++++++++++++++++----- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/packages/backend/src/core/DriveService.ts b/packages/backend/src/core/DriveService.ts index b9be4e3039..9d0cb578d0 100644 --- a/packages/backend/src/core/DriveService.ts +++ b/packages/backend/src/core/DriveService.ts @@ -738,14 +738,14 @@ export class DriveService { @bindThis public async deleteFile(file: MiDriveFile, isExpired = false, deleter?: MiUser) { if (file.storedInternal) { - this.internalStorageService.del(file.accessKey!); + this.deleteLocalFile(file.accessKey!); if (file.thumbnailUrl) { - this.internalStorageService.del(file.thumbnailAccessKey!); + this.deleteLocalFile(file.thumbnailAccessKey!); } if (file.webpublicUrl) { - this.internalStorageService.del(file.webpublicAccessKey!); + this.deleteLocalFile(file.webpublicAccessKey!); } } else if (!file.isLink) { this.queueService.createDeleteObjectStorageFileJob(file.accessKey!); @@ -767,14 +767,14 @@ export class DriveService { const promises = []; if (file.storedInternal) { - promises.push(this.internalStorageService.del(file.accessKey!)); + promises.push(this.deleteLocalFile(file.accessKey!)); if (file.thumbnailUrl) { - promises.push(this.internalStorageService.del(file.thumbnailAccessKey!)); + promises.push(this.deleteLocalFile(file.thumbnailAccessKey!)); } if (file.webpublicUrl) { - promises.push(this.internalStorageService.del(file.webpublicAccessKey!)); + promises.push(this.deleteLocalFile(file.webpublicAccessKey!)); } } else if (!file.isLink) { promises.push(this.deleteObjectStorageFile(file.accessKey!)); @@ -861,6 +861,22 @@ export class DriveService { } } + @bindThis + public async deleteLocalFile(key: string) { + try { + await this.internalStorageService.del(key); + } catch (err: any) { + if (err.code === 'ENOENT') { + this.deleteLogger.warn(`The file to delete did not exist: ${key}. Skipping this.`); + return; + } else { + throw new Error(`Failed to delete the file: ${key}`, { + cause: err, + }); + } + } + } + @bindThis public async uploadFromUrl({ url,