fix: route debug stream events through ClusterClient site→central path
ClusterClient Sender refs are temporary proxies — valid for immediate reply but not durable for future Tells. Events now flow as DebugStreamEvent through SiteCommunicationActor → ClusterClient → CentralCommunicationActor → bridge actor (same pattern as health reports). Also fix DebugStreamHub to use IHubContext for long-lived callbacks instead of transient hub instance.
This commit is contained in:
@@ -51,7 +51,8 @@ public class InstanceActor : ReceiveActor
|
||||
private FlattenedConfiguration? _configuration;
|
||||
|
||||
// WP-25: Debug view subscribers
|
||||
private readonly Dictionary<string, IActorRef> _debugSubscribers = new();
|
||||
private readonly HashSet<string> _debugSubscriberCorrelationIds = new();
|
||||
private ActorSelection? _siteCommActor;
|
||||
|
||||
// DCL manager actor reference for subscribing to tag values
|
||||
private readonly IActorRef? _dclManager;
|
||||
@@ -149,6 +150,9 @@ public class InstanceActor : ReceiveActor
|
||||
base.PreStart();
|
||||
_logger.LogInformation("InstanceActor started for {Instance}", _instanceUniqueName);
|
||||
|
||||
// Resolve SiteCommunicationActor for routing debug stream events back to central
|
||||
_siteCommActor = Context.ActorSelection("/user/site-communication");
|
||||
|
||||
// Asynchronously load static overrides from SQLite and pipe to self
|
||||
var self = Self;
|
||||
_storage.GetStaticOverridesAsync(_instanceUniqueName).ContinueWith(t =>
|
||||
@@ -367,10 +371,10 @@ public class InstanceActor : ReceiveActor
|
||||
// WP-23: Publish to site-wide stream
|
||||
_streamManager?.PublishAlarmStateChanged(changed);
|
||||
|
||||
// Forward to debug subscribers
|
||||
foreach (var sub in _debugSubscribers.Values)
|
||||
// Forward to debug subscribers via SiteCommunicationActor → ClusterClient → central
|
||||
foreach (var correlationId in _debugSubscriberCorrelationIds)
|
||||
{
|
||||
sub.Tell(changed);
|
||||
_siteCommActor?.Tell(new DebugStreamEvent(correlationId, changed));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -380,7 +384,7 @@ public class InstanceActor : ReceiveActor
|
||||
private void HandleSubscribeDebugView(SubscribeDebugViewRequest request)
|
||||
{
|
||||
var subscriptionId = request.CorrelationId;
|
||||
_debugSubscribers[subscriptionId] = Sender;
|
||||
_debugSubscriberCorrelationIds.Add(subscriptionId);
|
||||
|
||||
// Build snapshot from current state
|
||||
var now = DateTimeOffset.UtcNow;
|
||||
@@ -407,9 +411,6 @@ public class InstanceActor : ReceiveActor
|
||||
|
||||
Sender.Tell(snapshot);
|
||||
|
||||
// Also register with stream manager for filtered events
|
||||
_streamManager?.Subscribe(_instanceUniqueName, Sender);
|
||||
|
||||
_logger.LogDebug(
|
||||
"Debug view subscriber added for {Instance}, subscriptionId={Id}",
|
||||
_instanceUniqueName, subscriptionId);
|
||||
@@ -420,8 +421,7 @@ public class InstanceActor : ReceiveActor
|
||||
/// </summary>
|
||||
private void HandleUnsubscribeDebugView(UnsubscribeDebugViewRequest request)
|
||||
{
|
||||
_debugSubscribers.Remove(request.CorrelationId);
|
||||
_streamManager?.RemoveSubscriber(Sender);
|
||||
_debugSubscriberCorrelationIds.Remove(request.CorrelationId);
|
||||
|
||||
_logger.LogDebug(
|
||||
"Debug view subscriber removed for {Instance}, correlationId={Id}",
|
||||
@@ -479,10 +479,10 @@ public class InstanceActor : ReceiveActor
|
||||
alarmActor.Tell(changed);
|
||||
}
|
||||
|
||||
// Forward to debug subscribers
|
||||
foreach (var sub in _debugSubscribers.Values)
|
||||
// Forward to debug subscribers via SiteCommunicationActor → ClusterClient → central
|
||||
foreach (var correlationId in _debugSubscriberCorrelationIds)
|
||||
{
|
||||
sub.Tell(changed);
|
||||
_siteCommActor?.Tell(new DebugStreamEvent(correlationId, changed));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user