diff --git a/packages/@n8n/blob-storage/src/__tests__/fs-byte-store.integration.test.ts b/packages/@n8n/blob-storage/src/__tests__/fs-byte-store.integration.test.ts index 97d8814c444..66dd8ccd601 100644 --- a/packages/@n8n/blob-storage/src/__tests__/fs-byte-store.integration.test.ts +++ b/packages/@n8n/blob-storage/src/__tests__/fs-byte-store.integration.test.ts @@ -125,6 +125,18 @@ describe('delete', () => { it('does not throw on deleting a missing key', async () => { await expect(store.delete(['a/missing.json'])).resolves.toBeUndefined(); }); + + it('passes a retry budget to each file removal', async () => { + await store.write('a/one.json', body); + const rmSpy = vi.spyOn(fs, 'rm'); + + await store.delete(['a/one.json']); + + expect(rmSpy).toHaveBeenCalledWith(join(storagePath, 'a/one.json'), { + force: true, + maxRetries: 3, + }); + }); }); describe('write (stream)', () => { diff --git a/packages/@n8n/blob-storage/src/fs-byte-store.ts b/packages/@n8n/blob-storage/src/fs-byte-store.ts index e18896daa1e..33838bbed5e 100644 --- a/packages/@n8n/blob-storage/src/fs-byte-store.ts +++ b/packages/@n8n/blob-storage/src/fs-byte-store.ts @@ -94,7 +94,7 @@ export class FsByteStore implements ByteStore { async delete(keys: ByteStoreKey[]) { const deletePaths = keys.map((key) => this.getAbsolutePath(key)); - await Promise.all(deletePaths.map(async (p) => await fs.rm(p, { force: true }))); + await Promise.all(deletePaths.map(async (p) => await fs.rm(p, { force: true, maxRetries: 3 }))); const dirs = [...new Set(deletePaths.map((p) => path.dirname(p)))]; await Promise.all(dirs.map(async (dir) => await this.removeEmptyAncestors(dir))); }