Release notes¶
v2.0.7 — latest¶
Focus: hardened notification stream parsing for devices that coalesce, fragment, or corrupt NETCONF notification payloads.
Added¶
Added a persistent per-subscription notification receive buffer.
Added stream parsing that can split multiple
]]>]]>-delimited notifications received in one SSH read into separate queue entries.Added preservation of trailing partial notification bytes across notification reactor callbacks.
Added detection for abandoned partial notifications when a new
<notification>start tag appears before the previous notification completed.Added
malformed_notificationhealth events for malformed notification stream data.
Changed¶
Notification delivery no longer treats one libssh2 read as one notification.
Valid complete EOM-delimited notifications continue to be queued with the EOM marker included for backward compatibility.
Partial notifications and recovered missing-EOM fragments are queued exactly as received, without adding a synthetic EOM marker.
Notification parser state is cleared during subscription reset, dead-session cleanup, and notification queue clearing.
Handled bad-device cases¶
Multiple complete notifications combined in one SSH read.
One complete notification followed by a partial next notification.
Partial notification bytes completed by a later read.
A new notification start arriving before the previous notification completed.
Empty EOM-only frames.
EOM-delimited data that is not valid notification XML.
Orphan bytes before a notification start tag.
Complete notification XML followed by another notification without EOM between them.
Partial data that never receives EOM before the timeout or size guard fires.
v2.0.6¶
Focus: device-identifiable health events, event timing, and expanded release testing.
Added¶
Added
labelconstructor argument toNetconfClient.Added
NotificationHealthEvent.label.Added
NotificationHealthEvent.timestamp.Added
labelandtimestamptoNotificationHealthEvent.as_dict().Added explicit
label == "None"for global event-bus timeout events.Added deeper test coverage for non-deprecated public APIs.
Added optional real Netopeer2/Sysrepo integration tests.
Added documentation for manylinux wheel testing and Netopeer2 release testing.
Changed¶
Health events are now easier to map to user inventory through
label.Health events now carry UTC creation time through
timestamp.Documentation is updated to present the async API as the primary supported usage path.
v2.0.5¶
Focus: notification observability and safer reactor behavior.
Added process-wide notification health event stream.
Added
NotificationHealthEventandevent.as_dict().Added
next_notification_eventandnext_notification_event_async.Added
pending_notification_event_countandclear_notification_events.Added
next_notification_async.Added GIL release around
next_notification()waits.Added incomplete-notification guards:
notif_incomplete_max_kbandnotif_incomplete_timeout.Added
notif_drop_event_threshold.Added queue inspection helpers:
peek_notificationsandnotification_queue_size.Deprecated explicit synchronous flow APIs.
v2.0.4¶
Added user-configurable
socket_connect_timeout.Reduced CPU usage for non-blocking reads by waiting on socket readiness.
Replaced one watcher thread per async operation with a shared async future dispatcher.
Improved async exception preservation.
v2.0.3¶
Hardened notification reactor exception handling.
Registered notification sockets only after subscription RPC success.
Improved notification cleanup and subscription state safety.
Added safer weak-reference handling in notification reactors.
v2.0.2¶
Improved exception handling to prevent Python process crashes.
Added
notif_queue_sizefor internal notification queues.Added release builds for multiple Python versions.
v1.0.9¶
Added cancellation-safe asyncio bridge guard to avoid
InvalidStateErrorafter Python future cancellation.
v1.0.8¶
Reimplemented notification monitoring with an epoll-based notification subsystem.
Added
set_notification_reactor_count().Removed
receive_notification_async(); usenext_notification()ornext_notification_async().