Set ContinuationPoint (when browse is finished) to null instead of empty array, align with existing 1.5.xxx behavior - #4057
Conversation
Flip the 'managedPool' parameter default from false to true so Windows/Linux jobs route to the netstandard Managed DevOps Pool via ImageOverride demands. Operators can still override to Microsoft-hosted agents per queue via the pipeline UI.
Verify default registration keeps classic and async factory paths separate and the Reference Server helper flags remain reusable. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add the current ISA95 JobControl NodeSet2 input as a focused source-generator regression without changing generator or codec behavior. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace the incomplete resource with the unmodified official ISA95 JobControl 2.0.0 NodeSet and assert its model, node coverage, and local references. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Verify cancellation preserves the caller token and stops the connect attempt started by ManagedSession.CreateAsync. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Keep the caller-visible cancellation and primary disposal path covered while excluding only the defensive secondary disposal-failure classifier. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…upstream-parity-session-cleanup # Conflicts: # Libraries/Opc.Ua.Client/Session/ManagedSession.cs # Tests/Opc.Ua.Server.Tests/QuickstartsServerUtilitiesTests.cs
…enable-managed-pool
…upstream-parity-session-cleanup # Conflicts: # tests/Opc.Ua.SourceGeneration.Core.Tests/Resources/Isa95JobControl.NodeSet2.xml
…ation#3998) ## Summary - Adds the official ISA95 JobControl 2.0.0 NodeSet2 as a complete source-generator regression fixture. - Extends the lightweight generated-stack test stub with `NamespaceMetadataState`, required by the complete model. - Adds a deterministic ManagedSession cancellation regression proving that a started connect attempt is stopped. The ManagedSession cleanup implementation and Quickstarts utility coverage now come from `master`; this PR retains the additional deterministic cleanup regression. ## ISA95 fixture provenance and integrity The fixture is byte-for-byte the official file: - Source: `OPCFoundation/UA-Nodeset@e0b5d80cfff698f0276393e28df138a7fbc4b541` - Path: `ISA95-JOBCONTROL/opc.ua.isa95-jobcontrol.nodeset2.xml` - Git blob: `82f008cd126ade54e5f2c737bcc116621a8c3087` - SHA-256: `52327e736beb604c7253a5a5393d1ad525b9ecf35b71fbacb4f429cacb334064` The fixture test retains the OPC Foundation MIT header and verifies the 2.0.0 model/date, 258 nodes (including 134 variables), representative late variables, and that every `ns=1` reference target resolves locally. ## Validation - ManagedSession tests: 17 passing on net10.0; 15 passing and 2 framework-gated skips on net48. - Quickstarts server utility tests: 3 passing on net10.0 and net48. - ISA95 generator and fixture integrity regression: 5 passing on net10.0.
Replace the all-or-nothing `managedPool` boolean with a `poolMode` enum (mixed | managed | hosted) and route stages across two pool profiles so the netstandard Managed DevOps Pool and the Microsoft-hosted agents share the workload of a single run. - mixed (default): each stage uses its assigned profile, so both pools run in parallel. The two always-concurrent PR stages are split across pools: build -> hosted (bigger temp disk for multi-TFM bin trees), testfastpr -> managed (fast, image-pinned gate). Full-run stages are balanced ~5/5. - managed / hosted: global overrides that collapse both profiles onto a single pool (all-managed or all-hosted) for emergencies. The pool switch lives only in the variables block (mgd*/host* profiles), so stages carry no per-stage conditionals. macOS is unchanged (always hosted; the managed pool has no macOS images).
# Description Flip the `managedPool` parameter default in `azure-pipelines.yml` from `false` to `true` so Windows/Linux jobs route to the `netstandard` Managed DevOps Pool via `ImageOverride` demands. macOS jobs continue to run on Microsoft-hosted agents because Managed DevOps Pools does not provide macOS images. Operators can still uncheck the parameter at queue time to fall back to Microsoft-hosted agents. ## Related issues Follow-up to OPCFoundation#3881. ## Checklist - [x] I have signed the [CLA](https://opcfoundation.org/license/cla/ContributorLicenseAgreementv1.0.pdf) and read the [CONTRIBUTING](https://github.com/OPCFoundation/UA-.NETStandard/blob/master/CONTRIBUTING.md) doc. - [x] I have added tests that prove my fix is effective or that my feature works and increased code coverage. _(N/A — pipeline default only.)_ - [x] I have added all necessary documentation. - [x] I have verified that my changes do not introduce (new) build or analyzer warnings. _(N/A — no source change.)_ - [ ] I ran **all** tests locally using the **UA.slnx** solution against at least .net **framework** and .net **10**, and all passed. - [ ] I fixed **all** failing and flaky tests in the CI pipelines and **all** CodeQL warnings. - [ ] I have addressed **all** PR feedback received.
# Description Fail reverse-connect listener startup immediately instead of logging bind failures and surfacing a later connection timeout. - Validate and stage configured and programmatic listener endpoints before replacing active configuration. - Open all listeners atomically and report endpoint-specific failures with `BadTcpEndpointUrlInvalid`, the transport-specific status, or `BadNoCommunication`. - Roll back listeners opened by a failed attempt without reacquiring the manager lock, including forced listener disposal when normal close fails. - Preserve meaningful `ServiceResultException` status codes through both `StartService` overloads. - Dispose replaced configuration watchers and reject callbacks from stale watcher generations. - Keep the intended shared-listener behavior: one long-lived `ReverseConnectManager` can accept connections from multiple Servers on the same Client URL. - Expand `Docs/ReverseConnect.md` with listener lifetime, shared-manager usage, diagnostics, and specification references. ## Validation - `ReverseConnectManagerTests`: net10.0 and net48. - `ReverseConnectHostTests`: net10.0 and net48. - Ordered reverse-connect listener reuse integration tests: net10.0. ## Related Issues - Relates to OPCFoundation#3985. ## Checklist - [ ] I have signed the [CLA](https://opcfoundation.org/license/cla/ContributorLicenseAgreementv1.0.pdf) and read the [CONTRIBUTING](https://github.com/OPCFoundation/UA-.NETStandard/blob/master/CONTRIBUTING.md) doc. - [x] I have added tests that prove my fix is effective or that my feature works and increased code coverage. - [x] I have added all necessary documentation. - [x] I have verified that my changes do not introduce (new) build or analyzer warnings. - [ ] I ran **all** tests locally using the **UA.slnx** solution against at least .net **framework** and .net **10**, and all passed. - [ ] I fixed **all** failing and flaky tests in the CI pipelines and **all** CodeQL warnings. - [ ] I have addressed **all** PR feedback received.
There was a problem hiding this comment.
Pull request overview
Note
Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.
Standardizes BrowseResult.ContinuationPoint semantics so “no continuation point” is represented as null/default instead of an “empty” value, and aligns tests with the updated contract.
Changes:
- Initialize
BrowseResult.ContinuationPointtodefaultinMasterNodeManagerfor both good and error results. - Update test assertions to use
ContinuationPoint.IsNullinstead ofIsEmpty. - Add deterministic test coverage for null continuation points in completed/error browse flows.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
src/Opc.Ua.Server/NodeManager/MasterNodeManager.cs |
Explicitly sets ContinuationPoint = default when creating BrowseResult instances. |
tests/Opc.Ua.Server.Tests/NodeManager/MasterNodeManagerDeterministicTests.cs |
Adds/updates assertions and adds a new test validating null continuation points. |
tests/Opc.Ua.InformationModel.Tests/BrowseTests.cs |
Updates continuation point assertion to IsNull. |
tests/Opc.Ua.InformationModel.Tests/BrowseContinuationPointTests.cs |
Updates multiple assertions to IsNull for “no continuation point” cases. |
null instead of empty array, align with existing 1.5.xxx behavior
Codecov Report❌ Patch coverage is
❌ Your patch check has failed because the patch coverage (66.66%) is below the target coverage (80.00%). You can increase the patch coverage or adjust the target coverage. Additional details and impacted files@@ Coverage Diff @@
## master #4057 +/- ##
==========================================
- Coverage 73.86% 73.56% -0.31%
==========================================
Files 1345 1345
Lines 180038 180093 +55
Branches 31678 31683 +5
==========================================
- Hits 132993 132484 -509
- Misses 36290 36900 +610
+ Partials 10755 10709 -46
🚀 New features to boost your workflow:
|
Port of the test coverage from #4057, adapted to the master378 server test API (BrowseResultCollection, byte[] continuation point). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…#4266) Ports the ContinuationPoint fix from master commit a568a7e (PR #4057) back to master378. ## What changed `MasterNodeManager.Browse`/`BrowseNext` now explicitly set `BrowseResult.ContinuationPoint = default` (i.e. null) when no continuation point is present, instead of leaving it as an empty array. This aligns server behavior with the existing 1.5.xxx contract. Three call sites in `Libraries/Opc.Ua.Server/NodeManager/MasterNodeManager.cs` were updated: - initial browse result - bad validation result in BrowseNext - good result in BrowseNext ## Tests Added `Tests/Opc.Ua.Server.Tests/MasterNodeManagerBrowseTests.cs`, porting the relevant test coverage from #4057 and adapting it to the master378 server test API (`BrowseResultCollection`, `byte[]` continuation point, `OperationContext` ctor): - `BrowseAsyncCompletedBrowseReturnsNullContinuationPointAsync` — a completed browse returns Good and a null continuation point. - `BrowseAsyncUnknownNodeReturnsNullContinuationPointAsync` — an unknown node returns `BadNodeIdUnknown` and a null continuation point. ## Not ported The original commit also touched files that do not exist on master378: - `samples/PumpDeviceIntegrationServer/Dockerfile` (unrelated diagnostics-socket change; sample not present) - The v2.0-era test files (`BrowseContinuationPointTests.cs`, `BrowseTests.cs`, `MasterNodeManagerDeterministicTests.cs`) that were added in the v2.0 refactor and don't exist on master378. ## Validation - `dotnet build Libraries/Opc.Ua.Server` (net8.0, Release): succeeded, 0 warnings. - `dotnet test Tests/Opc.Ua.Server.Tests --filter MasterNodeManagerBrowseTests` (net8.0): 2 passed. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…5.378.176 (#45) This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [OPCFoundation.NetStandard.Opc.Ua](https://github.com/OPCFoundation/UA-.NETStandard) | `1.5.378.156` → `1.5.378.176` |  |  | --- ### Release Notes <details> <summary>OPCFoundation/UA-.NETStandard (OPCFoundation.NetStandard.Opc.Ua)</summary> ### [`v1.5.378.176`](https://github.com/OPCFoundation/UA-.NETStandard/releases/tag/1.5.378.176): OPC UA 1.05 Maintenance Update [Compare Source](OPCFoundation/UA-.NETStandard@1.5.378.156...1.5.378.176) Maintenance Release for fixing bugs found on the main378 development branch. #### Released packages [OPCFoundation.NetStandard.Opc.Ua](https://www.nuget.org/packages/OPCFoundation.NetStandard.Opc.Ua/1.5.378.176) [OPCFoundation.NetStandard.Opc.Ua.Core](https://www.nuget.org/packages/OPCFoundation.NetStandard.Opc.Ua.Core/1.5.378.176) [OPCFoundation.NetStandard.Opc.Ua.Security.Certificates](https://www.nuget.org/packages/OPCFoundation.NetStandard.Opc.Ua.Security.Certificates/1.5.378.176) [OPCFoundation.NetStandard.Opc.Ua.Configuration](https://www.nuget.org/packages/OPCFoundation.NetStandard.Opc.Ua.Configuration/1.5.378.176) [OPCFoundation.NetStandard.Opc.Ua.Server](https://www.nuget.org/packages/OPCFoundation.NetStandard.Opc.Ua.Server/1.5.378.176) [OPCFoundation.NetStandard.Opc.Ua.Client](https://www.nuget.org/packages/OPCFoundation.NetStandard.Opc.Ua.Client/1.5.378.176) [OPCFoundation.NetStandard.Opc.Ua.Client.ComplexTypes](https://www.nuget.org/packages/OPCFoundation.NetStandard.Opc.Ua.Client.ComplexTypes/1.5.378.176) [OPCFoundation.NetStandard.Opc.Ua.Bindings.Https](https://www.nuget.org/packages/OPCFoundation.NetStandard.Opc.Ua.Bindings.Https/1.5.378.176) [OPCFoundation.NetStandard.Opc.Ua.PubSub](https://www.nuget.org/packages/OPCFoundation.NetStandard.Opc.Ua.PubSub/1.5.378.176) #### What's Changed - Fix publish queue lost wake-up by [@​marcschier](https://github.com/marcschier) in [#​4017](OPCFoundation/UA-.NETStandard#4017) - Obsolete legacy TraceConfiguration in favor of ITelemetryContext by [@​marcschier](https://github.com/marcschier) with [@​Copilot](https://github.com/Copilot) in [#​4090](OPCFoundation/UA-.NETStandard#4090) - Preserve publish queue timestamp ordering by [@​marcschier](https://github.com/marcschier) with [@​Copilot](https://github.com/Copilot) in [#​4084](OPCFoundation/UA-.NETStandard#4084) - Fix BadContinuationPointInvalid caused by empty continuation point in Browser.BrowseAsync by [@​marcschier](https://github.com/marcschier) in [#​4168](OPCFoundation/UA-.NETStandard#4168) - Add documentation for custom NodeSet2 authoring workflow by [@​romanett](https://github.com/romanett) with [@​Copilot](https://github.com/Copilot) in [#​4170](OPCFoundation/UA-.NETStandard#4170) - Fixed timer leaks in ChannelAsyncOperation.EndAsync ([#​3669](OPCFoundation/UA-.NETStandard#3669)) by [@​KarenKrill](https://github.com/KarenKrill) in [#​4166](OPCFoundation/UA-.NETStandard#4166) - Treat zero MaxNotificationsPerPublish as unlimited (OPC 10000-4) by [@​romanett](https://github.com/romanett) in [#​4263](OPCFoundation/UA-.NETStandard#4263) - fix(server): enforce browse continuation point limit at capacity ([#​4036](OPCFoundation/UA-.NETStandard#4036)) by [@​romanett](https://github.com/romanett) in [#​4270](OPCFoundation/UA-.NETStandard#4270) - Fix unordered server endpoint validation ([#​4029](OPCFoundation/UA-.NETStandard#4029)) \[backport to master378] by [@​romanett](https://github.com/romanett) in [#​4269](OPCFoundation/UA-.NETStandard#4269) - fix: don't return continuation points on BadNoContinuationPoints ([#​4022](OPCFoundation/UA-.NETStandard#4022)) \[backport to master378] by [@​romanett](https://github.com/romanett) in [#​4268](OPCFoundation/UA-.NETStandard#4268) - fix: scope Cancel request matching to the current session ([#​4023](OPCFoundation/UA-.NETStandard#4023)) by [@​romanett](https://github.com/romanett) in [#​4267](OPCFoundation/UA-.NETStandard#4267) - Set ContinuationPoint to null when browse is finished (port of [#​4057](OPCFoundation/UA-.NETStandard#4057)) by [@​romanett](https://github.com/romanett) in [#​4266](OPCFoundation/UA-.NETStandard#4266) - Default TransportQuotas in ApplicationConfiguration.ValidateAsync to prevent server-start NullReferenceException (backport to master378) by [@​romanett](https://github.com/romanett) in [#​4264](OPCFoundation/UA-.NETStandard#4264) - Fix ServerTimestamp update on read of stored/static nodes ([#​4257](OPCFoundation/UA-.NETStandard#4257)) by [@​romanett](https://github.com/romanett) in [#​4260](OPCFoundation/UA-.NETStandard#4260) - Fix reverse connect hold time when several Servers share one listener by [@​romanett](https://github.com/romanett) in [#​4341](OPCFoundation/UA-.NETStandard#4341) - \[master378] Fix Publish with maximum TimeoutHint by [@​mrsuciu](https://github.com/mrsuciu) in [#​4373](OPCFoundation/UA-.NETStandard#4373) - \[master378] Send the filtered retain trailing event with a client specific Retain = false by [@​romanett](https://github.com/romanett) in [#​4454](OPCFoundation/UA-.NETStandard#4454) - Master378 backport ctt changes by [@​mrsuciu](https://github.com/mrsuciu) in [#​4326](OPCFoundation/UA-.NETStandard#4326) - Update Microsoft.SourceLink.GitHub and Microsoft.SourceLink.AzureRepos.Git from 10.0.102 to 10.0.111 by [@​mrsuciu](https://github.com/mrsuciu) in [#​4465](OPCFoundation/UA-.NETStandard#4465) **Full Changelog**: <OPCFoundation/UA-.NETStandard@1.5.378.156...1.5.378.176> </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - Between 12:00 AM and 03:59 AM (`* 0-3 * * *`) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC43Ny4wIiwidXBkYXRlZEluVmVyIjoiNDQuNzcuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==--> Reviewed-on: https://codeberg.org/umati/connect/pulls/45 Signed-off-by: umati-bot <git-bot@umati.org>
This pull request standardizes the handling of the
ContinuationPointproperty inBrowseResultobjects, ensuring it is always explicitly set tonull(or its equivalent) when no continuation point is present. This change improves clarity and consistency in both the implementation and the tests, replacing checks for an "empty" continuation point with checks for a "null" continuation point.Codebase consistency and correctness:
BrowseResultobjects now explicitly setContinuationPoint = defaultwhen no continuation point is to be returned, ensuring consistent initialization. (src/Opc.Ua.Server/NodeManager/MasterNodeManager.cs) [1] [2] [3]Test updates for new semantics:
All test assertions now use
ContinuationPoint.IsNullinstead ofIsEmptyto check for the absence of a continuation point, reflecting the new contract. (tests/Opc.Ua.InformationModel.Tests/BrowseContinuationPointTests.cs,tests/Opc.Ua.Server.Tests/NodeManager/MasterNodeManagerDeterministicTests.cs) [1] [2] [3] [4] [5]Additional test cases have been added to verify that completed browse operations and error scenarios always return a null continuation point. (
tests/Opc.Ua.Server.Tests/NodeManager/MasterNodeManagerDeterministicTests.cs) [1] [2] [3]# DescriptionDescribe the changes here to communicate to the maintainers why they should accept this pull request. By default - this will become the Commit message after merging and thus define history.
Related Issues
Reference all GitHub issues this PR addresses. If there is no issue yet, open one and link it here.
If this is a relatively large or complex change, a design must have been discussed in the related tracking issue and signed off (which becomes the Architectural Decision Record (ADR)).
Checklist
Put an
xin the boxes that apply. You can complete these step by step after opening the PR.