feat(controlplane): RedundancyStateActor broadcast override + un-skip tests (F6)

Mirrors the publisher-injection pattern from FleetStatusBroadcaster and
PeerOpcUaProbeActor: Props accepts an optional Action<object> override so
tests can use a TestProbe sink instead of bootstrapping DistributedPubSub
(unreliable single-node in TestKit).

Un-skips the two RedundancyStateActor tests deferred under F6.
This commit is contained in:
Joseph Doherty
2026-05-26 06:16:32 -04:00
parent 463512d1d8
commit dfc143cdeb
2 changed files with 22 additions and 21 deletions

View File

@@ -24,15 +24,20 @@ public sealed class RedundancyStateActor : ReceiveActor, IWithTimers
private readonly ILoggingAdapter _log = Context.GetLogger();
private readonly Akka.Cluster.Cluster _cluster;
private readonly Action<object>? _broadcastOverride;
private bool _dirty;
public ITimerScheduler Timers { get; set; } = null!;
public static Props Props() => Akka.Actor.Props.Create(() => new RedundancyStateActor());
public static Props Props(Action<object>? broadcast = null) =>
Akka.Actor.Props.Create(() => new RedundancyStateActor(broadcast));
public RedundancyStateActor()
public RedundancyStateActor() : this(broadcast: null) { }
public RedundancyStateActor(Action<object>? broadcast)
{
_cluster = Akka.Cluster.Cluster.Get(Context.System);
_broadcastOverride = broadcast;
Receive<ClusterEvent.IMemberEvent>(_ => MarkDirty());
Receive<ClusterEvent.LeaderChanged>(_ => MarkDirty());
@@ -68,7 +73,8 @@ public sealed class RedundancyStateActor : ReceiveActor, IWithTimers
var snapshot = BuildSnapshot();
var msg = new RedundancyStateChanged(snapshot, CorrelationId.NewId());
DistributedPubSub.Get(Context.System).Mediator.Tell(new Publish(Topic, msg));
if (_broadcastOverride is not null) _broadcastOverride(msg);
else DistributedPubSub.Get(Context.System).Mediator.Tell(new Publish(Topic, msg));
_log.Debug("Published RedundancyStateChanged with {Count} nodes", snapshot.Count);
}