fix(modbus): dispose the previous transport and probe loops on re-initialize

This commit is contained in:
Joseph Doherty
2026-08-15 21:37:28 -04:00
parent dc459633e0
commit c3970a2e5d
2 changed files with 111 additions and 0 deletions
@@ -255,6 +255,30 @@ public sealed class ModbusDriver
WriteHealth(new DriverHealth(DriverState.Initializing, null, null));
try
{
// Release whatever a PREVIOUS initialize published before building the replacements. All
// three fields assigned below (_transport, _probeCts, _reprobeCts) were simply overwritten,
// so a second initialize on a live driver stranded a connected transport plus two running
// background loops that no later dispose could reach. Reachable without any teardown of
// ours: DriverInstanceActor re-runs InitializeAsync with no ShutdownAsync when an ApplyDelta
// lands while the driver is in Connecting/Reconnecting (AdoptConfigDuringInit).
// Deliberately NOT the shared TeardownAsync(): that also disposes _poll, the PollGroupEngine
// constructed once in the ctor and never rebuilt, which would leave the re-initialized
// driver unable to serve subscriptions. A first initialize sees three nulls, so this is a
// no-op on the initial call.
try { _probeCts?.Cancel(); } catch { }
_probeCts?.Dispose();
_probeCts = null;
try { _reprobeCts?.Cancel(); } catch { }
_reprobeCts?.Dispose();
_reprobeCts = null;
if (_transport is not null)
{
await _transport.DisposeAsync().ConfigureAwait(false);
_transport = null;
}
// #516: re-parse the supplied DriverConfig so a config change delivered through the IDriver
// contract is honoured. Without this the driver keeps serving the options it was CONSTRUCTED
// with, so an operator's edit is discarded while the deployment still seals green. An empty /