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() {