diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.cs index eb61823..03d24d6 100644 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.cs +++ b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.cs @@ -91,11 +91,12 @@ namespace MareSynchronosServer.Hubs { MareMetrics.Connections.Dec(); - var user = await _dbContext.Users.AsNoTracking().SingleOrDefaultAsync(u => u.UID == AuthenticatedUserId); + var user = await _dbContext.Users.SingleOrDefaultAsync(u => u.UID == AuthenticatedUserId); if (user != null && !string.IsNullOrEmpty(user.CharacterIdentification)) { MareMetrics.AuthorizedConnections.Dec(); - _logger.LogInformation("Disconnect from " + AuthenticatedUserId); + + _logger.LogInformation("Disconnect from " + AuthenticatedUserId); var query = from userToOther in _dbContext.ClientPairs @@ -112,15 +113,14 @@ namespace MareSynchronosServer.Hubs userToOther.UserUID == user.UID && !userToOther.IsPaused && !otherToUser.IsPaused - select otherToUser; + select otherToUser.UserUID; var otherEntries = await query.ToListAsync(); - - await Clients.Users(otherEntries.Select(e => e.User.UID)).SendAsync(Api.OnUserRemoveOnlinePairedPlayer, user.CharacterIdentification); - var notUploadedFiles = _dbContext.Files.Where(f => !f.Uploaded && f.Uploader.UID == user.UID).ToList(); - _dbContext.RemoveRange(notUploadedFiles); + await Clients.Users(otherEntries).SendAsync(Api.OnUserRemoveOnlinePairedPlayer, user.CharacterIdentification); - (await _dbContext.Users.SingleAsync(u => u.UID == AuthenticatedUserId)).CharacterIdentification = null; + _dbContext.RemoveRange(_dbContext.Files.Where(f => !f.Uploaded && f.Uploader.UID == user.UID)); + + user.CharacterIdentification = null; await _dbContext.SaveChangesAsync(); } diff --git a/MareSynchronosServer/MareSynchronosServer/Throttling/SignalRLimitFilter.cs b/MareSynchronosServer/MareSynchronosServer/Throttling/SignalRLimitFilter.cs index a28d138..37ac72d 100644 --- a/MareSynchronosServer/MareSynchronosServer/Throttling/SignalRLimitFilter.cs +++ b/MareSynchronosServer/MareSynchronosServer/Throttling/SignalRLimitFilter.cs @@ -15,7 +15,8 @@ public class SignalRLimitFilter : IHubFilter private readonly IRateLimitProcessor _processor; private readonly IHttpContextAccessor accessor; private readonly ILogger logger; - private static SemaphoreSlim ConnectionLimiterSemaphore = new SemaphoreSlim(20); + private static SemaphoreSlim ConnectionLimiterSemaphore = new(20); + private static SemaphoreSlim DisconnectLimiterSemaphore = new(20); public SignalRLimitFilter( IOptions options, IProcessingStrategy processing, IIpPolicyStore policyStore, IHttpContextAccessor accessor, ILogger logger) @@ -76,20 +77,34 @@ public class SignalRLimitFilter : IHubFilter try { - await Task.Delay(100); + await Task.Delay(250); await next(context); } - catch { } + catch (Exception ex) + { + logger.LogWarning(ex, "Error on OnConnectedAsync"); + } finally { ConnectionLimiterSemaphore.Release(); } } - // Optional method - public Task OnDisconnectedAsync( + public async Task OnDisconnectedAsync( HubLifetimeContext context, Exception exception, Func next) { - return next(context, exception); + await DisconnectLimiterSemaphore.WaitAsync(); + try + { + await next(context, exception); + } + catch + { + logger.LogWarning(exception, "Error on OnDisconnectedAsync"); + } + finally + { + DisconnectLimiterSemaphore.Release(); + } } }