blob: 166e5052530fe937d6dd591ce40bca6b8e2fb93b [file] [log] [blame]
Austin Schuhcb5601b2020-09-10 15:29:59 -07001#include "aos/events/logging/log_namer.h"
2
3#include <functional>
4#include <map>
5#include <memory>
6#include <string_view>
7#include <vector>
8
9#include "absl/strings/str_cat.h"
10#include "aos/events/logging/logfile_utils.h"
11#include "aos/events/logging/logger_generated.h"
Austin Schuh4385b142021-03-14 21:31:13 -070012#include "aos/uuid.h"
Austin Schuhcb5601b2020-09-10 15:29:59 -070013#include "flatbuffers/flatbuffers.h"
14#include "glog/logging.h"
15
16namespace aos {
17namespace logger {
18
19void LogNamer::UpdateHeader(
20 aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> *header,
21 const UUID &uuid, int parts_index) const {
22 header->mutable_message()->mutate_parts_index(parts_index);
Austin Schuh5e2bfb82021-03-13 22:46:55 -080023 CHECK_EQ(UUID::kStringSize,
Austin Schuhcb5601b2020-09-10 15:29:59 -070024 header->mutable_message()->mutable_parts_uuid()->size());
Austin Schuh5e2bfb82021-03-13 22:46:55 -080025 uuid.CopyTo(reinterpret_cast<char *>(
26 header->mutable_message()->mutable_parts_uuid()->Data()));
Austin Schuhcb5601b2020-09-10 15:29:59 -070027}
28
29void LocalLogNamer::WriteHeader(
30 aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> *header,
31 const Node *node) {
32 CHECK_EQ(node, this->node());
Austin Schuhb8bca732021-07-30 22:32:00 -070033 UpdateHeader(header, data_writer_.uuid(), data_writer_.part_number);
34 data_writer_.writer->QueueSpan(header->span());
Austin Schuhcb5601b2020-09-10 15:29:59 -070035}
36
Austin Schuhb8bca732021-07-30 22:32:00 -070037NewDataWriter *LocalLogNamer::MakeWriter(const Channel *channel) {
Austin Schuhdf576472020-10-19 09:39:37 -070038 CHECK(configuration::ChannelIsSendableOnNode(channel, node()))
39 << ": " << configuration::CleanedChannelToString(channel);
Austin Schuhb8bca732021-07-30 22:32:00 -070040 return &data_writer_;
Austin Schuhcb5601b2020-09-10 15:29:59 -070041}
42
43void LocalLogNamer::Rotate(
44 const Node *node,
45 aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> *header) {
46 CHECK(node == this->node());
Austin Schuhb8bca732021-07-30 22:32:00 -070047 data_writer_.Rotate();
48 UpdateHeader(header, data_writer_.uuid(), data_writer_.part_number);
49 data_writer_.writer->QueueSpan(header->span());
Austin Schuhcb5601b2020-09-10 15:29:59 -070050}
Austin Schuh8c399962020-12-25 21:51:45 -080051
52void LocalLogNamer::WriteConfiguration(
53 aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> *header,
54 std::string_view config_sha256) {
55 const std::string filename = absl::StrCat(base_name_, config_sha256, ".bfbs");
56
57 std::unique_ptr<DetachedBufferWriter> writer =
58 std::make_unique<DetachedBufferWriter>(
59 filename, std::make_unique<aos::logger::DummyEncoder>());
60 writer->QueueSizedFlatbuffer(header->Release());
61}
62
Austin Schuh315b96b2020-12-11 21:21:12 -080063void LocalLogNamer::Reboot(
64 const Node * /*node*/,
65 aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> * /*header*/) {
66 LOG(FATAL) << "Can't reboot a single node.";
67}
Austin Schuhcb5601b2020-09-10 15:29:59 -070068
Austin Schuhb8bca732021-07-30 22:32:00 -070069NewDataWriter *LocalLogNamer::MakeTimestampWriter(const Channel *channel) {
Austin Schuhcb5601b2020-09-10 15:29:59 -070070 CHECK(configuration::ChannelIsReadableOnNode(channel, node_))
71 << ": Message is not delivered to this node.";
72 CHECK(node_ != nullptr) << ": Can't log timestamps in a single node world";
73 CHECK(configuration::ConnectionDeliveryTimeIsLoggedOnNode(channel, node_,
74 node_))
75 << ": Delivery times aren't logged for this channel on this node.";
Austin Schuhb8bca732021-07-30 22:32:00 -070076 return &data_writer_;
Austin Schuhcb5601b2020-09-10 15:29:59 -070077}
78
Austin Schuhb8bca732021-07-30 22:32:00 -070079NewDataWriter *LocalLogNamer::MakeForwardedTimestampWriter(
Austin Schuhcb5601b2020-09-10 15:29:59 -070080 const Channel * /*channel*/, const Node * /*node*/) {
81 LOG(FATAL) << "Can't log forwarded timestamps in a singe log file.";
82 return nullptr;
83}
84
85MultiNodeLogNamer::MultiNodeLogNamer(std::string_view base_name,
86 const Configuration *configuration,
Brian Silvermancb805822020-10-06 17:43:35 -070087 const Node *node)
Austin Schuh6bb8a822021-03-31 23:04:39 -070088 : LogNamer(node),
89 base_name_(base_name),
90 old_base_name_(),
91 configuration_(configuration) {}
Austin Schuhcb5601b2020-09-10 15:29:59 -070092
Brian Silverman48deab12020-09-30 18:39:28 -070093MultiNodeLogNamer::~MultiNodeLogNamer() {
94 if (!ran_out_of_space_) {
95 // This handles renaming temporary files etc.
96 Close();
97 }
98}
99
Austin Schuhcb5601b2020-09-10 15:29:59 -0700100void MultiNodeLogNamer::WriteHeader(
101 aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> *header,
102 const Node *node) {
103 if (node == this->node()) {
Austin Schuhb8bca732021-07-30 22:32:00 -0700104 if (!data_writer_) {
Brian Silvermancb805822020-10-06 17:43:35 -0700105 OpenDataWriter();
106 }
Austin Schuhb8bca732021-07-30 22:32:00 -0700107 UpdateHeader(header, data_writer_->uuid(), data_writer_->part_number);
108 data_writer_->writer->QueueSpan(header->span());
Austin Schuhcb5601b2020-09-10 15:29:59 -0700109 } else {
Austin Schuhb8bca732021-07-30 22:32:00 -0700110 for (std::pair<const Channel *const, NewDataWriter> &data_writer :
Austin Schuhcb5601b2020-09-10 15:29:59 -0700111 data_writers_) {
112 if (node == data_writer.second.node) {
Austin Schuhb8bca732021-07-30 22:32:00 -0700113 UpdateHeader(header, data_writer.second.uuid(),
Austin Schuhcb5601b2020-09-10 15:29:59 -0700114 data_writer.second.part_number);
Austin Schuhadd6eb32020-11-09 21:24:26 -0800115 data_writer.second.writer->QueueSpan(header->span());
Austin Schuhcb5601b2020-09-10 15:29:59 -0700116 }
117 }
118 }
119}
120
121void MultiNodeLogNamer::Rotate(
122 const Node *node,
123 aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> *header) {
Austin Schuh315b96b2020-12-11 21:21:12 -0800124 DoRotate(node, header, false);
125}
126
127void MultiNodeLogNamer::Reboot(
128 const Node *node,
129 aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> *header) {
130 DoRotate(node, header, true);
131}
132
133void MultiNodeLogNamer::DoRotate(
134 const Node *node,
Austin Schuh8c399962020-12-25 21:51:45 -0800135 aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> *header,
136 bool reboot) {
Austin Schuhcb5601b2020-09-10 15:29:59 -0700137 if (node == this->node()) {
Austin Schuhb8bca732021-07-30 22:32:00 -0700138 if (data_writer_) {
Austin Schuh315b96b2020-12-11 21:21:12 -0800139 if (reboot) {
Austin Schuhb8bca732021-07-30 22:32:00 -0700140 data_writer_->Reboot();
141 } else {
142 data_writer_->Rotate();
Austin Schuh315b96b2020-12-11 21:21:12 -0800143 }
Austin Schuhb8bca732021-07-30 22:32:00 -0700144 // TODO(austin): Move this logic down once we have a better ownership
145 // model for the header.
146 UpdateHeader(header, data_writer_->uuid(), data_writer_->part_number);
147 data_writer_->writer->QueueSpan(header->span());
Brian Silvermancb805822020-10-06 17:43:35 -0700148 }
Austin Schuhcb5601b2020-09-10 15:29:59 -0700149 } else {
Austin Schuhb8bca732021-07-30 22:32:00 -0700150 for (std::pair<const Channel *const, NewDataWriter> &data_writer :
Austin Schuhcb5601b2020-09-10 15:29:59 -0700151 data_writers_) {
152 if (node == data_writer.second.node) {
Austin Schuh315b96b2020-12-11 21:21:12 -0800153 if (reboot) {
Austin Schuhb8bca732021-07-30 22:32:00 -0700154 data_writer.second.Reboot();
155 } else {
156 data_writer.second.Rotate();
Austin Schuh315b96b2020-12-11 21:21:12 -0800157 }
Austin Schuhb8bca732021-07-30 22:32:00 -0700158 UpdateHeader(header, data_writer.second.uuid(),
Austin Schuhcb5601b2020-09-10 15:29:59 -0700159 data_writer.second.part_number);
Austin Schuhadd6eb32020-11-09 21:24:26 -0800160 data_writer.second.writer->QueueSpan(header->span());
Austin Schuhcb5601b2020-09-10 15:29:59 -0700161 }
162 }
163 }
164}
165
Austin Schuh8c399962020-12-25 21:51:45 -0800166void MultiNodeLogNamer::WriteConfiguration(
167 aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> *header,
168 std::string_view config_sha256) {
169 if (ran_out_of_space_) {
170 return;
171 }
172
173 const std::string_view separator = base_name_.back() == '/' ? "" : "_";
174 const std::string filename = absl::StrCat(
175 base_name_, separator, config_sha256, ".bfbs", extension_, temp_suffix_);
176
177 std::unique_ptr<DetachedBufferWriter> writer =
178 std::make_unique<DetachedBufferWriter>(filename, encoder_factory_());
179
180 writer->QueueSizedFlatbuffer(header->Release());
181
182 if (!writer->ran_out_of_space()) {
183 all_filenames_.emplace_back(filename);
184 }
185 CloseWriter(&writer);
186}
187
Austin Schuhb8bca732021-07-30 22:32:00 -0700188NewDataWriter *MultiNodeLogNamer::MakeWriter(const Channel *channel) {
Austin Schuhcb5601b2020-09-10 15:29:59 -0700189 // See if we can read the data on this node at all.
190 const bool is_readable =
191 configuration::ChannelIsReadableOnNode(channel, this->node());
192 if (!is_readable) {
193 return nullptr;
194 }
195
196 // Then, see if we are supposed to log the data here.
197 const bool log_message =
198 configuration::ChannelMessageIsLoggedOnNode(channel, this->node());
199
200 if (!log_message) {
201 return nullptr;
202 }
203
204 // Now, sort out if this is data generated on this node, or not. It is
205 // generated if it is sendable on this node.
206 if (configuration::ChannelIsSendableOnNode(channel, this->node())) {
Austin Schuhb8bca732021-07-30 22:32:00 -0700207 if (!data_writer_) {
Brian Silvermancb805822020-10-06 17:43:35 -0700208 OpenDataWriter();
209 }
Austin Schuhb8bca732021-07-30 22:32:00 -0700210 return data_writer_.get();
Austin Schuhcb5601b2020-09-10 15:29:59 -0700211 }
212
213 // Ok, we have data that is being forwarded to us that we are supposed to
214 // log. It needs to be logged with send timestamps, but be sorted enough
215 // to be able to be processed.
216 CHECK(data_writers_.find(channel) == data_writers_.end());
217
218 // Track that this node is being logged.
219 const Node *source_node = configuration::GetNode(
220 configuration_, channel->source_node()->string_view());
221
222 if (std::find(nodes_.begin(), nodes_.end(), source_node) == nodes_.end()) {
223 nodes_.emplace_back(source_node);
224 }
225
Austin Schuhb8bca732021-07-30 22:32:00 -0700226 NewDataWriter data_writer(
227 [this, channel](NewDataWriter *data_writer) {
228 OpenWriter(channel, data_writer);
229 },
230 [this](NewDataWriter *data_writer) {
231 CloseWriter(&data_writer->writer);
232 });
Austin Schuhcb5601b2020-09-10 15:29:59 -0700233 data_writer.node = source_node;
Austin Schuhcb5601b2020-09-10 15:29:59 -0700234
Austin Schuhb8bca732021-07-30 22:32:00 -0700235 return &(
236 data_writers_.emplace(channel, std::move(data_writer)).first->second);
Austin Schuhcb5601b2020-09-10 15:29:59 -0700237}
238
Austin Schuhb8bca732021-07-30 22:32:00 -0700239NewDataWriter *MultiNodeLogNamer::MakeForwardedTimestampWriter(
Austin Schuhcb5601b2020-09-10 15:29:59 -0700240 const Channel *channel, const Node *node) {
241 // See if we can read the data on this node at all.
242 const bool is_readable =
243 configuration::ChannelIsReadableOnNode(channel, this->node());
244 CHECK(is_readable) << ": " << configuration::CleanedChannelToString(channel);
245
246 CHECK(data_writers_.find(channel) == data_writers_.end());
247
248 if (std::find(nodes_.begin(), nodes_.end(), node) == nodes_.end()) {
249 nodes_.emplace_back(node);
250 }
251
Austin Schuhb8bca732021-07-30 22:32:00 -0700252 NewDataWriter data_writer(
253 [this, channel](NewDataWriter *data_writer) {
254 OpenForwardedTimestampWriter(channel, data_writer);
255 },
256 [this](NewDataWriter *data_writer) {
257 CloseWriter(&data_writer->writer);
258 });
Austin Schuhcb5601b2020-09-10 15:29:59 -0700259 data_writer.node = node;
Austin Schuhcb5601b2020-09-10 15:29:59 -0700260
Austin Schuhb8bca732021-07-30 22:32:00 -0700261 return &(
262 data_writers_.emplace(channel, std::move(data_writer)).first->second);
Austin Schuhcb5601b2020-09-10 15:29:59 -0700263}
264
Austin Schuhb8bca732021-07-30 22:32:00 -0700265NewDataWriter *MultiNodeLogNamer::MakeTimestampWriter(const Channel *channel) {
Brian Silverman0465fcf2020-09-24 00:29:18 -0700266 bool log_delivery_times = false;
267 if (this->node() != nullptr) {
268 log_delivery_times = configuration::ConnectionDeliveryTimeIsLoggedOnNode(
269 channel, this->node(), this->node());
270 }
Austin Schuhcb5601b2020-09-10 15:29:59 -0700271 if (!log_delivery_times) {
272 return nullptr;
273 }
274
Austin Schuhb8bca732021-07-30 22:32:00 -0700275 if (!data_writer_) {
Brian Silvermancb805822020-10-06 17:43:35 -0700276 OpenDataWriter();
277 }
Austin Schuhb8bca732021-07-30 22:32:00 -0700278 return data_writer_.get();
Austin Schuhcb5601b2020-09-10 15:29:59 -0700279}
280
Brian Silverman0465fcf2020-09-24 00:29:18 -0700281void MultiNodeLogNamer::Close() {
Austin Schuhb8bca732021-07-30 22:32:00 -0700282 data_writers_.clear();
283 data_writer_.reset();
Brian Silvermancb805822020-10-06 17:43:35 -0700284}
285
286void MultiNodeLogNamer::ResetStatistics() {
Austin Schuhb8bca732021-07-30 22:32:00 -0700287 for (std::pair<const Channel *const, NewDataWriter> &data_writer :
Brian Silvermancb805822020-10-06 17:43:35 -0700288 data_writers_) {
Austin Schuhad0cfc32020-12-21 12:34:26 -0800289 if (!data_writer.second.writer) continue;
Brian Silvermancb805822020-10-06 17:43:35 -0700290 data_writer.second.writer->ResetStatistics();
Brian Silverman0465fcf2020-09-24 00:29:18 -0700291 }
Austin Schuhb8bca732021-07-30 22:32:00 -0700292 if (data_writer_) {
293 data_writer_->writer->ResetStatistics();
Brian Silvermancb805822020-10-06 17:43:35 -0700294 }
295 max_write_time_ = std::chrono::nanoseconds::zero();
296 max_write_time_bytes_ = -1;
297 max_write_time_messages_ = -1;
298 total_write_time_ = std::chrono::nanoseconds::zero();
299 total_write_count_ = 0;
300 total_write_messages_ = 0;
301 total_write_bytes_ = 0;
Brian Silverman0465fcf2020-09-24 00:29:18 -0700302}
303
Austin Schuhb8bca732021-07-30 22:32:00 -0700304void MultiNodeLogNamer::OpenForwardedTimestampWriter(
305 const Channel *channel, NewDataWriter *data_writer) {
Austin Schuhcb5601b2020-09-10 15:29:59 -0700306 std::string filename =
Austin Schuhe715eae2020-10-10 15:39:30 -0700307 absl::StrCat("timestamps", channel->name()->string_view(), "/",
Brian Silvermana621f522020-09-30 16:52:43 -0700308 channel->type()->string_view(), ".part",
Brian Silverman1b071eb2020-10-09 12:24:10 -0700309 data_writer->part_number, ".bfbs", extension_);
Brian Silverman0465fcf2020-09-24 00:29:18 -0700310 CreateBufferWriter(filename, &data_writer->writer);
Austin Schuhcb5601b2020-09-10 15:29:59 -0700311}
312
313void MultiNodeLogNamer::OpenWriter(const Channel *channel,
Austin Schuhb8bca732021-07-30 22:32:00 -0700314 NewDataWriter *data_writer) {
Austin Schuhcb5601b2020-09-10 15:29:59 -0700315 const std::string filename = absl::StrCat(
Austin Schuhe715eae2020-10-10 15:39:30 -0700316 CHECK_NOTNULL(channel->source_node())->string_view(), "_data",
Brian Silvermana621f522020-09-30 16:52:43 -0700317 channel->name()->string_view(), "/", channel->type()->string_view(),
Brian Silvermancb805822020-10-06 17:43:35 -0700318 ".part", data_writer->part_number, ".bfbs", extension_);
Brian Silverman0465fcf2020-09-24 00:29:18 -0700319 CreateBufferWriter(filename, &data_writer->writer);
Austin Schuhcb5601b2020-09-10 15:29:59 -0700320}
321
Brian Silvermana621f522020-09-30 16:52:43 -0700322void MultiNodeLogNamer::OpenDataWriter() {
Austin Schuhb8bca732021-07-30 22:32:00 -0700323 if (!data_writer_) {
324 data_writer_ = std::make_unique<NewDataWriter>(
325 [this](NewDataWriter *writer) {
326 std::string name;
327 if (node() != nullptr) {
328 name = absl::StrCat(name, node()->name()->string_view(), "_");
329 }
330 absl::StrAppend(&name, "data.part", writer->part_number, ".bfbs",
331 extension_);
332 CreateBufferWriter(name, &writer->writer);
333 },
334 [this](NewDataWriter *data_writer) {
335 CloseWriter(&data_writer->writer);
336 });
Brian Silverman7af8c902020-09-29 16:14:04 -0700337 }
Austin Schuhcb5601b2020-09-10 15:29:59 -0700338}
339
Brian Silverman0465fcf2020-09-24 00:29:18 -0700340void MultiNodeLogNamer::CreateBufferWriter(
Brian Silvermana621f522020-09-30 16:52:43 -0700341 std::string_view path, std::unique_ptr<DetachedBufferWriter> *destination) {
Brian Silverman0465fcf2020-09-24 00:29:18 -0700342 if (ran_out_of_space_) {
343 // Refuse to open any new files, which might skip data. Any existing files
344 // are in the same folder, which means they're on the same filesystem, which
345 // means they're probably going to run out of space and get stuck too.
Austin Schuha426f1f2021-03-31 22:27:41 -0700346 if (!destination->get()) {
347 // But avoid leaving a nullptr writer if we're out of space when
348 // attempting to open the first file.
349 *destination = std::make_unique<DetachedBufferWriter>(
350 DetachedBufferWriter::already_out_of_space_t());
351 }
Brian Silverman0465fcf2020-09-24 00:29:18 -0700352 return;
353 }
Austin Schuhe715eae2020-10-10 15:39:30 -0700354 const std::string_view separator = base_name_.back() == '/' ? "" : "_";
355 const std::string filename =
356 absl::StrCat(base_name_, separator, path, temp_suffix_);
Brian Silverman0465fcf2020-09-24 00:29:18 -0700357 if (!destination->get()) {
Brian Silvermana9f2ec92020-10-06 18:00:53 -0700358 if (ran_out_of_space_) {
359 *destination = std::make_unique<DetachedBufferWriter>(
360 DetachedBufferWriter::already_out_of_space_t());
361 return;
362 }
Brian Silvermancb805822020-10-06 17:43:35 -0700363 *destination =
364 std::make_unique<DetachedBufferWriter>(filename, encoder_factory_());
Brian Silvermana9f2ec92020-10-06 18:00:53 -0700365 if (!destination->get()->ran_out_of_space()) {
366 all_filenames_.emplace_back(path);
367 }
Brian Silverman0465fcf2020-09-24 00:29:18 -0700368 return;
369 }
Brian Silvermancb805822020-10-06 17:43:35 -0700370
371 CloseWriter(destination);
372 if (ran_out_of_space_) {
Brian Silvermana9f2ec92020-10-06 18:00:53 -0700373 *destination->get() =
374 DetachedBufferWriter(DetachedBufferWriter::already_out_of_space_t());
Brian Silverman0465fcf2020-09-24 00:29:18 -0700375 return;
376 }
Brian Silvermana9f2ec92020-10-06 18:00:53 -0700377
Brian Silvermancb805822020-10-06 17:43:35 -0700378 *destination->get() = DetachedBufferWriter(filename, encoder_factory_());
Brian Silvermana9f2ec92020-10-06 18:00:53 -0700379 if (!destination->get()->ran_out_of_space()) {
380 all_filenames_.emplace_back(path);
381 }
Brian Silverman0465fcf2020-09-24 00:29:18 -0700382}
383
Brian Silverman48deab12020-09-30 18:39:28 -0700384void MultiNodeLogNamer::RenameTempFile(DetachedBufferWriter *destination) {
385 if (temp_suffix_.empty()) {
386 return;
387 }
Austin Schuh6bb8a822021-03-31 23:04:39 -0700388 std::string current_filename = std::string(destination->filename());
Brian Silverman48deab12020-09-30 18:39:28 -0700389 CHECK(current_filename.size() > temp_suffix_.size());
Austin Schuh6bb8a822021-03-31 23:04:39 -0700390 std::string final_filename =
Brian Silverman48deab12020-09-30 18:39:28 -0700391 current_filename.substr(0, current_filename.size() - temp_suffix_.size());
Austin Schuh6bb8a822021-03-31 23:04:39 -0700392 int result = rename(current_filename.c_str(), final_filename.c_str());
393
394 // When changing the base name, we rename the log folder while there active
395 // buffer writers. Therefore, the name of that active buffer may still refer
396 // to the old file location rather than the new one. This minimized changes to
397 // existing code.
398 if (result != 0 && errno != ENOSPC && !old_base_name_.empty()) {
399 auto offset = current_filename.find(old_base_name_);
400 if (offset != std::string::npos) {
401 current_filename.replace(offset, old_base_name_.length(), base_name_);
402 }
403 offset = final_filename.find(old_base_name_);
404 if (offset != std::string::npos) {
405 final_filename.replace(offset, old_base_name_.length(), base_name_);
406 }
407 result = rename(current_filename.c_str(), final_filename.c_str());
408 }
409
Brian Silverman48deab12020-09-30 18:39:28 -0700410 if (result != 0) {
411 if (errno == ENOSPC) {
412 ran_out_of_space_ = true;
413 return;
414 } else {
415 PLOG(FATAL) << "Renaming " << current_filename << " to " << final_filename
416 << " failed";
417 }
Austin Schuh6bb8a822021-03-31 23:04:39 -0700418 } else {
419 VLOG(1) << "Renamed " << current_filename << " -> " << final_filename;
Brian Silverman48deab12020-09-30 18:39:28 -0700420 }
421}
422
Brian Silvermancb805822020-10-06 17:43:35 -0700423void MultiNodeLogNamer::CloseWriter(
424 std::unique_ptr<DetachedBufferWriter> *writer_pointer) {
425 DetachedBufferWriter *const writer = writer_pointer->get();
426 if (!writer) {
427 return;
428 }
Brian Silvermana9f2ec92020-10-06 18:00:53 -0700429 const bool was_open = writer->is_open();
Brian Silvermancb805822020-10-06 17:43:35 -0700430 writer->Close();
431
432 if (writer->max_write_time() > max_write_time_) {
433 max_write_time_ = writer->max_write_time();
434 max_write_time_bytes_ = writer->max_write_time_bytes();
435 max_write_time_messages_ = writer->max_write_time_messages();
436 }
437 total_write_time_ += writer->total_write_time();
438 total_write_count_ += writer->total_write_count();
439 total_write_messages_ += writer->total_write_messages();
440 total_write_bytes_ += writer->total_write_bytes();
441
442 if (writer->ran_out_of_space()) {
443 ran_out_of_space_ = true;
444 writer->acknowledge_out_of_space();
445 }
Brian Silvermana9f2ec92020-10-06 18:00:53 -0700446 if (was_open) {
447 RenameTempFile(writer);
448 } else {
449 CHECK(access(std::string(writer->filename()).c_str(), F_OK) == -1)
450 << ": File should not exist: " << writer->filename();
451 }
Brian Silvermancb805822020-10-06 17:43:35 -0700452}
453
Austin Schuhcb5601b2020-09-10 15:29:59 -0700454} // namespace logger
455} // namespace aos