Rotate log files when the remote reboots
Add a logger_boot_uuid to track the difference between the logger node's
and the remote node's boot uuids, and also a logger start time. This
gives us enough information to enforce only 1 boot per node, and to also
detect which log came first if a node rebooted. Order detection isn't
used today, but before we generate more logs, we should fix the issue.
Also, enforce one boot per node when replaying. We don't manage
timestamps well enough to do anything else.
Change-Id: Ib5ba9f881a2c17d05b143e38ee20a209553acca8
diff --git a/aos/events/logging/log_namer.cc b/aos/events/logging/log_namer.cc
index ec60143..a73be9b 100644
--- a/aos/events/logging/log_namer.cc
+++ b/aos/events/logging/log_namer.cc
@@ -50,6 +50,11 @@
UpdateHeader(header, uuid_, part_number_);
data_writer_->QueueSpan(header->span());
}
+void LocalLogNamer::Reboot(
+ const Node * /*node*/,
+ aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> * /*header*/) {
+ LOG(FATAL) << "Can't reboot a single node.";
+}
DetachedBufferWriter *LocalLogNamer::MakeTimestampWriter(
const Channel *channel) {
@@ -104,8 +109,23 @@
void MultiNodeLogNamer::Rotate(
const Node *node,
aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> *header) {
+ DoRotate(node, header, false);
+}
+
+void MultiNodeLogNamer::Reboot(
+ const Node *node,
+ aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> *header) {
+ DoRotate(node, header, true);
+}
+
+void MultiNodeLogNamer::DoRotate(
+ const Node *node,
+ aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> *header, bool reboot) {
if (node == this->node()) {
if (data_writer_.writer) {
+ if (reboot) {
+ data_writer_.uuid = UUID::Random();
+ }
++data_writer_.part_number;
}
OpenDataWriter();
@@ -115,6 +135,9 @@
for (std::pair<const Channel *const, DataWriter> &data_writer :
data_writers_) {
if (node == data_writer.second.node) {
+ if (reboot) {
+ data_writer.second.uuid = UUID::Random();
+ }
++data_writer.second.part_number;
data_writer.second.rotate(data_writer.first, &data_writer.second);
UpdateHeader(header, data_writer.second.uuid,