Skip to content

Commit 1a24b04

Browse files
authored
Fix Heartbeat logging after disposal (#47580)
1 parent a419b22 commit 1a24b04

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

src/Servers/Kestrel/Core/src/Internal/Infrastructure/Heartbeat.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,20 @@ internal void OnHeartbeat()
6262
}
6363
catch (Exception ex)
6464
{
65-
_trace.LogError(0, ex, $"{nameof(Heartbeat)}.{nameof(OnHeartbeat)}");
65+
if (!_stopped)
66+
{
67+
_trace.LogError(0, ex, $"{nameof(Heartbeat)}.{nameof(OnHeartbeat)}");
68+
}
6669
}
6770
}
6871

6972
private void TimerLoop()
7073
{
74+
Thread.Sleep(_interval);
7175
while (!_stopped)
7276
{
73-
Thread.Sleep(_interval);
74-
7577
OnHeartbeat();
78+
Thread.Sleep(_interval);
7679
}
7780
}
7881

src/Servers/Kestrel/Core/test/HeartbeatTests.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,4 +123,20 @@ public void ExceptionFromHeartbeatHandlerIsLoggedAsError()
123123

124124
Assert.Equal(ex, TestSink.Writes.Single(message => message.LogLevel == LogLevel.Error).Exception);
125125
}
126+
127+
[Fact]
128+
public void ExceptionFromHeartbeatHandlerIsNotLoggedIfDisposed()
129+
{
130+
var systemClock = new MockSystemClock();
131+
var heartbeatHandler = new Mock<IHeartbeatHandler>();
132+
var debugger = new Mock<IDebugger>();
133+
var kestrelTrace = new KestrelTrace(LoggerFactory);
134+
var ex = new Exception();
135+
heartbeatHandler.Setup(h => h.OnHeartbeat(systemClock.UtcNow)).Throws(ex);
136+
debugger.Setup(d => d.IsAttached).Returns(true);
137+
var heartbeat = new Heartbeat(new[] { heartbeatHandler.Object }, systemClock, debugger.Object, kestrelTrace);
138+
heartbeat.Dispose();
139+
heartbeat.OnHeartbeat();
140+
Assert.Empty(TestSink.Writes);
141+
}
126142
}

0 commit comments

Comments
 (0)