Skip to content

v1.2.0-RC3

Pre-release
Pre-release

Choose a tag to compare

@kevinherron kevinherron released this 10 Nov 18:32

This is the third release candidate for Milo 1.2.0.

The 1.2.0 feature and migration guide describes the new features and the changes that may require code changes in your application. 1.2.0 includes source and binary compatibility breaks, so recompile applications and extensions against one consistent Milo version.

Changes since RC2

DiagnosticInfo support

  • Servers and clients now work with DiagnosticInfo as resolved Diagnostic values instead of string-table indexes. A server returns operation and ServiceFault diagnostics only when a request's returnDiagnostics mask asks for them, and UaException carries a Diagnostic on both sides.
  • A client asks for diagnostics with OpcUaClientConfigBuilder.setReturnDiagnostics(...). The default is ReturnDiagnostics.NONE, so existing clients send the same requests as before.
  • AbstractMethodInvocationHandler.invokeResult now returns a MethodResult, which can carry a Diagnostic that explains its status.
  • Code changes may be required:
    • InvalidArgumentException takes resolved diagnostics through a builder. Its (StatusCode[], DiagnosticInfo[]) constructor and getInputArgumentDiagnosticInfos() are removed.
    • UaMethodException.getInputArgumentDiagnostics() returns List<@Nullable Diagnostic>.
    • DiagnosticsContext and the RC-only Call string-table API (InvocationContext.getCallDiagnostics()) are removed.

Server access checks and operation limits

  • AddNodes, HistoryRead, and HistoryUpdate now ask the AccessController before the AddressSpace, and TranslateBrowsePathsToNodeIds returns only Nodes the Session may browse. An application AccessController must implement the new checkAddNodesAccess, checkHistoryReadAccess, and checkHistoryUpdateAccess methods. Returning AccessResult.ALLOWED for every item keeps the previous behavior.
  • The monitored item services enforce MaxMonitoredItemsPerCall, and HistoryRead and HistoryUpdate enforce the history operation limits they publish (250 by default) instead of the Read and Write limits. Requests over a limit fail with Bad_TooManyOperations. The Milo client already splits its requests by the server's limits.
  • Each session queues at most OpcUaServerConfigLimits.getMaxPublishRequestsPerSession() Publish requests (100 by default, and always at least one more than the session's Subscriptions). The server answers the oldest waiting request with Bad_TooManyPublishRequests when the queue is full.

Other fixes

  • The binary decoder checks array, ByteString, and String lengths against the bytes left in the message before it allocates storage (#2155).
  • XML fragment parsing disables DTDs and external entities.
  • MonitoredItem queues allocate storage as values arrive, and ModifyMonitoredItems no longer replaces a queue whose revised size is unchanged.
  • LifecycleManager.shutdown() finishes cleaning up the remaining children when one of them fails.
  • The client discards a subscription watchdog notification that was queued before its subscription was reset or recreated.
  • The server stops session timeout work after the session closes, so normal closure no longer increments SessionTimeoutCount.
  • NodeIds0-NodeIds5 and StatusCodes0 are public again, so Scala code can import them directly (discussion #2165).
  • Guava is updated to 33.8.0 and Netty to 4.1.140.Final.

What's Changed

Full Changelog: v1.2.0-RC2...v1.2.0-RC3