Speed up delete of recycled files by skipping check

This commit is contained in:
2025-07-27 12:46:03 +08:00
parent b405a46005
commit e428e04435

View File

@@ -548,11 +548,13 @@ public class FileService(
await DeleteFileDataAsync(file); await DeleteFileDataAsync(file);
} }
private async Task DeleteFileDataAsync(CloudFile file) private async Task DeleteFileDataAsync(CloudFile file, bool force = false)
{ {
if (file.StorageId is null) return; if (file.StorageId is null) return;
if (!file.PoolId.HasValue) return; if (!file.PoolId.HasValue) return;
if (!force)
{
// Check if any other file with the same storage ID is referenced // Check if any other file with the same storage ID is referenced
var sameOriginFiles = await db.Files var sameOriginFiles = await db.Files
.Where(f => f.StorageId == file.StorageId && f.Id != file.Id) .Where(f => f.StorageId == file.StorageId && f.Id != file.Id)
@@ -562,6 +564,7 @@ public class FileService(
// Check if any of these files are referenced // Check if any of these files are referenced
if (sameOriginFiles.Count != 0) if (sameOriginFiles.Count != 0)
return; return;
}
// If any other file with the same storage ID is referenced, don't delete the actual file data // If any other file with the same storage ID is referenced, don't delete the actual file data
var dest = await GetRemoteStorageConfig(file.PoolId.Value); var dest = await GetRemoteStorageConfig(file.PoolId.Value);
@@ -593,6 +596,7 @@ public class FileService(
logger.LogWarning("Failed to delete compressed version of file {fileId}", file.Id); logger.LogWarning("Failed to delete compressed version of file {fileId}", file.Id);
} }
} }
if (file.HasThumbnail) if (file.HasThumbnail)
{ {
try try
@@ -755,7 +759,7 @@ public class FileService(
.Where(f => f.AccountId == accountId && f.IsMarkedRecycle) .Where(f => f.AccountId == accountId && f.IsMarkedRecycle)
.ToListAsync(); .ToListAsync();
var count = files.Count; var count = files.Count;
var tasks = files.Select(DeleteFileDataAsync); var tasks = files.Select(f => DeleteFileDataAsync(f, true));
await Task.WhenAll(tasks); await Task.WhenAll(tasks);
var fileIds = files.Select(f => f.Id).ToList(); var fileIds = files.Select(f => f.Id).ToList();
await _PurgeCacheRangeAsync(fileIds); await _PurgeCacheRangeAsync(fileIds);
@@ -770,7 +774,7 @@ public class FileService(
.Where(f => f.PoolId == poolId && f.IsMarkedRecycle) .Where(f => f.PoolId == poolId && f.IsMarkedRecycle)
.ToListAsync(); .ToListAsync();
var count = files.Count; var count = files.Count;
var tasks = files.Select(DeleteFileDataAsync); var tasks = files.Select(f => DeleteFileDataAsync(f, true));
await Task.WhenAll(tasks); await Task.WhenAll(tasks);
var fileIds = files.Select(f => f.Id).ToList(); var fileIds = files.Select(f => f.Id).ToList();
await _PurgeCacheRangeAsync(fileIds); await _PurgeCacheRangeAsync(fileIds);
@@ -785,7 +789,7 @@ public class FileService(
.Where(f => f.IsMarkedRecycle) .Where(f => f.IsMarkedRecycle)
.ToListAsync(); .ToListAsync();
var count = files.Count; var count = files.Count;
var tasks = files.Select(DeleteFileDataAsync); var tasks = files.Select(f => DeleteFileDataAsync(f, true));
await Task.WhenAll(tasks); await Task.WhenAll(tasks);
var fileIds = files.Select(f => f.Id).ToList(); var fileIds = files.Select(f => f.Id).ToList();
await _PurgeCacheRangeAsync(fileIds); await _PurgeCacheRangeAsync(fileIds);