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));