refactor(runtime): delete the dead in-place ApplyDelta seam; config change = respawn only (#665)
Since #516 a DriverConfig change is stop + respawn, so DriverSpawnPlan.ToApplyDelta was always empty and the in-place path had no producer. #663 and #664 were both latent bugs in it. This deletes it: - host: ApplyChildDelta, _pendingDelta, HandleApplyResult and HandleDeltaApplied - plan: DriverSpawnPlan.ToApplyDelta - actor: the ApplyDelta, ApplyResult and DeltaApplied messages, the Connected reinit handler and the mid-connect AdoptConfigDuringInit - tests: the actor tests that drove the seam IDriver.ReinitializeAsync and each driver's implementation and unit tests stay. Comments and docs that cited AdoptConfigDuringInit as the reason a driver must release prior state at init now cite the IDriver contract and overlapping retries, which still apply. Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
This commit is contained in:
@@ -225,9 +225,8 @@ public sealed class ModbusLifecycleHygieneTests
|
||||
// -------------------- Re-initialize transport hygiene --------------------
|
||||
|
||||
/// <summary>
|
||||
/// A second <c>InitializeAsync</c> on a live driver — the shape
|
||||
/// <c>DriverInstanceActor.AdoptConfigDuringInit</c> produces when an ApplyDelta lands while the
|
||||
/// driver is Connecting/Reconnecting — must dispose the transport the previous initialize
|
||||
/// A second <c>InitializeAsync</c> on a live driver with no teardown between (the <c>IDriver</c>
|
||||
/// contract allows it) must dispose the transport the previous initialize
|
||||
/// published before publishing a new one. Pre-fix <c>_transport</c> was simply overwritten,
|
||||
/// stranding a connected transport no later dispose could reach.
|
||||
/// </summary>
|
||||
@@ -251,7 +250,7 @@ public sealed class ModbusLifecycleHygieneTests
|
||||
});
|
||||
|
||||
await drv.InitializeAsync("{}", CancellationToken.None);
|
||||
// No ShutdownAsync in between — exactly what AdoptConfigDuringInit does.
|
||||
// No ShutdownAsync in between.
|
||||
await drv.InitializeAsync("{}", CancellationToken.None);
|
||||
|
||||
handed.Count.ShouldBe(2, "each initialize must build its own transport");
|
||||
@@ -415,8 +414,8 @@ public sealed class ModbusLifecycleHygieneTests
|
||||
|
||||
/// <summary>
|
||||
/// Two initializes racing on the same driver — the shape <c>DriverInstanceActor</c> produces by
|
||||
/// dispatching initialize on a fire-and-forget <c>Task.Run</c> with <c>AdoptConfigDuringInit</c>
|
||||
/// firing twice — must serialize on the lifecycle gate. Ungated, the teardown at the top of one
|
||||
/// dispatching initialize on a fire-and-forget <c>Task.Run</c>, where a reconnect retry tick can
|
||||
/// overlap a still-running attempt — must serialize on the lifecycle gate. Ungated, the teardown at the top of one
|
||||
/// initialize disposes the transport the other just published (or nulls <c>_transport</c>
|
||||
/// mid-connect), leaving the driver holding a disposed transport.
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user