diff --git a/MareSynchronosServer/MareSynchronosServer/Services/ClientPairPermissionsCleanupService.cs b/MareSynchronosServer/MareSynchronosServer/Services/ClientPairPermissionsCleanupService.cs index 83efd2d..8d1d717 100644 --- a/MareSynchronosServer/MareSynchronosServer/Services/ClientPairPermissionsCleanupService.cs +++ b/MareSynchronosServer/MareSynchronosServer/Services/ClientPairPermissionsCleanupService.cs @@ -5,6 +5,7 @@ using MareSynchronosShared.Services; using MareSynchronosShared.Utils.Configuration; using Microsoft.EntityFrameworkCore; using System.Collections.Concurrent; +using System.Data; using System.Diagnostics; namespace MareSynchronosServer.Services; @@ -29,6 +30,7 @@ public class ClientPairPermissionsCleanupService(ILogger> toRemovePermsParallel = []; int parallelProcessed = 0; int userNo = 0; + int lastUserNo = 0; using var db = await _dbContextFactory.CreateDbContextAsync(ct).ConfigureAwait(false); _logger.LogInformation("Building All Pairs"); @@ -57,7 +59,7 @@ public class ClientPairPermissionsCleanupService(ILogger v).ToList()); - await db.SaveChangesAsync(ct).ConfigureAwait(false); + try + { + parallelProcessed = 0; - _logger.LogInformation("Removed {newDeleted} entities, settling...", removedEntries - priorRemovedEntries); - priorRemovedEntries = removedEntries; + _logger.LogInformation("Removing {newDeleted} entities and writing to database", removedEntries - priorRemovedEntries); + db.Permissions.RemoveRange(toRemovePermsParallel.Values.SelectMany(v => v).ToList()); + await db.SaveChangesAsync(ct).ConfigureAwait(false); + + _logger.LogInformation("Removed {newDeleted} entities, settling...", removedEntries - priorRemovedEntries); + priorRemovedEntries = removedEntries; + lastUserNo = userNo; + } + catch (DBConcurrencyException ex) + { + _logger.LogWarning(ex, "Concurrency Exception during User Permissions Cleanup, restarting at {last}", lastUserNo); + userNo = lastUserNo; + removedEntries = priorRemovedEntries; + continue; + } + finally + { + toRemovePermsParallel.Clear(); + } - parallelProcessed = 0; - toRemovePermsParallel.Clear(); await Task.Delay(TimeSpan.FromSeconds(5), ct).ConfigureAwait(false); } @@ -142,6 +159,11 @@ public class ClientPairPermissionsCleanupService(ILogger