fix(dcl): route native alarm subscribe/unsubscribe through DataConnectionManagerActor
The NativeAlarmActor sends SubscribeAlarmsRequest to the DCL manager, but the manager only routed tag/write/browse messages to the per-connection DataConnectionActor — alarm subscribe/unsubscribe were unhandled and dead-lettered, so native alarms never subscribed at runtime. Caught by live T28 deployment. Mirrors the existing HandleRoute forwarding.
This commit is contained in:
@@ -43,6 +43,8 @@ public class DataConnectionManagerActor : ReceiveActor
|
|||||||
Receive<CreateConnectionCommand>(HandleCreateConnection);
|
Receive<CreateConnectionCommand>(HandleCreateConnection);
|
||||||
Receive<SubscribeTagsRequest>(HandleRoute);
|
Receive<SubscribeTagsRequest>(HandleRoute);
|
||||||
Receive<UnsubscribeTagsRequest>(HandleRoute);
|
Receive<UnsubscribeTagsRequest>(HandleRoute);
|
||||||
|
Receive<SubscribeAlarmsRequest>(HandleRouteAlarms);
|
||||||
|
Receive<UnsubscribeAlarmsRequest>(HandleRouteAlarms);
|
||||||
Receive<WriteTagRequest>(HandleRouteWrite);
|
Receive<WriteTagRequest>(HandleRouteWrite);
|
||||||
Receive<RemoveConnectionCommand>(HandleRemoveConnection);
|
Receive<RemoveConnectionCommand>(HandleRemoveConnection);
|
||||||
Receive<GetAllHealthReports>(HandleGetAllHealthReports);
|
Receive<GetAllHealthReports>(HandleGetAllHealthReports);
|
||||||
@@ -101,6 +103,31 @@ public class DataConnectionManagerActor : ReceiveActor
|
|||||||
_log.Warning("No connection actor for {0} during unsubscribe", request.ConnectionName);
|
_log.Warning("No connection actor for {0} during unsubscribe", request.ConnectionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Routes a native alarm subscribe to the <see cref="DataConnectionActor"/> that owns
|
||||||
|
/// the named connection (the NativeAlarmActor sends here, not to the child directly).
|
||||||
|
/// </summary>
|
||||||
|
private void HandleRouteAlarms(SubscribeAlarmsRequest request)
|
||||||
|
{
|
||||||
|
if (_connectionActors.TryGetValue(request.ConnectionName, out var actor))
|
||||||
|
actor.Forward(request);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_log.Warning("No connection actor for {0} during alarm subscribe", request.ConnectionName);
|
||||||
|
Sender.Tell(new SubscribeAlarmsResponse(
|
||||||
|
request.CorrelationId, request.InstanceUniqueName, false,
|
||||||
|
$"Unknown connection: {request.ConnectionName}", DateTimeOffset.UtcNow));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleRouteAlarms(UnsubscribeAlarmsRequest request)
|
||||||
|
{
|
||||||
|
if (_connectionActors.TryGetValue(request.ConnectionName, out var actor))
|
||||||
|
actor.Forward(request);
|
||||||
|
else
|
||||||
|
_log.Warning("No connection actor for {0} during alarm unsubscribe", request.ConnectionName);
|
||||||
|
}
|
||||||
|
|
||||||
private void HandleRouteWrite(WriteTagRequest request)
|
private void HandleRouteWrite(WriteTagRequest request)
|
||||||
{
|
{
|
||||||
if (_connectionActors.TryGetValue(request.ConnectionName, out var actor))
|
if (_connectionActors.TryGetValue(request.ConnectionName, out var actor))
|
||||||
|
|||||||
+17
@@ -58,6 +58,23 @@ public class DataConnectionManagerActorTests : TestKit
|
|||||||
Assert.Contains("Unknown connection", response.ErrorMessage);
|
Assert.Contains("Unknown connection", response.ErrorMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void SubscribeAlarmsToUnknownConnection_ReturnsError()
|
||||||
|
{
|
||||||
|
// Regression for the live integration gap: the NativeAlarmActor sends
|
||||||
|
// SubscribeAlarmsRequest to the DCL manager, which must route it to the
|
||||||
|
// named connection actor (or reply with an error) — not dead-letter it.
|
||||||
|
var manager = Sys.ActorOf(Props.Create(() =>
|
||||||
|
new DataConnectionManagerActor(_mockFactory, _options, _mockHealthCollector)));
|
||||||
|
|
||||||
|
manager.Tell(new SubscribeAlarmsRequest(
|
||||||
|
"corr1", "inst1", "nonexistent", "ns=2;s=Tank01", null, DateTimeOffset.UtcNow));
|
||||||
|
|
||||||
|
var response = ExpectMsg<SubscribeAlarmsResponse>();
|
||||||
|
Assert.False(response.Success);
|
||||||
|
Assert.Contains("Unknown connection", response.ErrorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task DCL002_ConnectionActorCrash_PreservesSubscriptionState()
|
public async Task DCL002_ConnectionActorCrash_PreservesSubscriptionState()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user