From 4f84871e8c0dcd590de5a3f49d956fc7f60ffcad Mon Sep 17 00:00:00 2001 From: Akihiko Komada Date: Thu, 2 Apr 2026 23:12:59 +0900 Subject: [PATCH] routing: re-notify transferred subscribers on late offer_event() (#1019) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When offer_service() is called before offer_event() for all events in an event group, consumers that subscribe in their availability handler receive SUBSCRIBE_ACK before those events are registered. The transfer_subscriptions_from_any_event block in register_event() migrates subscribers from the ANY_EVENT placeholder via add_subscriber() but makes no notify_one() call afterward — late-registered events are silently orphaned and their values never delivered. Fix: after transferring each subscriber, call notify_one() if the event already has a payload (is_set() guard). This delivers the current cached value to the transferred subscriber, matching the semantic of a fresh subscription. The is_set() guard prevents sending uninitialized payloads for events not yet published. Normal path (offer_event before offer_service) is unaffected: no ANY_EVENT placeholder subscribers exist at register_event() time, so the transfer block is not reached. Fixes #1019. --- implementation/routing/src/routing_manager_base.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/implementation/routing/src/routing_manager_base.cpp b/implementation/routing/src/routing_manager_base.cpp index 946196520..40e9f2d9e 100644 --- a/implementation/routing/src/routing_manager_base.cpp +++ b/implementation/routing/src/routing_manager_base.cpp @@ -607,6 +607,9 @@ void routing_manager_base::register_event(client_t _client, service_t _service, std::set its_any_event_subscribers = its_any_event->get_subscribers(eventgroup); for (const client_t subscriber : its_any_event_subscribers) { its_event->add_subscriber(eventgroup, nullptr, subscriber, true); + if (its_event->is_set()) { + its_event->notify_one(subscriber, false); + } } } }