Skip to content

Commit

Permalink
check for state of the controller node before cleanup (backport #1363) (
Browse files Browse the repository at this point in the history
  • Loading branch information
mergify[bot] authored Apr 9, 2024
1 parent d453257 commit 498808f
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 1 deletion.
15 changes: 14 additions & 1 deletion controller_manager/src/controller_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -667,7 +667,20 @@ controller_interface::return_type ControllerManager::unload_controller(
RCLCPP_DEBUG(get_logger(), "Cleanup controller");
// TODO(destogl): remove reference interface if chainable; i.e., add a separate method for
// cleaning-up controllers?
controller.c->get_node()->cleanup();
if (is_controller_inactive(*controller.c))
{
RCLCPP_DEBUG(
get_logger(), "Controller '%s' is cleaned-up before unloading!", controller_name.c_str());
// TODO(destogl): remove reference interface if chainable; i.e., add a separate method for
// cleaning-up controllers?
const auto new_state = controller.c->get_node()->cleanup();
if (new_state.id() != lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED)
{
RCLCPP_WARN(
get_logger(), "Failed to clean-up the controller '%s' before unloading!",
controller_name.c_str());
}
}
executor_->remove_node(controller.c->get_node()->get_node_base_interface());
to.erase(found_it);

Expand Down
14 changes: 14 additions & 0 deletions controller_manager/test/test_controller_manager_srvs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -462,6 +462,8 @@ TEST_F(TestControllerManagerSrvs, unload_controller_srv)

result = call_service_and_wait(*client, request, srv_executor, true);
ASSERT_TRUE(result->ok);
EXPECT_EQ(
lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED, test_controller->get_state().id());
EXPECT_EQ(0u, cm_->get_loaded_controllers().size());
}

Expand All @@ -473,6 +475,9 @@ TEST_F(TestControllerManagerSrvs, configure_controller_srv)
rclcpp::Client<controller_manager_msgs::srv::ConfigureController>::SharedPtr client =
srv_node->create_client<controller_manager_msgs::srv::ConfigureController>(
"test_controller_manager/configure_controller");
rclcpp::Client<controller_manager_msgs::srv::UnloadController>::SharedPtr unload_client =
srv_node->create_client<controller_manager_msgs::srv::UnloadController>(
"test_controller_manager/unload_controller");

auto request = std::make_shared<controller_manager_msgs::srv::ConfigureController::Request>();
request->name = test_controller::TEST_CONTROLLER_NAME;
Expand All @@ -491,6 +496,15 @@ TEST_F(TestControllerManagerSrvs, configure_controller_srv)
EXPECT_EQ(
lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE,
cm_->get_loaded_controllers()[0].c->get_state().id());
EXPECT_EQ(lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE, test_controller->get_state().id());

// now unload the controller and check the state
auto unload_request = std::make_shared<controller_manager_msgs::srv::UnloadController::Request>();
unload_request->name = test_controller::TEST_CONTROLLER_NAME;
ASSERT_TRUE(call_service_and_wait(*unload_client, unload_request, srv_executor, true)->ok);
EXPECT_EQ(
lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED, test_controller->get_state().id());
EXPECT_EQ(0u, cm_->get_loaded_controllers().size());
}

TEST_F(TestControllerManagerSrvs, list_sorted_chained_controllers)
Expand Down

0 comments on commit 498808f

Please sign in to comment.