Sort parts by UUID and part_index
Also update log_cat to support this! This makes it significantly more
memory efficient to read logs with lots of parts.
Change-Id: I5ce70f9342b3ab1c7a7823a878ebd890c00ce04f
diff --git a/aos/events/logging/logfile_utils.cc b/aos/events/logging/logfile_utils.cc
index 214fa2b..938ede7 100644
--- a/aos/events/logging/logfile_utils.cc
+++ b/aos/events/logging/logfile_utils.cc
@@ -278,19 +278,36 @@
FlatbufferVector<LogFileHeader> ReadHeader(std::string_view filename) {
SpanReader span_reader(filename);
- // Make sure we have enough to read the size.
absl::Span<const uint8_t> config_data = span_reader.ReadMessage();
// Make sure something was read.
CHECK(config_data != absl::Span<const uint8_t>())
<< ": Failed to read header from: " << filename;
- // And copy the config so we have it forever.
+ // And copy the config so we have it forever, removing the size prefix.
std::vector<uint8_t> data(
config_data.begin() + sizeof(flatbuffers::uoffset_t), config_data.end());
return FlatbufferVector<LogFileHeader>(std::move(data));
}
+FlatbufferVector<MessageHeader> ReadNthMessage(std::string_view filename,
+ size_t n) {
+ SpanReader span_reader(filename);
+ absl::Span<const uint8_t> data_span = span_reader.ReadMessage();
+ for (size_t i = 0; i < n + 1; ++i) {
+ data_span = span_reader.ReadMessage();
+
+ // Make sure something was read.
+ CHECK(data_span != absl::Span<const uint8_t>())
+ << ": Failed to read data from: " << filename;
+ }
+
+ // And copy the data so we have it forever.
+ std::vector<uint8_t> data(data_span.begin() + sizeof(flatbuffers::uoffset_t),
+ data_span.end());
+ return FlatbufferVector<MessageHeader>(std::move(data));
+}
+
MessageReader::MessageReader(std::string_view filename)
: span_reader_(filename),
raw_log_file_header_(FlatbufferVector<LogFileHeader>::Empty()) {