Add remote_boot_uuid to Context

This lets us track which boot a message came from and finally fix the
logger relying on ServerStatistics having all the required information
needed to build up the logfile header.

Change-Id: I17fc4c5718d5d69c7a1e154afdd83b1ccb388a8f
diff --git a/aos/ipc_lib/BUILD b/aos/ipc_lib/BUILD
index 026f866..c24fcee 100644
--- a/aos/ipc_lib/BUILD
+++ b/aos/ipc_lib/BUILD
@@ -175,6 +175,7 @@
         ":data_alignment",
         ":index",
         "//aos:realtime",
+        "//aos:uuid",
         "//aos/time",
         "//aos/util:compiler_memory_barrier",
         "@com_github_google_glog//:glog",
diff --git a/aos/ipc_lib/lockless_queue.cc b/aos/ipc_lib/lockless_queue.cc
index a0c68cb..98701b4 100644
--- a/aos/ipc_lib/lockless_queue.cc
+++ b/aos/ipc_lib/lockless_queue.cc
@@ -908,7 +908,7 @@
     const char *data, size_t length,
     monotonic_clock::time_point monotonic_remote_time,
     realtime_clock::time_point realtime_remote_time,
-    uint32_t remote_queue_index,
+    uint32_t remote_queue_index, const UUID &remote_boot_uuid,
     monotonic_clock::time_point *monotonic_sent_time,
     realtime_clock::time_point *realtime_sent_time, uint32_t *queue_index) {
   CHECK_LE(length, size());
@@ -917,14 +917,14 @@
   // adhere to this convention and place it at the end.
   memcpy((reinterpret_cast<char *>(Data()) + size() - length), data, length);
   return Send(length, monotonic_remote_time, realtime_remote_time,
-              remote_queue_index, monotonic_sent_time,
+              remote_queue_index, remote_boot_uuid, monotonic_sent_time,
               realtime_sent_time, queue_index);
 }
 
 bool LocklessQueueSender::Send(
     size_t length, monotonic_clock::time_point monotonic_remote_time,
     realtime_clock::time_point realtime_remote_time,
-    uint32_t remote_queue_index,
+    uint32_t remote_queue_index, const UUID &remote_boot_uuid,
     monotonic_clock::time_point *monotonic_sent_time,
     realtime_clock::time_point *realtime_sent_time, uint32_t *queue_index) {
   const size_t queue_size = memory_->queue_size();
@@ -949,6 +949,7 @@
   // Pass these through.  Any alternative behavior can be implemented out a
   // layer.
   message->header.remote_queue_index = remote_queue_index;
+  message->header.remote_boot_uuid = remote_boot_uuid;
   message->header.monotonic_remote_time = monotonic_remote_time;
   message->header.realtime_remote_time = realtime_remote_time;
 
@@ -1209,7 +1210,7 @@
     realtime_clock::time_point *realtime_sent_time,
     monotonic_clock::time_point *monotonic_remote_time,
     realtime_clock::time_point *realtime_remote_time,
-    uint32_t *remote_queue_index, size_t *length,
+    uint32_t *remote_queue_index, UUID *remote_boot_uuid, size_t *length,
     char *data) const {
   const size_t queue_size = memory_->queue_size();
 
@@ -1293,6 +1294,7 @@
   }
   *monotonic_remote_time = m->header.monotonic_remote_time;
   *realtime_remote_time = m->header.realtime_remote_time;
