Skip to content

Commit 366296c

Browse files
authored
[blazor] fix multiple calls to OnConnectionDownAsync (#62518)
1 parent 1efded6 commit 366296c

File tree

4 files changed

+13
-10
lines changed

4 files changed

+13
-10
lines changed

src/Components/Server/src/Circuits/CircuitHost.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ internal partial class CircuitHost : IAsyncDisposable
3030
private CircuitHandler[] _circuitHandlers;
3131
private bool _initialized;
3232
private bool _isFirstUpdate = true;
33+
private bool _onConnectionDownFired;
3334
private bool _disposed;
3435
private long _startTime;
3536
private PersistedCircuitState _persistedCircuitState;
@@ -279,6 +280,7 @@ private async Task OnCircuitOpenedAsync(CancellationToken cancellationToken)
279280

280281
public async Task OnConnectionUpAsync(CancellationToken cancellationToken)
281282
{
283+
_onConnectionDownFired = false;
282284
Log.ConnectionUp(_logger, CircuitId, Client.ConnectionId);
283285
_circuitMetrics?.OnConnectionUp();
284286

@@ -309,6 +311,12 @@ public async Task OnConnectionUpAsync(CancellationToken cancellationToken)
309311

310312
public async Task OnConnectionDownAsync(CancellationToken cancellationToken)
311313
{
314+
if(_onConnectionDownFired)
315+
{
316+
return;
317+
}
318+
319+
_onConnectionDownFired = true;
312320
Log.ConnectionDown(_logger, CircuitId, Client.ConnectionId);
313321
_circuitMetrics?.OnConnectionDown();
314322

src/Components/Server/src/Circuits/CircuitMetrics.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,6 @@ public void OnCircuitDown(long startTimestamp, long currentTimestamp)
7070
_circuitActiveCounter.Add(-1);
7171
}
7272

73-
if (_circuitConnectedCounter.Enabled)
74-
{
75-
_circuitConnectedCounter.Add(-1);
76-
}
77-
7873
if (_circuitDuration.Enabled)
7974
{
8075
var duration = Stopwatch.GetElapsedTime(startTimestamp, currentTimestamp);

src/Components/Server/src/Circuits/CircuitRegistry.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ private async Task PauseAndDisposeCircuitHost(CircuitHost circuitHost, bool save
311311
{
312312
await _circuitPersistenceManager.PauseCircuitAsync(circuitHost, saveStateToClient);
313313
circuitHost.UnhandledException -= CircuitHost_UnhandledException;
314+
circuitHost.Client.SetDisconnected();
314315
await circuitHost.DisposeAsync();
315316
}
316317

src/Components/Server/test/Circuits/CircuitMetricsTest.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,11 @@ public async Task OnCircuitDown_UpdatesCountersAndRecordsDuration()
108108

109109
// Assert
110110
var activeMeasurements = activeCircuitCounter.GetMeasurementSnapshot();
111-
var connectedMeasurements = connectedCircuitCounter.GetMeasurementSnapshot();
112111
var durationMeasurements = circuitDurationCollector.GetMeasurementSnapshot();
113112

114113
Assert.Single(activeMeasurements);
115114
Assert.Equal(-1, activeMeasurements[0].Value);
116115

117-
Assert.Single(connectedMeasurements);
118-
Assert.Equal(-1, connectedMeasurements[0].Value);
119-
120116
Assert.Single(durationMeasurements);
121117
Assert.True(durationMeasurements[0].Value > 0);
122118
}
@@ -162,7 +158,10 @@ public void FullCircuitLifecycle_RecordsAllMetricsCorrectly()
162158
// 4. Connection re-established
163159
circuitMetrics.OnConnectionUp();
164160

165-
// 5. Circuit closes
161+
// 5. Connection drops
162+
circuitMetrics.OnConnectionDown();
163+
164+
// 6. Circuit closes
166165
Thread.Sleep(10); // Add a small delay to ensure a measurable duration
167166
var endTime = Stopwatch.GetTimestamp();
168167
circuitMetrics.OnCircuitDown(startTime, endTime);

0 commit comments

Comments
 (0)