fix(dashboard): generation-tagged feed subscribers survive pump teardown races; drain-timeout observability
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace ZB.MOM.WW.MxGateway.Server.Dashboard.Components;
|
||||
|
||||
@@ -31,6 +32,10 @@ public abstract class DashboardPageBase : ComponentBase, IAsyncDisposable
|
||||
[Inject]
|
||||
protected IDashboardSnapshotFeed SnapshotFeed { get; set; } = null!;
|
||||
|
||||
/// <summary>Logger used to report a snapshot subscription that ended or would not drain.</summary>
|
||||
[Inject]
|
||||
protected ILogger<DashboardPageBase>? Logger { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The most recent gateway metric snapshot. Synchronously seeded from
|
||||
/// <see cref="IDashboardSnapshotService.GetSnapshot"/> for the very first
|
||||
@@ -62,9 +67,21 @@ public abstract class DashboardPageBase : ComponentBase, IAsyncDisposable
|
||||
await _watchTask.WaitAsync(WatchDrainTimeout).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
catch (TimeoutException)
|
||||
{
|
||||
// Accepted limitation: the abandoned loop still holds its feed subscription, so
|
||||
// the feed's idle gate stays open until it does unwind. There is no way to force
|
||||
// a detach — the loop is parked on a dispatcher that is not draining — so the
|
||||
// warning is the operator's only signal that a circuit teardown wedged.
|
||||
Logger?.LogWarning(
|
||||
"Dashboard page {Page} did not release its snapshot subscription within {Timeout}; "
|
||||
+ "the shared snapshot feed stays active until it unwinds.",
|
||||
GetType().Name,
|
||||
WatchDrainTimeout);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Disposal-time errors (including a drain timeout) are best-effort.
|
||||
// Other disposal-time errors are best-effort.
|
||||
}
|
||||
|
||||
_watchCancellation.Dispose();
|
||||
@@ -87,10 +104,15 @@ public abstract class DashboardPageBase : ComponentBase, IAsyncDisposable
|
||||
{
|
||||
// The page is going away.
|
||||
}
|
||||
catch
|
||||
catch (Exception error)
|
||||
{
|
||||
// The feed is best-effort: the last rendered snapshot stays on screen and
|
||||
// the snapshot service keeps serving GetSnapshot() for the next page load.
|
||||
// The feed is best-effort: the last rendered snapshot stays on screen and the
|
||||
// snapshot service keeps serving GetSnapshot() for the next page load. Logged
|
||||
// once here, on the way out of the loop — never per snapshot.
|
||||
Logger?.LogWarning(
|
||||
error,
|
||||
"Live snapshot updates ended for dashboard page {Page}; it keeps the last rendered snapshot.",
|
||||
GetType().Name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user