1 Commits

Author SHA1 Message Date
不做了睡大觉 4179a9c45c fix(python): use WeakSet for resource subscriptions to prevent memory leak on client disconnect (#1093)
* fix: use WeakSet for resource subscriptions to prevent memory leak on client disconnect

Fixes #1092

Previously, resource subscriptions tracked sessions by storing id(session)
integers in plain sets. When clients disconnected without explicitly
unsubscribing, these integer IDs accumulated indefinitely since there was
no cleanup mechanism for dropped connections.

This change replaces the dict[str, set[int]] with dict[str, WeakSet],
storing weak references to session objects directly. When a session is
garbage-collected (after disconnect), its entry is automatically removed
from all subscription sets.

This also simplifies notify_resource_updated() — instead of iterating all
active sessions and checking membership by id, we now iterate the WeakSet
subscribers directly, which is both correct and more efficient.

* style: use idiomatic emptiness check for WeakSet

Replace `if not len(subscribers)` with `if not subscribers` for consistency
with the existing check in notify_resource_updated().

* fix: clean up empty subscription entries + add unit tests

- Clean up empty dict entries in notify_resource_updated() after all
  sessions for a URI are GC'd, preventing stale keys from accumulating
- Add 4 unit tests for GC-driven subscription cleanup:
  - test_subscription_cleanup_after_session_gc
  - test_notify_skips_gc_collected_sessions
  - test_notify_does_not_crash_when_all_sessions_gone
  - test_multiple_uris_independent_cleanup

---------

Co-authored-by: User <user@example.com>
Co-authored-by: pietrozullo <pietro.zullo@gmail.com>
2026-03-03 09:59:24 +01:00