From 98f9db8a0fa2a3b2f325fafa8aa0a6d42a06c0b4 Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Sun, 9 Oct 2022 16:32:21 +0200 Subject: [PATCH] stop being dum --- .../Identity/IdentityHandler.cs | 39 ++++++++++++++++++- .../Identity/IdentityService.cs | 36 ++++------------- 2 files changed, 45 insertions(+), 30 deletions(-) diff --git a/MareSynchronosServer/MareSynchronosServices/Identity/IdentityHandler.cs b/MareSynchronosServer/MareSynchronosServices/Identity/IdentityHandler.cs index 782caf9..f3d6b35 100644 --- a/MareSynchronosServer/MareSynchronosServices/Identity/IdentityHandler.cs +++ b/MareSynchronosServer/MareSynchronosServices/Identity/IdentityHandler.cs @@ -1,4 +1,7 @@ -using System.Collections.Concurrent; +using MareSynchronosShared.Protos; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -8,6 +11,13 @@ namespace MareSynchronosServices.Identity; internal class IdentityHandler { private readonly ConcurrentDictionary cachedIdentities = new(); + private readonly ConcurrentDictionary> identChanges = new(); + private readonly ILogger _logger; + + public IdentityHandler(ILogger logger) + { + _logger = logger; + } internal Task GetUidForCharacterIdent(string ident, string serverId) { @@ -64,6 +74,33 @@ internal class IdentityHandler cachedIdentities.TryRemove(identity.Key, out _); } } + + internal void EnqueueIdentChange(IdentChange identchange) + { + _logger.LogInformation("Enqueued " + identchange.UidWithIdent.Uid.Uid + ":" + identchange.IsOnline + " from " + identchange.UidWithIdent.Ident.ServerId); + + foreach (var k in identChanges.Keys) + { + if (string.Equals(k, identchange.UidWithIdent.Ident.ServerId, System.StringComparison.Ordinal)) continue; + identChanges[k].Enqueue(identchange); + } + } + + internal bool DequeueIdentChange(string server, out IdentChange? cur) + { + if (!(identChanges.ContainsKey(server) && identChanges[server].TryDequeue(out cur))) + { + cur = null; + return false; + } + + return true; + } + + internal void RegisterServerForQueue(string serverId) + { + identChanges[serverId] = new ConcurrentQueue(); + } } internal record ServerIdentity diff --git a/MareSynchronosServer/MareSynchronosServices/Identity/IdentityService.cs b/MareSynchronosServer/MareSynchronosServices/Identity/IdentityService.cs index f1e4a15..ecc6136 100644 --- a/MareSynchronosServer/MareSynchronosServices/Identity/IdentityService.cs +++ b/MareSynchronosServer/MareSynchronosServices/Identity/IdentityService.cs @@ -1,9 +1,6 @@ using Grpc.Core; using MareSynchronosShared.Protos; using Microsoft.Extensions.Logging; -using System.Collections.Concurrent; -using System.Linq; -using System.Runtime.ConstrainedExecution; using System.Threading.Tasks; namespace MareSynchronosServices.Identity; @@ -12,7 +9,6 @@ internal class IdentityService : IdentificationService.IdentificationServiceBase { private readonly ILogger _logger; private readonly IdentityHandler _handler; - private readonly ConcurrentDictionary> identChanges = new(); public IdentityService(ILogger logger, IdentityHandler handler) { @@ -73,13 +69,14 @@ internal class IdentityService : IdentificationService.IdentificationServiceBase await requestStream.MoveNext(); var server = requestStream.Current.Server; if (server == null) throw new System.Exception("First message needs to be server message"); + _handler.RegisterServerForQueue(server.ServerId); _logger.LogInformation("Registered Server " + server.ServerId + " input stream"); - identChanges[server.ServerId] = new ConcurrentQueue(); + while (await requestStream.MoveNext().ConfigureAwait(false)) { var cur = requestStream.Current.IdentChange; if (cur == null) throw new System.Exception("Expected client ident change"); - EnqueueIdentChange(cur); + _handler.EnqueueIdentChange(cur); if (cur.IsOnline) { @@ -105,17 +102,9 @@ internal class IdentityService : IdentificationService.IdentificationServiceBase { while (!context.CancellationToken.IsCancellationRequested) { - if (identChanges.ContainsKey(server)) + while (_handler.DequeueIdentChange(server, out var cur)) { - if (identChanges[server].TryDequeue(out var cur)) - { - _logger.LogInformation("Sending " + cur.UidWithIdent.Uid.Uid + " to " + server); - await responseStream.WriteAsync(cur).ConfigureAwait(false); - } - else - { - _logger.LogInformation("Nothing to send to " + server); - } + await responseStream.WriteAsync(cur).ConfigureAwait(false); } await Task.Delay(250).ConfigureAwait(false); @@ -151,20 +140,9 @@ internal class IdentityService : IdentificationService.IdentificationServiceBase return Task.FromResult(response); } - private void EnqueueIdentChange(IdentChange identchange) - { - _logger.LogInformation("Enqueued " + identchange.UidWithIdent.Uid.Uid + ":" + identchange.IsOnline + " from " + identchange.UidWithIdent.Ident.ServerId); - - foreach (var k in identChanges.Keys) - { - if (string.Equals(k, identchange.UidWithIdent.Ident.ServerId, System.StringComparison.Ordinal)) continue; - identChanges[k].Enqueue(identchange); - } - } - private void EnqueueIdentOnline(UidWithIdent ident) { - EnqueueIdentChange(new IdentChange() + _handler.EnqueueIdentChange(new IdentChange() { IsOnline = true, UidWithIdent = ident @@ -173,7 +151,7 @@ internal class IdentityService : IdentificationService.IdentificationServiceBase private void EnqueueIdentOffline(UidWithIdent ident) { - EnqueueIdentChange(new IdentChange() + _handler.EnqueueIdentChange(new IdentChange() { IsOnline = false, UidWithIdent = ident