Skip to content

Commit 498808f

Browse files
authored
check for state of the controller node before cleanup (backport #1363) (#1379)
1 parent d453257 commit 498808f

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

controller_manager/src/controller_manager.cpp

+14-1
Original file line numberDiff line numberDiff line change
@@ -667,7 +667,20 @@ controller_interface::return_type ControllerManager::unload_controller(
667667
RCLCPP_DEBUG(get_logger(), "Cleanup controller");
668668
// TODO(destogl): remove reference interface if chainable; i.e., add a separate method for
669669
// cleaning-up controllers?
670-
controller.c->get_node()->cleanup();
670+
if (is_controller_inactive(*controller.c))
671+
{
672+
RCLCPP_DEBUG(
673+
get_logger(), "Controller '%s' is cleaned-up before unloading!", controller_name.c_str());
674+
// TODO(destogl): remove reference interface if chainable; i.e., add a separate method for
675+
// cleaning-up controllers?
676+
const auto new_state = controller.c->get_node()->cleanup();
677+
if (new_state.id() != lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED)
678+
{
679+
RCLCPP_WARN(
680+
get_logger(), "Failed to clean-up the controller '%s' before unloading!",
681+
controller_name.c_str());
682+
}
683+
}
671684
executor_->remove_node(controller.c->get_node()->get_node_base_interface());
672685
to.erase(found_it);
673686

controller_manager/test/test_controller_manager_srvs.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,8 @@ TEST_F(TestControllerManagerSrvs, unload_controller_srv)
462462

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

@@ -473,6 +475,9 @@ TEST_F(TestControllerManagerSrvs, configure_controller_srv)
473475
rclcpp::Client<controller_manager_msgs::srv::ConfigureController>::SharedPtr client =
474476
srv_node->create_client<controller_manager_msgs::srv::ConfigureController>(
475477
"test_controller_manager/configure_controller");
478+
rclcpp::Client<controller_manager_msgs::srv::UnloadController>::SharedPtr unload_client =
479+
srv_node->create_client<controller_manager_msgs::srv::UnloadController>(
480+
"test_controller_manager/unload_controller");
476481

477482
auto request = std::make_shared<controller_manager_msgs::srv::ConfigureController::Request>();
478483
request->name = test_controller::TEST_CONTROLLER_NAME;
@@ -491,6 +496,15 @@ TEST_F(TestControllerManagerSrvs, configure_controller_srv)
491496
EXPECT_EQ(
492497
lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE,
493498
cm_->get_loaded_controllers()[0].c->get_state().id());
499+
EXPECT_EQ(lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE, test_controller->get_state().id());
500+
501+
// now unload the controller and check the state
502+
auto unload_request = std::make_shared<controller_manager_msgs::srv::UnloadController::Request>();
503+
unload_request->name = test_controller::TEST_CONTROLLER_NAME;
504+
ASSERT_TRUE(call_service_and_wait(*unload_client, unload_request, srv_executor, true)->ok);
505+
EXPECT_EQ(
506+
lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED, test_controller->get_state().id());
507+
EXPECT_EQ(0u, cm_->get_loaded_controllers().size());
494508
}
495509

496510
TEST_F(TestControllerManagerSrvs, list_sorted_chained_controllers)

0 commit comments

Comments
 (0)