diff --git a/MareSynchronosServer/MareSynchronosServer/Services/ClientPairPermissionsCleanupService.cs b/MareSynchronosServer/MareSynchronosServer/Services/ClientPairPermissionsCleanupService.cs index 8b0d178..270bacb 100644 --- a/MareSynchronosServer/MareSynchronosServer/Services/ClientPairPermissionsCleanupService.cs +++ b/MareSynchronosServer/MareSynchronosServer/Services/ClientPairPermissionsCleanupService.cs @@ -28,14 +28,13 @@ public class ClientPairPermissionsCleanupService(ILogger> toRemovePermsParallel = []; + ConcurrentDictionary completionDebugPrint = []; int parallelProcessed = 0; int userNo = 0; int lastUserNo = 0; using var db = await _dbContextFactory.CreateDbContextAsync(ct).ConfigureAwait(false); _logger.LogInformation("Building All Pairs"); - var allPairs = await GetAllPairs(db, ct).ConfigureAwait(false); - _logger.LogInformation("Found a total distinct of {count} pairs", allPairs.Values.Sum(v => v.Count)); _logger.LogInformation("Collecting Users"); var users = (await db.Users.Select(k => k.UID).AsNoTracking().ToListAsync(ct).ConfigureAwait(false)).Order(StringComparer.Ordinal).ToList(); @@ -59,19 +58,26 @@ public class ClientPairPermissionsCleanupService(ILogger 0.05) + { + // 5% processed without writing, might as well save at this point + await loopCts.CancelAsync().ConfigureAwait(false); + } } if (processedAdd > MaxProcessingPerChunk) @@ -108,8 +114,6 @@ public class ClientPairPermissionsCleanupService(ILogger>> GetAllPairs(MareDbContext dbContext, CancellationToken ct) + private async Task> GetAllPairsForUser(string uid, MareDbContext dbContext, CancellationToken ct) { - var entries = await dbContext.ClientPairs.AsNoTracking().Select(k => new { Self = k.UserUID, Other = k.OtherUserUID }) + var entries = await dbContext.ClientPairs.AsNoTracking().Where(k => k.UserUID == uid).Select(k => k.OtherUserUID) .Concat( - dbContext.GroupPairs.AsNoTracking() + dbContext.GroupPairs.Where(k => k.GroupUserUID == uid).AsNoTracking() .Join(dbContext.GroupPairs.AsNoTracking(), a => a.GroupGID, b => b.GroupGID, - (a, b) => new { Self = a.GroupUserUID, Other = b.GroupUserUID }) - .Where(a => a.Self != a.Other)) + (a, b) => b.GroupUserUID) + .Where(a => a != uid)) .ToListAsync(ct).ConfigureAwait(false); - return new(entries.GroupBy(k => k.Self, StringComparer.Ordinal) - .ToDictionary(k => k.Key, k => k.Any() ? k.Select(k => k.Other).Distinct(StringComparer.Ordinal).ToList() : [], StringComparer.Ordinal), StringComparer.Ordinal); + return entries.Distinct(StringComparer.Ordinal).ToList(); } protected override async Task ExecuteAsync(CancellationToken ct)