Skip to content

Commit e556aaa

Browse files
authored
check for state of the controller node before cleanup (backport #1363) (#1378)
1 parent 7d9aa3c commit e556aaa

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

controller_manager/src/controller_manager.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,20 @@ controller_interface::return_type ControllerManager::unload_controller(
652652
RCLCPP_DEBUG(get_logger(), "Cleanup controller");
653653
// TODO(destogl): remove reference interface if chainable; i.e., add a separate method for
654654
// cleaning-up controllers?
655-
controller.c->get_node()->cleanup();
655+
if (is_controller_inactive(*controller.c))
656+
{
657+
RCLCPP_DEBUG(
658+
get_logger(), "Controller '%s' is cleaned-up before unloading!", controller_name.c_str());
659+
// TODO(destogl): remove reference interface if chainable; i.e., add a separate method for
660+
// cleaning-up controllers?
661+
const auto new_state = controller.c->get_node()->cleanup();
662+
if (new_state.id() != lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED)
663+
{
664+
RCLCPP_WARN(
665+
get_logger(), "Failed to clean-up the controller '%s' before unloading!",
666+
controller_name.c_str());
667+
}
668+
}
656669
executor_->remove_node(controller.c->get_node()->get_node_base_interface());
657670
to.erase(found_it);
658671

controller_manager/test/test_controller_manager_srvs.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,8 @@ TEST_F(TestControllerManagerSrvs, unload_controller_srv)
461461

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

@@ -472,6 +474,9 @@ TEST_F(TestControllerManagerSrvs, configure_controller_srv)
472474
rclcpp::Client<controller_manager_msgs::srv::ConfigureController>::SharedPtr client =
473475
srv_node->create_client<controller_manager_msgs::srv::ConfigureController>(
474476
"test_controller_manager/configure_controller");
477+
rclcpp::Client<controller_manager_msgs::srv::UnloadController>::SharedPtr unload_client =
478+
srv_node->create_client<controller_manager_msgs::srv::UnloadController>(
479+
"test_controller_manager/unload_controller");
475480

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

495509
TEST_F(TestControllerManagerSrvs, list_sorted_chained_controllers)

0 commit comments

Comments
 (0)