blob: 1ab45a7e34fdce5b2da323dcdf1414c1da8453bf [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/developer/forensics/feedback/attachments/previous_boot_log.h"
#include <lib/async/cpp/task.h>
#include <lib/fpromise/promise.h>
#include <string>
#include "src/lib/files/path.h"
namespace forensics::feedback {
PreviousBootLog::PreviousBootLog(async_dispatcher_t* dispatcher, timekeeper::Clock* clock,
const std::optional<zx::duration> delete_previous_boot_log_at,
std::string path)
: FileBackedProvider(path),
dispatcher_(dispatcher),
clock_(clock),
is_file_deleted_(false),
path_(std::move(path)) {
if (!delete_previous_boot_log_at.has_value()) {
return;
}
delete_previous_boot_log_at_ = zx::time_boot(0) + *delete_previous_boot_log_at;
// The previous boot logs will eventually be lazily deleted, but we should still try to
// proactively delete them to save space.
auto self = weak_factory_.GetWeakPtr();
async::PostDelayedTask(
dispatcher_,
[self] {
if (self && !self->is_file_deleted_) {
FX_LOGS(INFO) << "Deleting previous boot logs after 24 hours of device runtime";
self->is_file_deleted_ = true;
files::DeletePath(self->path_, /*recursive=*/true);
}
},
// The previous boot logs are proactively deleted after |delete_previous_boot_log_at| of
// device runtime, not component runtime.
zx::time_monotonic(0) + *delete_previous_boot_log_at - clock_->MonotonicNow());
}
::fpromise::promise<AttachmentValue> PreviousBootLog::Get(const uint64_t ticket) {
// Lazily check if the previous boot log should be deleted because we have no easy way to schedule
// async work based on the boot clock.
if (!is_file_deleted_ && delete_previous_boot_log_at_.has_value() &&
(clock_->BootNow() >= *delete_previous_boot_log_at_)) {
FX_LOGS(INFO) << "Lazily deleting previous boot logs after 24 hours of device uptime";
is_file_deleted_ = true;
files::DeletePath(path_, /*recursive=*/true);
}
if (is_file_deleted_) {
return fpromise::make_ok_promise(AttachmentValue(Error::kCustom));
}
return FileBackedProvider::Get(ticket);
}
} // namespace forensics::feedback