Skip to content

Commit

Permalink
Handle SIGTERM gracefully in recording
Browse files Browse the repository at this point in the history
Signed-off-by: Emerson Knapp <[email protected]>
  • Loading branch information
Emerson Knapp committed Jul 3, 2021
1 parent 4bb4220 commit e0e3215
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,9 @@ ProcessHandle start_execution(const std::string & command)
return process_id;
}

void stop_execution(const ProcessHandle & handle)
void stop_execution(const ProcessHandle & handle, int signum = SIGINT)
{
killpg(handle, SIGINT);
killpg(handle, signum);
int child_return_code;
waitpid(handle, &child_return_code, 0);
// this call will make sure that the process does execute without issues before it is killed by
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include <Windows.h>

#include <chrono>
#include <csignal>
#include <cstdlib>
#include <string>
#include <thread>
Expand Down Expand Up @@ -104,8 +105,10 @@ ProcessHandle start_execution(const std::string & command)
return process;
}

void stop_execution(const ProcessHandle & handle)
void stop_execution(const ProcessHandle & handle, int signum = SIGINT)
{
// Match the Unix version by allowing for int signum argument - however Windows does not have
// Linux signals in the same way, so there isn't a 1:1 mapping to dispatch e.g. SIGTERM
DWORD exit_code;
GetExitCodeProcess(handle.process_info.hProcess, &exit_code);
// 259 indicates that the process is still active: we want to make sure that the process is
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,20 @@ TEST_F(RecordFixture, record_end_to_end_test) {
EXPECT_THAT(wrong_topic_messages, IsEmpty());
}

TEST_F(RecordFixture, record_end_to_end_exits_gracefully_on_sigterm) {
const std::string topic_name = "/test_sigterm";
auto message = get_messages_strings()[0];
message->string_value = "test";
rosbag2_test_common::PublicationManager pub_manager;
pub_manager.setup_publisher(topic_name, message, 10);
auto process_handle = start_execution(
"ros2 bag record --output " + root_bag_path_.string() + " " + topic_name);
wait_for_db();
pub_manager.run_publishers();
stop_execution(process_handle, SIGTERM);
wait_for_metadata();
}

// TODO(zmichaels11): Fix and enable this test on Windows.
// This tests depends on the ability to read the metadata file.
// Stopping the process on Windows does a hard kill and the metadata file is not written.
Expand Down
5 changes: 5 additions & 0 deletions rosbag2_transport/src/rosbag2_transport/rosbag2_transport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

#include "rosbag2_transport/rosbag2_transport.hpp"

#include <csignal>
#include <memory>
#include <queue>
#include <string>
Expand Down Expand Up @@ -59,6 +60,10 @@ Rosbag2Transport::Rosbag2Transport(
void Rosbag2Transport::init()
{
rclcpp::init(0, nullptr);
std::signal(
SIGTERM, [](int /* signal */) {
rclcpp::shutdown();
});
}

void Rosbag2Transport::shutdown()
Expand Down

0 comments on commit e0e3215

Please sign in to comment.