+  *remote_boot_uuid = m->header.remote_boot_uuid;
   if (data) {
     memcpy(data, m->data(memory_->message_data_size()),
            memory_->message_data_size());
diff --git a/aos/ipc_lib/lockless_queue.h b/aos/ipc_lib/lockless_queue.h
index 69207f4..41aa0fb 100644
--- a/aos/ipc_lib/lockless_queue.h
+++ b/aos/ipc_lib/lockless_queue.h
@@ -13,6 +13,7 @@
 #include "aos/ipc_lib/data_alignment.h"
 #include "aos/ipc_lib/index.h"
 #include "aos/time/time.h"
+#include "aos/uuid.h"
 
 namespace aos {
 namespace ipc_lib {
@@ -92,6 +93,9 @@
     // Queue index from the remote node.
     uint32_t remote_queue_index;
 
+    // Remote boot UUID for this message.
+    UUID remote_boot_uuid;
+
     size_t length;
   } header;
 
@@ -305,7 +309,7 @@
   void *Data();
   bool Send(size_t length, monotonic_clock::time_point monotonic_remote_time,
             realtime_clock::time_point realtime_remote_time,
-            uint32_t remote_queue_index,
+            uint32_t remote_queue_index, const UUID &remote_boot_uuid,
             monotonic_clock::time_point *monotonic_sent_time = nullptr,
             realtime_clock::time_point *realtime_sent_time = nullptr,
             uint32_t *queue_index = nullptr);
@@ -314,10 +318,10 @@
   bool Send(const char *data, size_t length,
             monotonic_clock::time_point monotonic_remote_time,
             realtime_clock::time_point realtime_remote_time,
-            uint32_t remote_queue_index,
-            monotonic_clock::time_point *monotonic_sent_time,
-            realtime_clock::time_point *realtime_sent_time,
-            uint32_t *queue_index);
+            uint32_t remote_queue_index, const UUID &remote_boot_uuid,
+            monotonic_clock::time_point *monotonic_sent_time = nullptr,
+            realtime_clock::time_point *realtime_sent_time = nullptr,
+            uint32_t *queue_index = nullptr);
 
   int buffer_index() const;
 
@@ -400,7 +404,7 @@
               realtime_clock::time_point *realtime_sent_time,
               monotonic_clock::time_point *monotonic_remote_time,
               realtime_clock::time_point *realtime_remote_time,
-              uint32_t *remote_queue_index,
+              uint32_t *remote_queue_index, UUID *remote_boot_uuid,
               size_t *length, char *data) const;
 
   // Returns the index to the latest queue message.  Returns empty_queue_index()
diff --git a/aos/ipc_lib/lockless_queue_death_test.cc b/aos/ipc_lib/lockless_queue_death_test.cc
index 346f88e..b521d9e 100644
--- a/aos/ipc_lib/lockless_queue_death_test.cc
+++ b/aos/ipc_lib/lockless_queue_death_test.cc
@@ -534,7 +534,7 @@
           char data[100];
           size_t s = snprintf(data, sizeof(data), "foobar%d", i + 1);
           sender.Send(data, s + 1, monotonic_clock::min_time,
-                      realtime_clock::min_time, 0xffffffffl,
+                      realtime_clock::min_time, 0xffffffffl, UUID::Zero(),
                       nullptr, nullptr, nullptr);
           // Pin a message, so when we keep writing we will exercise the pinning
           // logic.
@@ -608,7 +608,7 @@
           char data[100];
           size_t s = snprintf(data, sizeof(data), "foobar%d", 971);
           sender.Send(data, s + 1, monotonic_clock::min_time,
-                      realtime_clock::min_time, 0xffffffffl,
+                      realtime_clock::min_time, 0xffffffffl, UUID::Zero(),
                       nullptr, nullptr, nullptr);
         }
 
@@ -622,13 +622,14 @@
           monotonic_clock::time_point monotonic_remote_time;
           realtime_clock::time_point realtime_remote_time;
           uint32_t remote_queue_index;
+          UUID remote_boot_uuid;
           char read_data[1024];
           size_t length;
 
