Skip to content

Commit

Permalink
fix issue ros2#1597: mark files being written as "active"
Browse files Browse the repository at this point in the history
  • Loading branch information
facontidavide committed May 22, 2024
1 parent 82bc154 commit f7fefb8
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 3 deletions.
4 changes: 2 additions & 2 deletions rosbag2_cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ if(NOT CMAKE_C_STANDARD)
set(CMAKE_C_STANDARD 99)
endif()

# Default to C++14
# Default to C++17
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD 17)
endif()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
Expand Down
31 changes: 30 additions & 1 deletion rosbag2_cpp/src/rosbag2_cpp/writers/sequential_writer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

#include <algorithm>
#include <chrono>
#include <filesystem>
#include <memory>
#include <stdexcept>
#include <string>
Expand Down Expand Up @@ -44,6 +45,19 @@ std::string strip_parent_path(const std::string & relative_path)
{
return rcpputils::fs::path(relative_path).filename().string();
}

std::string remove_active_from_filename(const std::string& relative_path)
{
rcpputils::fs::path path(relative_path);
auto filename = path.filename().string();
auto active_pos = filename.find(".active");
if(active_pos != std::string::npos) {
filename.replace(active_pos, 7, "");
}
auto new_path = path.parent_path() / filename;
return new_path.string();
}

} // namespace

SequentialWriter::SequentialWriter(
Expand Down Expand Up @@ -173,7 +187,11 @@ void SequentialWriter::close()
}

if (storage_) {
// when the storage_ is closed, rename the file to remove ".active" suffix
std::string active_path = storage_->get_relative_file_path();
std::string final_path = remove_active_from_filename(active_path);
storage_.reset(); // Destroy storage before calling WRITE_SPLIT callback to make sure that
std::filesystem::rename(active_path, final_path);
// bag file was closed before callback call.
}
if (!metadata_.relative_file_paths.empty()) {
Expand Down Expand Up @@ -257,7 +275,7 @@ std::string SequentialWriter::format_storage_uri(
// The name of the folder needs to be queried in case
// SequentialWriter is opened with a relative path.
std::stringstream storage_file_name;
storage_file_name << rcpputils::fs::path(base_folder).filename().string() << "_" << storage_count;
storage_file_name << rcpputils::fs::path(base_folder).filename().string() << "_" << storage_count << ".active";

return (rcpputils::fs::path(base_folder) / storage_file_name.str()).string();
}
Expand All @@ -269,11 +287,22 @@ void SequentialWriter::switch_to_next_storage()
cache_consumer_->stop();
message_cache_->log_dropped();
}
// Write the metadata before splitting. This will be replaced by an updated file later.
// In this way, if the process crashes, the metadata for the previous parts will still be available.
finalize_metadata();
metadata_io_->write_metadata(base_folder_, metadata_);

storage_options_.uri = format_storage_uri(
base_folder_,
metadata_.relative_file_paths.size());

// when the storage_ is closed, rename the file to remove ".inactive" suffix
std::string active_path = storage_->get_relative_file_path();
std::string final_path = remove_active_from_filename(active_path);

storage_ = storage_factory_->open_read_write(storage_options_);

std::filesystem::rename(active_path, final_path);

if (!storage_) {
std::stringstream errmsg;
Expand Down

0 comments on commit f7fefb8

Please sign in to comment.