update_engine_stable_android: Use noreturn am: 5d7a1de410 am: 783be0bd53
Original change: https://android-review.googlesource.com/c/platform/system/update_engine/+/1393752
Change-Id: Ie6ebef43f6276103ad1eb8958c0b28dc6ecd269b
diff --git a/cleanup_previous_update_action.cc b/cleanup_previous_update_action.cc
index dd9a1ca..1a2476f 100644
--- a/cleanup_previous_update_action.cc
+++ b/cleanup_previous_update_action.cc
@@ -345,7 +345,9 @@
return;
}
- if (snapshot_->InitiateMerge()) {
+ uint64_t cow_file_size;
+ if (snapshot_->InitiateMerge(&cow_file_size)) {
+ merge_stats_->set_cow_file_size(cow_file_size);
WaitForMergeOrSchedule();
return;
}
@@ -401,14 +403,22 @@
auto passed_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
result->merge_time());
+
+ bool vab_retrofit = boot_control_->GetDynamicPartitionControl()
+ ->GetVirtualAbFeatureFlag()
+ .IsRetrofit();
+
LOG(INFO) << "Reporting merge stats: "
<< android::snapshot::UpdateState_Name(report.state()) << " in "
<< passed_ms.count() << "ms (resumed " << report.resume_count()
- << " times)";
+ << " times), using " << report.cow_file_size()
+ << " bytes of COW image.";
android::util::stats_write(android::util::SNAPSHOT_MERGE_REPORTED,
static_cast<int32_t>(report.state()),
static_cast<int64_t>(passed_ms.count()),
- static_cast<int32_t>(report.resume_count()));
+ static_cast<int32_t>(report.resume_count()),
+ vab_retrofit,
+ static_cast<int64_t>(report.cow_file_size()));
#endif
}
diff --git a/metrics_reporter_android.cc b/metrics_reporter_android.cc
index 9cef43c..d8fa6e5 100644
--- a/metrics_reporter_android.cc
+++ b/metrics_reporter_android.cc
@@ -22,10 +22,22 @@
#include <string>
#include <android-base/properties.h>
+#include <base/strings/string_util.h>
+#include <fs_mgr.h>
+#include <libdm/dm.h>
+#include <liblp/builder.h>
+#include <liblp/liblp.h>
#include <statslog.h>
#include "update_engine/common/constants.h"
+using android::fs_mgr::GetPartitionGroupName;
+using android::fs_mgr::LpMetadata;
+using android::fs_mgr::MetadataBuilder;
+using android::fs_mgr::ReadMetadata;
+using android::fs_mgr::SlotNumberForSlotSuffix;
+using base::EndsWith;
+
namespace {
// A number offset adds on top of the enum value. e.g. ErrorCode::SUCCESS will
// be reported as 10000, and AttemptResult::UPDATE_CANCELED will be reported as
@@ -58,6 +70,42 @@
metrics::AttemptResult attempt_result,
ErrorCode error_code) {
int64_t payload_size_mib = payload_size / kNumBytesInOneMiB;
+
+ int64_t super_partition_size_bytes = 0;
+ int64_t super_free_space = 0;
+ int64_t slot_size_bytes = 0;
+
+ if (android::base::GetBoolProperty("ro.boot.dynamic_partitions", false)) {
+ uint32_t slot = SlotNumberForSlotSuffix(fs_mgr_get_slot_suffix());
+ auto super_device = fs_mgr_get_super_partition_name();
+ std::unique_ptr<LpMetadata> metadata = ReadMetadata(super_device, slot);
+ if (metadata) {
+ super_partition_size_bytes = GetTotalSuperPartitionSize(*metadata);
+
+ for (const auto& group : metadata->groups) {
+ if (EndsWith(GetPartitionGroupName(group),
+ fs_mgr_get_slot_suffix(),
+ base::CompareCase::SENSITIVE)) {
+ slot_size_bytes += group.maximum_size;
+ }
+ }
+
+ auto metadata_builder = MetadataBuilder::New(*metadata);
+ if (metadata_builder) {
+ auto free_regions = metadata_builder->GetFreeRegions();
+ for (const auto& interval : free_regions) {
+ super_free_space += interval.length();
+ }
+ super_free_space *= android::dm::kSectorSize;
+ } else {
+ LOG(ERROR) << "Cannot create metadata builder.";
+ }
+ } else {
+ LOG(ERROR) << "Could not read dynamic partition metadata for device: "
+ << super_device;
+ }
+ }
+
android::util::stats_write(
android::util::UPDATE_ENGINE_UPDATE_ATTEMPT_REPORTED,
attempt_number,
@@ -67,7 +115,10 @@
payload_size_mib,
GetStatsdEnumValue(static_cast<int32_t>(attempt_result)),
GetStatsdEnumValue(static_cast<int32_t>(error_code)),
- android::base::GetProperty("ro.build.fingerprint", "").c_str());
+ android::base::GetProperty("ro.build.fingerprint", "").c_str(),
+ super_partition_size_bytes,
+ slot_size_bytes,
+ super_free_space);
}
void MetricsReporterAndroid::ReportUpdateAttemptDownloadMetrics(
@@ -100,13 +151,13 @@
android::util::stats_write(
android::util::UPDATE_ENGINE_SUCCESSFUL_UPDATE_REPORTED,
- attempt_count,
+ static_cast<int32_t>(attempt_count),
GetStatsdEnumValue(static_cast<int32_t>(payload_type)),
- payload_size_mib,
- total_bytes_downloaded,
- download_overhead_percentage,
- total_duration.InMinutes(),
- reboot_count);
+ static_cast<int32_t>(payload_size_mib),
+ static_cast<int32_t>(total_bytes_downloaded),
+ static_cast<int32_t>(download_overhead_percentage),
+ static_cast<int32_t>(total_duration.InMinutes()),
+ static_cast<int32_t>(reboot_count));
}
void MetricsReporterAndroid::ReportAbnormallyTerminatedUpdateAttemptMetrics() {