From 753c3da852028df97087c7e30ec40dc87892530b Mon Sep 17 00:00:00 2001 From: BrennanConroy Date: Tue, 4 Sep 2018 13:57:19 -0700 Subject: [PATCH] Avoid ODE in tests with Server logging (#2742) (#2907) --- .../ServerLogScope.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerLogScope.cs b/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerLogScope.cs index 8ca3281e98e9..07568be84ba4 100644 --- a/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerLogScope.cs +++ b/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerLogScope.cs @@ -15,6 +15,7 @@ public class ServerLogScope : IDisposable private readonly ConcurrentDictionary _serverLoggers; private readonly ILogger _scopeLogger; private readonly object _lock; + private bool _disposed; public ServerLogScope(ServerFixture serverFixture, ILoggerFactory loggerFactory, IDisposable wrappedDisposable) { @@ -45,11 +46,15 @@ private void ServerFixtureOnServerLogged(LogRecord logRecord) ILogger logger; - // There maybe thready safety issues in logging when creating multiple loggers at the same time - // https://github.com/aspnet/Logging/issues/810 lock (_lock) { + if (_disposed) + { + return; + } + // Create (or get) a logger with the same name as the server logger + // Call in the lock to avoid ODE where LoggerFactory could be disposed by the wrapped disposable logger = _serverLoggers.GetOrAdd(write.LoggerName, loggerName => _loggerFactory.CreateLogger(loggerName)); } @@ -62,7 +67,11 @@ public void Dispose() _scopeLogger.LogInformation("Server log scope stopped."); - _wrappedDisposable?.Dispose(); + lock (_lock) + { + _wrappedDisposable?.Dispose(); + _disposed = true; + } } } } \ No newline at end of file