blob: 03eb68c98599b7241edb34c913df069538befff9 [file] [log] [blame]
// Copyright 2021 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/crash_reports.h"
#include <fuchsia/feedback/cpp/fidl.h>
#include <lib/zx/clock.h>
#include <zircon/utc.h>
#include <utility>
#include "src/developer/forensics/crash_reports/constants.h"
#include "src/developer/forensics/crash_reports/snapshot_persistence.h"
#include "src/developer/forensics/feedback/constants.h"
namespace forensics::feedback {
namespace {
std::optional<crash_reports::SnapshotPersistence::Root> GetSnapshotRoot(
const std::string& root_dir, std::optional<StorageSize> root_size) {
if (!root_size.has_value()) {
return std::nullopt;
}
return crash_reports::SnapshotPersistence::Root{root_dir, *root_size};
}
} // namespace
CrashReports::CrashReports(async_dispatcher_t* dispatcher,
std::shared_ptr<sys::ServiceDirectory> services,
timekeeper::Clock* clock, inspect::Node* inspect_root,
feedback::AnnotationManager* annotation_manager,
feedback_data::DataProviderInternal* data_provider,
const Options options)
: info_context_(
std::make_shared<crash_reports::InfoContext>(inspect_root, clock, dispatcher, services)),
tags_(),
crash_server_(dispatcher, services, kCrashServerUrl, &tags_, annotation_manager, clock),
report_store_(&tags_, info_context_, annotation_manager,
/*temp_reports_root=*/
crash_reports::ReportStore::Root{crash_reports::kReportStoreTmpPath,
crash_reports::kReportStoreMaxTmpSize},
/*persistent_reports_root=*/
crash_reports::ReportStore::Root{crash_reports::kReportStoreCachePath,
crash_reports::kReportStoreMaxCacheSize},
/*temp_snapshots_root=*/
GetSnapshotRoot(crash_reports::kSnapshotStoreTmpPath,
options.snapshot_persistence_max_tmp_size),
/*persistent_snapshots_root=*/
GetSnapshotRoot(crash_reports::kSnapshotStoreCachePath,
options.snapshot_persistence_max_cache_size),
kGarbageCollectedSnapshotsPath, options.snapshot_store_max_archives_size),
crash_register_(info_context_, kCrashRegisterPath),
crash_reporter_(dispatcher, services, clock, zx::unowned_clock(zx_utc_reference_get()),
info_context_, options.build_type_config, &crash_register_, &tags_,
&crash_server_, &report_store_, data_provider,
options.snapshot_collector_window_duration) {}
fuchsia::feedback::CrashReporter* CrashReports::CrashReporter() { return &crash_reporter_; }
fuchsia::feedback::CrashReportingProductRegister* CrashReports::CrashRegister() {
return &crash_register_;
}
void CrashReports::SetNetworkIsReachable(const bool is_reachable) {
crash_reporter_.SetNetworkIsReachable(is_reachable);
}
void CrashReports::ShutdownImminent() { crash_reporter_.PersistAllCrashReports(); }
} // namespace forensics::feedback