From a436e63df2ece111fa7a27317d67276dac8d9c94 Mon Sep 17 00:00:00 2001 From: "Takahisa.Ishikawa" Date: Fri, 16 Jan 2026 15:55:50 +0900 Subject: [PATCH] Revert "revert to 0bb2c75b3b3cdcc380f6c21ac9129c54075ba059" This reverts commit 36bc811792771f26fb68f7f69e56f2b9caee4274. --- rclcpp_components/src/component_manager.cpp | 61 +++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/rclcpp_components/src/component_manager.cpp b/rclcpp_components/src/component_manager.cpp index cacabd23f5..30769fb521 100644 --- a/rclcpp_components/src/component_manager.cpp +++ b/rclcpp_components/src/component_manager.cpp @@ -29,6 +29,62 @@ using namespace std::placeholders; namespace rclcpp_components { +namespace +{ + /// Check if a node with the same name already exists in the container + /** + * \param request information with the node to load + * \param node_wrappers map of nodes in the container + * \param logger logger + * \param response response to be filled if node already exists + * \return true if node already exists, false otherwise + */ +bool check_node_duplication( + const std::shared_ptr request, + const std::map & node_wrappers, + const rclcpp::Logger & logger, + std::shared_ptr response) +{ + if (request->node_name.empty()) { + return false; + } + + const std::string & ns = request->node_namespace; + std::string requested_fqn; + if (ns.empty() || ns == "/") { + requested_fqn = "/" + request->node_name; + } else if (ns.back() == '/') { + requested_fqn = ns + request->node_name; + } else { + requested_fqn = ns + "/" + request->node_name; + } + + // scan existing nodes + auto existing_node = std::find_if( + node_wrappers.cbegin(), + node_wrappers.cend(), + [&requested_fqn](const auto & kv) { + // Copy to call non-const method from const reference + auto wrapper = kv.second; + const auto base = wrapper.get_node_base_interface(); + return base && base->get_fully_qualified_name() == requested_fqn; + }); + + if (existing_node != node_wrappers.cend()) { + // already exists -> return existing instance + response->full_node_name = requested_fqn; + response->unique_id = existing_node->first; + response->success = true; + RCLCPP_WARN( + logger, + "[LoadNode] Deduplicated : node '%s' already exists. Skipping load.", + requested_fqn.c_str()); + return true; + } + + return false; +} +} // namespace (anonymous) ComponentManager::ComponentManager( std::weak_ptr executor, @@ -225,6 +281,11 @@ ComponentManager::on_load_node( (void) request_header; try { + // check if node already exists in the container + if (check_node_duplication(request, node_wrappers_, get_logger(), response)) { + return; + } + auto resources = get_component_resources(request->package_name); for (const auto & resource : resources) {