history: node manager never issues event-HistoryRead continuation points #669

Closed
opened 2026-10-09 15:26:04 -04:00 by dohertj2 · 1 comment
Owner

Found in the pluggable-historian work. This bug predates that work and is not specific to the backend.

OtOpcUaNodeManager never issues or resumes continuation points for event HistoryRead. When a client caps an events read (NumValuesPerNode), it gets only the first page, even when the data source reports more. Both IHistorianDataSource implementations can signal truncation, so the gap is entirely in the node manager.

Scope: event continuation points, mirroring the raw-read paging (including same-timestamp ties), plus a test that pages through more events than the cap.

Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe

Found in the pluggable-historian work. This bug predates that work and is not specific to the backend. OtOpcUaNodeManager never issues or resumes continuation points for **event** HistoryRead. When a client caps an events read (`NumValuesPerNode`), it gets only the first page, even when the data source reports more. Both IHistorianDataSource implementations can signal truncation, so the gap is entirely in the node manager. **Scope:** event continuation points, mirroring the raw-read paging (including same-timestamp ties), plus a test that pages through more events than the cap. Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
Author
Owner

Fixed in d803e0ea (merged to master).

  • Event HistoryRead now issues and resumes continuation points (ServeEventsAsync); cursor = last event time + trailing tie count, oversized tie clusters over-fetched within MaxTieClusterOverfetch. Continuation points are bound to their node and read kind (since #668 the record carries a cursor kind Raw/Events/Modified); an unknown CP ⇒ BadContinuationPointInvalid.
  • Open-ended reads per Part 11: start-only ⇒ forward to UTC max; end-only raw ⇒ backward. A resumed read is always forward. The review found the same open-ended duplicate bug in raw paging — fixed too.
  • Tests: node-manager paging tests, an over-the-wire event paging test, and the conformance test Extreme_bounds_MaxValue_and_MinValue_are_safe.

Live gate (docker-dev, gate 1): event history paged over the wire with a real SDK client — every event exactly once across CPs; extreme bounds safe.

Follow-ups filed: reverse capped read semantics, events end-only alignment, Gateway year-9999 bound.

Fixed in `d803e0ea` (merged to master). - Event HistoryRead now issues and resumes continuation points (`ServeEventsAsync`); cursor = last event time + trailing tie count, oversized tie clusters over-fetched within `MaxTieClusterOverfetch`. Continuation points are bound to their node and read kind (since #668 the record carries a cursor kind Raw/Events/Modified); an unknown CP ⇒ `BadContinuationPointInvalid`. - Open-ended reads per Part 11: start-only ⇒ forward to UTC max; end-only raw ⇒ backward. A resumed read is always forward. The review found the same open-ended duplicate bug in raw paging — fixed too. - Tests: node-manager paging tests, an over-the-wire event paging test, and the conformance test `Extreme_bounds_MaxValue_and_MinValue_are_safe`. **Live gate (docker-dev, gate 1):** event history paged over the wire with a real SDK client — every event exactly once across CPs; extreme bounds safe. Follow-ups filed: reverse capped read semantics, events end-only alignment, Gateway year-9999 bound.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dohertj2/lmxopcua#669