-          LocklessQueueReader::Result read_result =
-              reader.Read(i, &monotonic_sent_time, &realtime_sent_time,
-                          &monotonic_remote_time, &realtime_remote_time,
-                          &remote_queue_index, &length, &(read_data[0]));
+          LocklessQueueReader::Result read_result = reader.Read(
+              i, &monotonic_sent_time, &realtime_sent_time,
+              &monotonic_remote_time, &realtime_remote_time,
+              &remote_queue_index, &remote_boot_uuid, &length, &(read_data[0]));
 
           if (read_result != LocklessQueueReader::Result::GOOD) {
             if (read_result == LocklessQueueReader::Result::TOO_OLD) {
diff --git a/aos/ipc_lib/lockless_queue_test.cc b/aos/ipc_lib/lockless_queue_test.cc
index c8f3d23..91f995b 100644
--- a/aos/ipc_lib/lockless_queue_test.cc
+++ b/aos/ipc_lib/lockless_queue_test.cc
@@ -239,7 +239,7 @@
     char data[100];
     size_t s = snprintf(data, sizeof(data), "foobar%d", i);
     sender.Send(data, s, monotonic_clock::min_time, realtime_clock::min_time,
-                0xffffffffu, nullptr, nullptr, nullptr);
+                0xffffffffu, UUID::Zero(), nullptr, nullptr, nullptr);
 
     // Confirm that the queue index still makes sense.  This is easier since the
     // empty case has been handled.
@@ -251,6 +251,7 @@
     monotonic_clock::time_point monotonic_remote_time;
     realtime_clock::time_point realtime_remote_time;
     uint32_t remote_queue_index;
+    UUID remote_boot_uuid;
     char read_data[1024];
     size_t length;
 
@@ -260,10 +261,10 @@
     } else {
       index = index.IncrementBy(i - 5);
     }
-    LocklessQueueReader::Result read_result =
-        reader.Read(index.index(), &monotonic_sent_time, &realtime_sent_time,
-                    &monotonic_remote_time, &realtime_remote_time,
-                    &remote_queue_index, &length, &(read_data[0]));
+    LocklessQueueReader::Result read_result = reader.Read(
+        index.index(), &monotonic_sent_time, &realtime_sent_time,
+        &monotonic_remote_time, &realtime_remote_time, &remote_queue_index,
+        &remote_boot_uuid, &length, &(read_data[0]));
 
     // This should either return GOOD, or TOO_OLD if it is before the start of
     // the queue.
diff --git a/aos/ipc_lib/queue_racer.cc b/aos/ipc_lib/queue_racer.cc
index afd4135..cf46807 100644
--- a/aos/ipc_lib/queue_racer.cc
+++ b/aos/ipc_lib/queue_racer.cc
@@ -178,7 +178,7 @@
 
         ++started_writes_;
         sender.Send(sizeof(ThreadPlusCount), aos::monotonic_clock::min_time,
-                    aos::realtime_clock::min_time, 0xffffffff,
+                    aos::realtime_clock::min_time, 0xffffffff, UUID::Zero(),
                     nullptr, nullptr, nullptr);
         // Blank out the new scratch buffer, to catch other people using it.
         {
@@ -267,6 +267,7 @@
     realtime_clock::time_point realtime_sent_time;
     monotonic_clock::time_point monotonic_remote_time;
     realtime_clock::time_point realtime_remote_time;
+    UUID remote_boot_uuid;
     uint32_t remote_queue_index;
     size_t length;
     char read_data[1024];
@@ -275,10 +276,10 @@
     const uint32_t wrapped_i =
         i % static_cast<size_t>(QueueIndex::MaxIndex(
                 0xffffffffu, LocklessQueueSize(queue_.memory())));
-    LocklessQueueReader::Result read_result =
-        reader.Read(wrapped_i, &monotonic_sent_time, &realtime_sent_time,
-                    &monotonic_remote_time, &realtime_remote_time,
-                    &remote_queue_index, &length, &(read_data[0]));
+    LocklessQueueReader::Result read_result = reader.Read(
+        wrapped_i, &monotonic_sent_time, &realtime_sent_time,
+        &monotonic_remote_time, &realtime_remote_time, &remote_queue_index,
+        &remote_boot_uuid, &length, &(read_data[0]));
 
     if (race_reads) {
       if (read_result == LocklessQueueReader::Result::NOTHING_NEW) {
@@ -301,6 +302,7 @@
 
     EXPECT_EQ(monotonic_remote_time, aos::monotonic_clock::min_time);
     EXPECT_EQ(realtime_remote_time, aos::realtime_clock::min_time);
+    EXPECT_EQ(remote_boot_uuid, UUID::Zero());
 
     ThreadPlusCount tpc;
     ASSERT_EQ(length, sizeof(ThreadPlusCount));