Handle empty and corrupted log parts.
We used to crash. Now, sort them as "corrupted", and also use what we
can extract.
Corrupted files come from unsafe shutdowns. It is impractical to be
perfect and never have any.
Change-Id: I68acc05d482c484f17ad335f4ab2054e180d8a37
diff --git a/aos/events/logging/logfile_utils.cc b/aos/events/logging/logfile_utils.cc
index 6b7a598..1c42e17 100644
--- a/aos/events/logging/logfile_utils.cc
+++ b/aos/events/logging/logfile_utils.cc
@@ -348,13 +348,15 @@
return true;
}
-FlatbufferVector<LogFileHeader> ReadHeader(std::string_view filename) {
+std::optional<FlatbufferVector<LogFileHeader>> ReadHeader(
+ std::string_view filename) {
SpanReader span_reader(filename);
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;
+ if (config_data == absl::Span<const uint8_t>()) {
+ return std::nullopt;
+ }
// And copy the config so we have it forever, removing the size prefix.
ResizeableBuffer data;
@@ -364,16 +366,17 @@
return FlatbufferVector<LogFileHeader>(std::move(data));
}
-FlatbufferVector<MessageHeader> ReadNthMessage(std::string_view filename,
- size_t n) {
+std::optional<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;
+ if (data_span == absl::Span<const uint8_t>()) {
+ return std::nullopt;
+ }
}
// And copy the config so we have it forever, removing the size prefix.