Read all timestamps into RAM where possible when reading logs

There are cases where we fail to buffer far enough in the future to
solve the timestamp problem, or where we end up choosing to buffer until
the end of time to solve the timestamp problem.  These both result in
log reading failures either through CHECKs or OOMs.

Timestamps are tiny.  The existence of timestamp_extractor proves that
we can store the whole timestamp problem in memory relatively easily.
When timestamps are stored in separate files, let's just load them at
the start.

This also adds flags to force this behavior on and off.  When a log with
data and timestamps mixed in it is found, and the flag forces it on, we
will read the data files twice to extract the timestamps the first time.

I'd like to add more tests to logfile_utils_test to test this all
explicitly, but the multinode_logger tests appear to do a really good
job already.

Change-Id: I38e23836afa980e3e3a839125e78e132066e2c90
Signed-off-by: James Kuszmaul <james.kuszmaul@bluerivertech.com>
diff --git a/aos/configuration.h b/aos/configuration.h
index e35c0bf..01b9e7c 100644
--- a/aos/configuration.h
+++ b/aos/configuration.h
@@ -128,6 +128,10 @@
 const Node *GetNodeFromHostname(const Configuration *config,
                                 std::string_view name);
 
+// Returns a printable name for the node.  (singlenode) if we are on a single
+// node system, and the name otherwise.
+std::string_view NodeName(const Configuration *config, size_t node_index);
+
 // Returns a vector of the nodes in the config.  (nullptr is considered the node
 // in a single node world.)
 std::vector<const Node *> GetNodes(const Configuration *config);