mirror of
https://github.com/block/buzz.git
synced 2026-08-18 06:50:31 +02:00
The dynamic refcounted Redis subscriber (Max's pubsub seam) only SUBSCRIBEs a community-scoped topic once a pod declares local interest via retain_topic, and debounce-UNSUBSCRIBEs on the last release. Until now nothing drove those calls from real subscription activity, so cross-pod delivery only worked via a manual retain in the presence test setup. The SubscriptionRegistry stays synchronous and tenant-agnostic — it does not grow a PubSubManager or TenantContext. Instead each mutator now reports the routing topic(s) it added/removed: - register -> Option<EventTopic> displaced by an in-place sub_id replace - remove_subscription -> Option<EventTopic> removed - remove_connection -> Vec<EventTopic>, one per removed sub The call sites — where &conn.tenant and state.pubsub already live — apply the delta: retain the new topic on REQ, release on CLOSE / connection drop / channel-access revocation. The pubsub manager's own (community, topic) refcount collapses N releases to one debounced UNSUBSCRIBE and keeps two communities sharing a channel UUID isolated, since the community is bound at the call site via ctx. Every subscription contributes exactly one retain at creation and one release at teardown — balanced, no registry-side counter. The presence cross-pod test now drives retain through the real register() path (register_global_sub is async) instead of a manual workaround, proving delivery from genuine subscription interest. Five new registry unit tests pin the topic-reporting contract including the replace-displaces-old case. cargo test -p buzz-relay: 378 passed, 0 failed. Redis round-trip presence test exercised against local Redis. Co-authored-by: Tyler Longwell <tlongwell@block.xyz> Signed-off-by: Tyler Longwell <tlongwell@block.xyz>