Skip to content

Commit 4f774f6

Browse files
committed
feedback
1 parent 273fcf1 commit 4f774f6

File tree

2 files changed

+17
-32
lines changed

2 files changed

+17
-32
lines changed

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

Lines changed: 9 additions & 14 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;
@@ -188,16 +189,6 @@ public Task InitializeAsync(ProtectedPrerenderComponentApplicationStore store, A
188189
}));
189190
}
190191

191-
public bool SetDisconnected()
192-
{
193-
if (Client.Connected)
194-
{
195-
Client.SetDisconnected();
196-
return true;
197-
}
198-
return false;
199-
}
200-
201192
// We handle errors in DisposeAsync because there's no real value in letting it propagate.
202193
// We run user code here (CircuitHandlers) and it's reasonable to expect some might throw, however,
203194
// there isn't anything better to do than log when one of these exceptions happens - because the
@@ -219,10 +210,7 @@ await Renderer.Dispatcher.InvokeAsync(async () =>
219210

220211
try
221212
{
222-
if (this.Client.Connected)
223-
{
224-
await OnConnectionDownAsync(CancellationToken.None);
225-
}
213+
await OnConnectionDownAsync(CancellationToken.None);
226214
}
227215
catch
228216
{
@@ -292,6 +280,7 @@ private async Task OnCircuitOpenedAsync(CancellationToken cancellationToken)
292280

293281
public async Task OnConnectionUpAsync(CancellationToken cancellationToken)
294282
{
283+
_onConnectionDownFired = false;
295284
Log.ConnectionUp(_logger, CircuitId, Client.ConnectionId);
296285
_circuitMetrics?.OnConnectionUp();
297286

@@ -322,6 +311,12 @@ public async Task OnConnectionUpAsync(CancellationToken cancellationToken)
322311

323312
public async Task OnConnectionDownAsync(CancellationToken cancellationToken)
324313
{
314+
if(_onConnectionDownFired)
315+
{
316+
return;
317+
}
318+
319+
_onConnectionDownFired = true;
325320
Log.ConnectionDown(_logger, CircuitId, Client.ConnectionId);
326321
_circuitMetrics?.OnConnectionDown();
327322

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

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -135,12 +135,12 @@ protected virtual bool DisconnectCore(CircuitHost circuitHost, string connection
135135
var result = ConnectedCircuits.TryRemove(circuitId, out circuitHost);
136136
Debug.Assert(result, "This operation operates inside of a lock. We expect the previously inspected value to be still here.");
137137

138-
var previouslyConnected = circuitHost.SetDisconnected();
138+
circuitHost.Client.SetDisconnected();
139139
RegisterDisconnectedCircuit(circuitHost);
140140

141141
Log.CircuitMarkedDisconnected(_logger, circuitId);
142142

143-
return previouslyConnected;
143+
return true;
144144
}
145145

146146
public void RegisterDisconnectedCircuit(CircuitHost circuitHost)
@@ -309,13 +309,9 @@ private Task PauseAndDisposeCircuitEntry(DisconnectedCircuitEntry entry)
309309

310310
private async Task PauseAndDisposeCircuitHost(CircuitHost circuitHost, bool saveStateToClient)
311311
{
312-
if (circuitHost.SetDisconnected())
313-
{
314-
await circuitHost.Renderer.Dispatcher.InvokeAsync(() => circuitHost.OnConnectionDownAsync(default));
315-
}
316-
317312
await _circuitPersistenceManager.PauseCircuitAsync(circuitHost, saveStateToClient);
318313
circuitHost.UnhandledException -= CircuitHost_UnhandledException;
314+
circuitHost.Client.SetDisconnected();
319315
await circuitHost.DisposeAsync();
320316
}
321317

@@ -381,12 +377,10 @@ private void DisposeTokenSource(DisconnectedCircuitEntry entry)
381377
}
382378

383379
// We don't expect this to throw. User code only runs inside DisposeAsync and that does its own error handling.
384-
public async ValueTask TerminateAsync(CircuitId circuitId)
380+
public ValueTask TerminateAsync(CircuitId circuitId)
385381
{
386382
CircuitHost circuitHost;
387383
DisconnectedCircuitEntry entry = default;
388-
var circuitHandlerTask = Task.CompletedTask;
389-
390384
lock (CircuitRegistryLock)
391385
{
392386
if (ConnectedCircuits.TryGetValue(circuitId, out circuitHost) || DisconnectedCircuits.TryGetValue(circuitId.Secret, out entry))
@@ -395,21 +389,17 @@ public async ValueTask TerminateAsync(CircuitId circuitId)
395389
DisconnectedCircuits.Remove(circuitId.Secret);
396390
ConnectedCircuits.TryRemove(circuitId, out _);
397391
Log.CircuitDisconnectedPermanently(_logger, circuitHost.CircuitId);
398-
399-
if (circuitHost.SetDisconnected())
400-
{
401-
circuitHandlerTask = circuitHost.Renderer.Dispatcher.InvokeAsync(() => circuitHost.OnConnectionDownAsync(default));
402-
}
392+
circuitHost.Client.SetDisconnected();
403393
}
404394
}
405395

406-
await circuitHandlerTask;
407-
408396
if (circuitHost != null)
409397
{
410398
circuitHost.UnhandledException -= CircuitHost_UnhandledException;
411-
await circuitHost.DisposeAsync();
399+
return circuitHost.DisposeAsync();
412400
}
401+
402+
return default;
413403
}
414404

415405
// We don't need to do anything with the exception here, logging and sending exceptions to the client

0 commit comments

Comments
 (0)