using Microsoft.Extensions.Logging; using ZB.MOM.WW.OtOpcUa.Core.Abstractions; namespace ZB.MOM.WW.OtOpcUa.Core.Stability; /// /// Tier C only process-recycle companion to . On a /// signal, invokes the supplied /// to restart the out-of-process Host. /// /// /// Per docs/v2/plan.md decisions #74 and #145. Tier A/B hard-breach on an in-process /// driver would kill every OPC UA session and every co-hosted driver, so for Tier A/B this /// class logs a promotion-to-Tier-C recommendation and does NOT invoke any supervisor. /// A future tier-migration workflow acts on the recommendation. /// public sealed class MemoryRecycle { private readonly DriverTier _tier; private readonly IDriverSupervisor? _supervisor; private readonly ILogger _logger; public MemoryRecycle(DriverTier tier, IDriverSupervisor? supervisor, ILogger logger) { _tier = tier; _supervisor = supervisor; _logger = logger; } /// /// Handle a classification for the driver. For Tier C with a /// wired supervisor, HardBreach triggers . /// All other combinations are no-ops with respect to process state (soft breaches + Tier A/B /// hard breaches just log). /// /// True when a recycle was requested; false otherwise. public async Task HandleAsync(MemoryTrackingAction action, long footprintBytes, CancellationToken cancellationToken) { switch (action) { case MemoryTrackingAction.SoftBreach: _logger.LogWarning( "Memory soft-breach on driver {DriverId}: footprint={Footprint:N0} bytes, tier={Tier}. Surfaced to Admin; no action.", _supervisor?.DriverInstanceId ?? "(unknown)", footprintBytes, _tier); return false; case MemoryTrackingAction.HardBreach when _tier == DriverTier.C && _supervisor is not null: _logger.LogError( "Memory hard-breach on Tier C driver {DriverId}: footprint={Footprint:N0} bytes. Requesting supervisor recycle.", _supervisor.DriverInstanceId, footprintBytes); await _supervisor.RecycleAsync($"Memory hard-breach: {footprintBytes} bytes", cancellationToken).ConfigureAwait(false); return true; case MemoryTrackingAction.HardBreach: _logger.LogError( "Memory hard-breach on Tier {Tier} in-process driver {DriverId}: footprint={Footprint:N0} bytes. " + "Recommending promotion to Tier C; NOT auto-killing (decisions #74, #145).", _tier, _supervisor?.DriverInstanceId ?? "(unknown)", footprintBytes); return false; default: return false; } } }