From dc462f432a2360f4ed9c7b5e2a17051074674f01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= Date: Mon, 10 Nov 2025 19:58:36 +0100 Subject: [PATCH 29/42] restconf: dynamic subscriptions shutdown method MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Organization: Wires Dynamic subscriptions now have a proper shutdown method that sets a Terminating state on all the subscriptions so that each subscription cannot call its terminate() method. Change-Id: I4532bbafff7c7386a18ed0636f1102842d2749fa Signed-off-by: Mattias Walström Signed-off-by: Joachim Wiberg --- src/restconf/DynamicSubscriptions.cpp | 10 ++++++++++ src/restconf/DynamicSubscriptions.h | 1 + src/restconf/Server.cpp | 1 + 3 files changed, 12 insertions(+) diff --git a/src/restconf/DynamicSubscriptions.cpp b/src/restconf/DynamicSubscriptions.cpp index 7f4b171..9c195f4 100644 --- a/src/restconf/DynamicSubscriptions.cpp +++ b/src/restconf/DynamicSubscriptions.cpp @@ -82,6 +82,16 @@ DynamicSubscriptions::DynamicSubscriptions(const std::string& streamRootUri) DynamicSubscriptions::~DynamicSubscriptions() = default; +void DynamicSubscriptions::stop() +{ + std::lock_guard lock(m_mutex); + for (const auto& [uuid, subscriptionData] : m_subscriptions) { + // We are already terminating and will destroy via destructor, calls to terminate() will do nothing + std::lock_guard lock(subscriptionData->mutex); + subscriptionData->state = SubscriptionData::State::Terminating; + } +} + void DynamicSubscriptions::establishSubscription(sysrepo::Session& session, const libyang::DataFormat requestEncoding, const libyang::DataNode& rpcInput, libyang::DataNode& rpcOutput) { // Generate a new UUID associated with the subscription. The UUID will be used as a part of the URI so that the URI is not predictable (RFC 8650, section 5) diff --git a/src/restconf/DynamicSubscriptions.h b/src/restconf/DynamicSubscriptions.h index 1874390..0309cad 100644 --- a/src/restconf/DynamicSubscriptions.h +++ b/src/restconf/DynamicSubscriptions.h @@ -55,6 +55,7 @@ public: ~DynamicSubscriptions(); std::shared_ptr getSubscriptionForUser(const boost::uuids::uuid& uuid, const std::optional& user); void establishSubscription(sysrepo::Session& session, const libyang::DataFormat requestEncoding, const libyang::DataNode& rpcInput, libyang::DataNode& rpcOutput); + void stop(); private: std::mutex m_mutex; ///< Lock for shared data (subscriptions storage and uuid generator) diff --git a/src/restconf/Server.cpp b/src/restconf/Server.cpp index 2a8ad33..5486e99 100644 --- a/src/restconf/Server.cpp +++ b/src/restconf/Server.cpp @@ -884,6 +884,7 @@ void Server::stop() }); shutdownRequested(); + m_dynamicSubscriptions.stop(); } void Server::join() -- 2.43.0