diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Runtime/Drivers/ActorNodeWriteGateway.cs b/src/Server/ZB.MOM.WW.OtOpcUa.Runtime/Drivers/ActorNodeWriteGateway.cs index 7bba6cc0..ccb91771 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Runtime/Drivers/ActorNodeWriteGateway.cs +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Runtime/Drivers/ActorNodeWriteGateway.cs @@ -60,10 +60,20 @@ public sealed class ActorNodeWriteGateway : IOpcUaNodeWriteGateway _logger.LogWarning("Operator write to {NodeId} rejected: {Reason}", nodeId, result.Reason); return new NodeWriteOutcome(result.Success, result.Reason); } - catch (Exception ex) // AskTimeoutException, actor faults, cancellation + catch (OperationCanceledException ex) { - _logger.LogWarning(ex, "Operator write to {NodeId} failed or timed out", nodeId); + _logger.LogWarning(ex, "Operator write to {NodeId} cancelled", nodeId); + return new NodeWriteOutcome(false, "write cancelled"); + } + catch (AskTimeoutException ex) + { + _logger.LogWarning(ex, "Operator write to {NodeId} timed out", nodeId); return new NodeWriteOutcome(false, "write timeout"); } + catch (Exception ex) + { + _logger.LogError(ex, "Operator write to {NodeId} failed unexpectedly", nodeId); + return new NodeWriteOutcome(false, "write error"); + } } } diff --git a/tests/Server/ZB.MOM.WW.OtOpcUa.Runtime.Tests/Drivers/ActorNodeWriteGatewayTests.cs b/tests/Server/ZB.MOM.WW.OtOpcUa.Runtime.Tests/Drivers/ActorNodeWriteGatewayTests.cs index 5d6acf33..d70484bc 100644 --- a/tests/Server/ZB.MOM.WW.OtOpcUa.Runtime.Tests/Drivers/ActorNodeWriteGatewayTests.cs +++ b/tests/Server/ZB.MOM.WW.OtOpcUa.Runtime.Tests/Drivers/ActorNodeWriteGatewayTests.cs @@ -75,15 +75,11 @@ public sealed class ActorNodeWriteGatewayTests : RuntimeActorTestBase [Fact] public async Task No_actor_registered_maps_to_writes_unavailable() { - var probe = CreateTestProbe(); var gateway = new ActorNodeWriteGateway(resolveDriverHost: () => null, NullLogger.Instance); var outcome = await gateway.WriteAsync("eq-1/speed", 123.0, CancellationToken.None); outcome.Success.ShouldBeFalse(); outcome.Reason.ShouldBe("writes unavailable"); - - // The resolver returned null, so nothing should have been messaged anywhere. - probe.ExpectNoMsg(TimeSpan.FromMilliseconds(200)); } }