From 874e638f65e3167fde9f483b07e35248143a2a42 Mon Sep 17 00:00:00 2001 From: yuying-y <78829091+yuying-y@users.noreply.github.com> Date: Thu, 30 May 2024 16:29:16 -0700 Subject: [PATCH] Add slot selection status to loader app metrics (#3340) b/331208101 Change-Id: Ic17c4e47aaa5c1c23869e0ce8d5a7a3e69d763ae (cherry picked from commit aee771ddbcc38dee9d1dc3780c1f38f87221cd27) --- cobalt/browser/loader_app_metrics.cc | 7 ++++ starboard/extension/extension_test.cc | 7 +++- starboard/extension/loader_app_metrics.h | 24 +++++++++++- starboard/loader_app/BUILD.gn | 10 +++++ starboard/loader_app/installation_manager.cc | 19 +++++++--- starboard/loader_app/installation_manager.h | 4 +- .../loader_app/installation_manager_test.cc | 9 +++-- starboard/loader_app/loader_app.cc | 4 ++ .../loader_app/record_loader_app_status.cc | 37 +++++++++++++++++++ .../loader_app/record_loader_app_status.h | 31 ++++++++++++++++ starboard/loader_app/slot_management.cc | 30 ++++++++++----- .../loader_app_metrics_test.cc | 2 +- .../shared/starboard/loader_app_metrics.cc | 16 +++++++- .../histograms/metadata/cobalt/enums.xml | 18 +++++++++ .../histograms/metadata/cobalt/histograms.xml | 9 +++++ 15 files changed, 203 insertions(+), 24 deletions(-) create mode 100644 starboard/loader_app/record_loader_app_status.cc create mode 100644 starboard/loader_app/record_loader_app_status.h diff --git a/cobalt/browser/loader_app_metrics.cc b/cobalt/browser/loader_app_metrics.cc index fcff39305fe6..cee78353f713 100644 --- a/cobalt/browser/loader_app_metrics.cc +++ b/cobalt/browser/loader_app_metrics.cc @@ -103,6 +103,13 @@ void RecordLoaderAppMetrics( RecordLoaderAppTimeMetrics(metrics_extension); RecordLoaderAppSpaceMetrics(metrics_extension); } + if (metrics_extension->version >= 3) { + base::UmaHistogramEnumeration( + "Cobalt.LoaderApp.SlotSelectionStatus", + metrics_extension->GetSlotSelectionStatus()); + LOG(INFO) << "Recorded sample for " + << "Cobalt.LoaderApp.SlotSelectionStatus"; + } } } diff --git a/starboard/extension/extension_test.cc b/starboard/extension/extension_test.cc index 551e834860cc..989bb7c94fb2 100644 --- a/starboard/extension/extension_test.cc +++ b/starboard/extension/extension_test.cc @@ -517,7 +517,7 @@ TEST(ExtensionTest, LoaderAppMetrics) { EXPECT_STREQ(extension_api->name, kExtensionName); EXPECT_GE(extension_api->version, 1u); - EXPECT_LE(extension_api->version, 2u); + EXPECT_LE(extension_api->version, 3u); EXPECT_NE(extension_api->SetCrashpadInstallationStatus, nullptr); EXPECT_NE(extension_api->GetCrashpadInstallationStatus, nullptr); @@ -535,6 +535,11 @@ TEST(ExtensionTest, LoaderAppMetrics) { EXPECT_NE(extension_api->GetMaxSampledUsedCpuBytesDuringElfLoad, nullptr); } + if (extension_api->version >= 3) { + EXPECT_NE(extension_api->SetSlotSelectionStatus, nullptr); + EXPECT_NE(extension_api->GetSlotSelectionStatus, nullptr); + } + const ExtensionApi* second_extension_api = static_cast(SbSystemGetExtension(kExtensionName)); EXPECT_EQ(second_extension_api, extension_api) diff --git a/starboard/extension/loader_app_metrics.h b/starboard/extension/loader_app_metrics.h index ea02a956d7cb..d077f7090e6d 100644 --- a/starboard/extension/loader_app_metrics.h +++ b/starboard/extension/loader_app_metrics.h @@ -28,7 +28,7 @@ extern "C" { // numeric values should never be reused. Must be kept in sync with the // corresponding definition in // tools/metrics/histograms/metadata/cobalt/enums.xml. -typedef enum CrashpadInstallationStatus { +typedef enum class CrashpadInstallationStatus { // The enumerators below this point were added in version 1 or later. kUnknown = 0, kSucceeded = 1, @@ -38,6 +38,23 @@ typedef enum CrashpadInstallationStatus { kMaxValue = kFailedSignalHandlerInstallationFailed } CrashpadInstallationStatus; +typedef enum class SlotSelectionStatus { + // The enumerators below this point were added in version 3 or later. + kUnknown = 0, + kCurrentSlot = 1, + kRollForward = 2, + kRollBackOutOfRetries = 3, + kRollBackNoLibFile = 4, + kRollBackBadAppKeyFile = 5, + kRollBackSlotDraining = 6, + kRollBackFailedToAdopt = 7, + kRollBackFailedToLoadCobalt = 8, + kRollBackFailedToCheckSabi = 9, + kRollBackFailedToLookUpSymbols = 10, + kEGLite = 11, + kMaxValue = kEGLite, +} SlotSelectionStatus; + typedef struct StarboardExtensionLoaderAppMetricsApi { // Name should be the string |kStarboardExtensionLoaderAppMetricsName|. // This helps to validate that the extension API is correct. @@ -87,6 +104,11 @@ typedef struct StarboardExtensionLoaderAppMetricsApi { // using RecordUsedCpuBytesDuringElfLoad(), or -1 if no value was recorded. int64_t (*GetMaxSampledUsedCpuBytesDuringElfLoad)(); + // The fields below this point were added in version 3 or later. + + void (*SetSlotSelectionStatus)(SlotSelectionStatus status); + SlotSelectionStatus (*GetSlotSelectionStatus)(); + } StarboardExtensionLoaderAppMetricsApi; #ifdef __cplusplus diff --git a/starboard/loader_app/BUILD.gn b/starboard/loader_app/BUILD.gn index 25ce107fe6e5..bd0789324c5c 100644 --- a/starboard/loader_app/BUILD.gn +++ b/starboard/loader_app/BUILD.gn @@ -29,6 +29,7 @@ if (sb_is_evergreen_compatible && current_toolchain == starboard_toolchain) { ":app_key", ":installation_manager", ":memory_tracker_thread", + ":record_loader_app_status", ":reset_evergreen_update", ":slot_management", "//starboard:starboard_group", @@ -77,6 +78,14 @@ if (sb_is_evergreen_compatible && sb_evergreen_compatible_package && } } +static_library("record_loader_app_status") { + sources = [ + "record_loader_app_status.cc", + "record_loader_app_status.h", + ] + deps = [ "//starboard:starboard_group" ] +} + if (sb_is_evergreen_compatible && current_toolchain == starboard_toolchain) { target(starboard_level_final_executable_type, "loader_app") { build_loader = false @@ -246,6 +255,7 @@ static_library("installation_manager") { deps = [ ":installation_store_proto", ":pending_restart", + ":record_loader_app_status", "//starboard:starboard_group", ] } diff --git a/starboard/loader_app/installation_manager.cc b/starboard/loader_app/installation_manager.cc index 76639688bf88..ecb3869c6658 100644 --- a/starboard/loader_app/installation_manager.cc +++ b/starboard/loader_app/installation_manager.cc @@ -27,12 +27,14 @@ #include "starboard/common/string.h" #include "starboard/configuration_constants.h" #include "starboard/directory.h" +#include "starboard/extension/loader_app_metrics.h" #include "starboard/file.h" #include "starboard/loader_app/installation_store.pb.h" #if !SB_IS(EVERGREEN_COMPATIBLE_LITE) #include "starboard/loader_app/pending_restart.h" // nogncheck #endif // !SB_IS(EVERGREEN_COMPATIBLE_LITE) #include "starboard/common/once.h" +#include "starboard/loader_app/record_loader_app_status.h" #include "starboard/string.h" namespace starboard { @@ -54,7 +56,7 @@ class InstallationManager { int RollForward(int installation_index); int DecrementInstallationNumTries(int installation_index); - int RevertToSuccessfulInstallation(); + int RevertToSuccessfulInstallation(SlotSelectionStatus status); int GetInstallationPath(int installation_index, char* path, int path_length); int GetCurrentInstallationIndex(); int MarkInstallationSuccessful(int installation_index); @@ -299,7 +301,8 @@ int InstallationManager::DecrementInstallationNumTries(int installation_index) { // [x] => [ ] // low [ ] [-] // -int InstallationManager::RevertToSuccessfulInstallation() { +int InstallationManager::RevertToSuccessfulInstallation( + SlotSelectionStatus status) { if (!initialized_) { SB_LOG(ERROR) << "RevertToSuccessfulInstallation: not initialized"; return IM_ERROR; @@ -347,6 +350,7 @@ int InstallationManager::RevertToSuccessfulInstallation() { << DumpInstallationSlots(); if (SaveInstallationStore()) { + RecordSlotSelectionStatus(status); return fallback_installation; } return IM_ERROR; @@ -418,7 +422,12 @@ int InstallationManager::RollForwardInternal(int installation_index) { current_installation_ = installation_index; SB_DLOG(INFO) << "RollForwardInternal: " << DumpInstallationSlots(); - return SaveInstallationStore() ? IM_SUCCESS : IM_ERROR; + + if (SaveInstallationStore()) { + RecordSlotSelectionStatus(SlotSelectionStatus::kRollForward); + return IM_SUCCESS; + } + return IM_ERROR; } // Shift the priority in the inclusive range either up or down based @@ -831,9 +840,9 @@ int ImRollForward(int installation_index) { return g_installation_manager_->RollForward(installation_index); } -int ImRevertToSuccessfulInstallation() { +int ImRevertToSuccessfulInstallation(SlotSelectionStatus status) { starboard::ScopedLock lock(*GetImMutex()); - return g_installation_manager_->RevertToSuccessfulInstallation(); + return g_installation_manager_->RevertToSuccessfulInstallation(status); } int ImRequestRollForwardToInstallation(int installation_index) { diff --git a/starboard/loader_app/installation_manager.h b/starboard/loader_app/installation_manager.h index 8ace1ac348d0..adf2d6796736 100644 --- a/starboard/loader_app/installation_manager.h +++ b/starboard/loader_app/installation_manager.h @@ -15,6 +15,8 @@ #ifndef STARBOARD_LOADER_APP_INSTALLATION_MANAGER_H_ #define STARBOARD_LOADER_APP_INSTALLATION_MANAGER_H_ +#include "starboard/extension/loader_app_metrics.h" + #ifdef __cplusplus extern "C" { #endif @@ -122,7 +124,7 @@ int ImRollForward(int installation_index); // Revert to a previous successful installation. // Returns the installation to which it was reverted. // Returns |IM_ERROR| on error. -int ImRevertToSuccessfulInstallation(); +int ImRevertToSuccessfulInstallation(SlotSelectionStatus status); // Request the installation at |installation_index| to be rolled // forward next time the Loader App tries to load the app. diff --git a/starboard/loader_app/installation_manager_test.cc b/starboard/loader_app/installation_manager_test.cc index fbf394fd28c1..ff6d02ac5f20 100644 --- a/starboard/loader_app/installation_manager_test.cc +++ b/starboard/loader_app/installation_manager_test.cc @@ -21,6 +21,7 @@ #include "starboard/common/file.h" #include "starboard/configuration_constants.h" +#include "starboard/extension/loader_app_metrics.h" #include "starboard/loader_app/installation_store.pb.h" #include "testing/gtest/include/gtest/gtest.h" @@ -146,7 +147,8 @@ class InstallationManagerTest : public ::testing::TestWithParam { SaveStorageState(installation_store); ASSERT_EQ(IM_SUCCESS, ImInitialize(max_num_installations, kAppKey)); - int result = ImRevertToSuccessfulInstallation(); + int result = + ImRevertToSuccessfulInstallation(SlotSelectionStatus::kUnknown); if (!expected_succeed) { ASSERT_EQ(IM_ERROR, result); } @@ -398,7 +400,7 @@ TEST_P(InstallationManagerTest, RevertToSuccessfulInstallation) { ASSERT_EQ(1, ImGetCurrentInstallationIndex()); ASSERT_EQ(IM_SUCCESS, ImMarkInstallationSuccessful(1)); ASSERT_EQ(1, ImGetCurrentInstallationIndex()); - ASSERT_EQ(0, ImRevertToSuccessfulInstallation()); + ASSERT_EQ(0, ImRevertToSuccessfulInstallation(SlotSelectionStatus::kUnknown)); ASSERT_EQ(0, ImGetCurrentInstallationIndex()); } @@ -410,7 +412,8 @@ TEST_F(InstallationManagerTest, InvalidInput) { ASSERT_EQ(IM_INSTALLATION_STATUS_ERROR, ImGetInstallationStatus(10)); ASSERT_EQ(IM_SUCCESS, ImMarkInstallationSuccessful(0)); ASSERT_EQ(IM_INSTALLATION_STATUS_ERROR, ImGetInstallationStatus(-2)); - ASSERT_EQ(IM_ERROR, ImRevertToSuccessfulInstallation()); + ASSERT_EQ(IM_ERROR, + ImRevertToSuccessfulInstallation(SlotSelectionStatus::kUnknown)); ASSERT_EQ(IM_ERROR, ImMarkInstallationSuccessful(10)); ASSERT_EQ(IM_ERROR, ImMarkInstallationSuccessful(-2)); ASSERT_EQ(IM_ERROR, ImDecrementInstallationNumTries(10)); diff --git a/starboard/loader_app/loader_app.cc b/starboard/loader_app/loader_app.cc index 272ec52eefa6..b7af4751e153 100644 --- a/starboard/loader_app/loader_app.cc +++ b/starboard/loader_app/loader_app.cc @@ -26,10 +26,12 @@ #include "starboard/elf_loader/evergreen_info.h" #include "starboard/elf_loader/sabi_string.h" #include "starboard/event.h" +#include "starboard/extension/loader_app_metrics.h" #include "starboard/file.h" #include "starboard/loader_app/app_key.h" #include "starboard/loader_app/loader_app_switches.h" #include "starboard/loader_app/memory_tracker_thread.h" +#include "starboard/loader_app/record_loader_app_status.h" #include "starboard/loader_app/reset_evergreen_update.h" #include "starboard/loader_app/slot_management.h" #include "starboard/loader_app/system_get_extension_shim.h" @@ -259,6 +261,8 @@ void SbEventHandle(const SbEvent* event) { } if (is_evergreen_lite) { + starboard::loader_app::RecordSlotSelectionStatus( + SlotSelectionStatus::kEGLite); LoadLibraryAndInitialize(alternative_content, use_memory_mapped_file); } else { std::string url = diff --git a/starboard/loader_app/record_loader_app_status.cc b/starboard/loader_app/record_loader_app_status.cc new file mode 100644 index 000000000000..12c310433f5c --- /dev/null +++ b/starboard/loader_app/record_loader_app_status.cc @@ -0,0 +1,37 @@ +// Copyright 2024 The Cobalt Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "starboard/loader_app/record_loader_app_status.h" + +#include + +#include "starboard/system.h" + +namespace starboard { +namespace loader_app { + +void RecordSlotSelectionStatus(SlotSelectionStatus status) { + auto metrics_extension = + static_cast( + SbSystemGetExtension(kStarboardExtensionLoaderAppMetricsName)); + if (metrics_extension && + strcmp(metrics_extension->name, + kStarboardExtensionLoaderAppMetricsName) == 0 && + metrics_extension->version >= 3) { + metrics_extension->SetSlotSelectionStatus(status); + } +} + +} // namespace loader_app +} // namespace starboard diff --git a/starboard/loader_app/record_loader_app_status.h b/starboard/loader_app/record_loader_app_status.h new file mode 100644 index 000000000000..8f6ac52f7713 --- /dev/null +++ b/starboard/loader_app/record_loader_app_status.h @@ -0,0 +1,31 @@ +// Copyright 2024 The Cobalt Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef STARBOARD_LOADER_APP_RECORD_LOADER_APP_STATUS_H_ +#define STARBOARD_LOADER_APP_RECORD_LOADER_APP_STATUS_H_ + +#include + +#include "starboard/extension/loader_app_metrics.h" + +namespace starboard { +namespace loader_app { + +// Persist the slot selection status so that it can be read in the Cobalt layer +void RecordSlotSelectionStatus(SlotSelectionStatus status); + +} // namespace loader_app +} // namespace starboard + +#endif // STARBOARD_LOADER_APP_RECORD_LOADER_APP_STATUS_H_ diff --git a/starboard/loader_app/slot_management.cc b/starboard/loader_app/slot_management.cc index 928687e0f259..c576e565ed4c 100644 --- a/starboard/loader_app/slot_management.cc +++ b/starboard/loader_app/slot_management.cc @@ -24,6 +24,7 @@ #include "starboard/elf_loader/elf_loader_constants.h" #include "starboard/elf_loader/sabi_string.h" #include "starboard/event.h" +#include "starboard/extension/loader_app_metrics.h" #include "starboard/file.h" #include "starboard/loader_app/app_key_files.h" #include "starboard/loader_app/drain_file.h" @@ -57,7 +58,8 @@ const char kCobaltContentPath[] = "content"; int RevertBack(int current_installation, const std::string& app_key, - bool mark_bad) { + bool mark_bad, + SlotSelectionStatus status) { SB_LOG(INFO) << "RevertBack current_installation=" << current_installation; SB_DCHECK(current_installation != 0); if (mark_bad) { @@ -82,7 +84,7 @@ int RevertBack(int current_installation, << current_installation; } } - current_installation = ImRevertToSuccessfulInstallation(); + current_installation = ImRevertToSuccessfulInstallation(status); return current_installation; } @@ -163,7 +165,8 @@ void* LoadSlotManagedLibrary(const std::string& app_key, // the current image is not the system image. if (current_installation != 0) { current_installation = - RevertBack(current_installation, app_key, true /* mark_bad */); + RevertBack(current_installation, app_key, true /* mark_bad */, + SlotSelectionStatus::kRollBackOutOfRetries); } } } @@ -181,7 +184,8 @@ void* LoadSlotManagedLibrary(const std::string& app_key, // the current image is not the system image. if (current_installation != 0) { current_installation = - RevertBack(current_installation, app_key, true /* mark_bad */); + RevertBack(current_installation, app_key, true /* mark_bad */, + SlotSelectionStatus::kRollBackNoLibFile); continue; } else { // The system image at index 0 failed. @@ -202,7 +206,8 @@ void* LoadSlotManagedLibrary(const std::string& app_key, if (CheckBadFileExists(installation_path.data(), app_key.c_str())) { SB_LOG(INFO) << "Bad app key file"; current_installation = - RevertBack(current_installation, app_key, true /* mark_bad */); + RevertBack(current_installation, app_key, true /* mark_bad */, + SlotSelectionStatus::kRollBackBadAppKeyFile); continue; } // If the current installation is in use by an updater roll back. @@ -210,7 +215,8 @@ void* LoadSlotManagedLibrary(const std::string& app_key, app_key.c_str())) { SB_LOG(INFO) << "Active slot draining"; current_installation = - RevertBack(current_installation, app_key, false /* mark_bad */); + RevertBack(current_installation, app_key, false /* mark_bad */, + SlotSelectionStatus::kRollBackSlotDraining); continue; } // Adopt installation performed from different app. @@ -218,7 +224,8 @@ void* LoadSlotManagedLibrary(const std::string& app_key, app_key.c_str())) { SB_LOG(INFO) << "Unable to adopt installation"; current_installation = - RevertBack(current_installation, app_key, true /* mark_bad */); + RevertBack(current_installation, app_key, true /* mark_bad */, + SlotSelectionStatus::kRollBackFailedToAdopt); continue; } } @@ -277,7 +284,8 @@ void* LoadSlotManagedLibrary(const std::string& app_key, // the current image is not the system image. if (current_installation != 0) { current_installation = - RevertBack(current_installation, app_key, true /* mark_bad */); + RevertBack(current_installation, app_key, true /* mark_bad */, + SlotSelectionStatus::kRollBackFailedToLoadCobalt); continue; } else { // The system image at index 0 failed. @@ -304,7 +312,8 @@ void* LoadSlotManagedLibrary(const std::string& app_key, // the current image is not the system image. if (current_installation != 0) { current_installation = - RevertBack(current_installation, app_key, true /* mark_bad */); + RevertBack(current_installation, app_key, true /* mark_bad */, + SlotSelectionStatus::kRollBackFailedToCheckSabi); continue; } else { // The system image at index 0 failed. @@ -341,7 +350,8 @@ void* LoadSlotManagedLibrary(const std::string& app_key, // the current image is not the system image. if (current_installation != 0) { current_installation = - RevertBack(current_installation, app_key, true /* mark_bad */); + RevertBack(current_installation, app_key, true /* mark_bad */, + SlotSelectionStatus::kRollBackFailedToLookUpSymbols); continue; } else { // The system image at index 0 failed. diff --git a/starboard/nplb/nplb_evergreen_compat_tests/loader_app_metrics_test.cc b/starboard/nplb/nplb_evergreen_compat_tests/loader_app_metrics_test.cc index f421b53a88a6..07b24b62d23d 100644 --- a/starboard/nplb/nplb_evergreen_compat_tests/loader_app_metrics_test.cc +++ b/starboard/nplb/nplb_evergreen_compat_tests/loader_app_metrics_test.cc @@ -44,7 +44,7 @@ TEST_F(LoaderAppMetricsTest, VerifyLoaderAppMetricsExtension) { // shared implementation of the extension, it's reasonable to expect them to // be on the latest version of the extension API available at the commit from // which this test is built. - ASSERT_EQ(extension->version, 2u); + ASSERT_EQ(extension->version, 3u); } } // namespace diff --git a/starboard/shared/starboard/loader_app_metrics.cc b/starboard/shared/starboard/loader_app_metrics.cc index 388e8c08d85d..c9b831d222a6 100644 --- a/starboard/shared/starboard/loader_app_metrics.cc +++ b/starboard/shared/starboard/loader_app_metrics.cc @@ -36,6 +36,8 @@ static int64_t g_elf_decompression_duration_us = -1; static int64_t g_max_sampled_cpu_bytes_during_elf_load = -1; +static SlotSelectionStatus g_slot_selection_status; + void SetCrashpadInstallationStatus(CrashpadInstallationStatus status) { g_crashpad_installation_status = status; } @@ -78,9 +80,17 @@ int64_t GetMaxSampledUsedCpuBytesDuringElfLoad() { return g_max_sampled_cpu_bytes_during_elf_load; } +void SetSlotSelectionStatus(SlotSelectionStatus status) { + g_slot_selection_status = status; +} + +SlotSelectionStatus GetSlotSelectionStatus() { + return g_slot_selection_status; +} + const StarboardExtensionLoaderAppMetricsApi kLoaderAppMetricsApi = { kStarboardExtensionLoaderAppMetricsName, - 2, + 3, &SetCrashpadInstallationStatus, &GetCrashpadInstallationStatus, &SetElfLibraryStoredCompressed, @@ -90,7 +100,9 @@ const StarboardExtensionLoaderAppMetricsApi kLoaderAppMetricsApi = { &SetElfDecompressionDurationMicroseconds, &GetElfDecompressionDurationMicroseconds, &RecordUsedCpuBytesDuringElfLoad, - &GetMaxSampledUsedCpuBytesDuringElfLoad}; + &GetMaxSampledUsedCpuBytesDuringElfLoad, + &SetSlotSelectionStatus, + &GetSlotSelectionStatus}; } // namespace diff --git a/tools/metrics/histograms/metadata/cobalt/enums.xml b/tools/metrics/histograms/metadata/cobalt/enums.xml index c593a7a6f734..2bad87c9eadc 100644 --- a/tools/metrics/histograms/metadata/cobalt/enums.xml +++ b/tools/metrics/histograms/metadata/cobalt/enums.xml @@ -156,6 +156,24 @@ https://chromium.googlesource.com/chromium/src.git/+/HEAD/tools/metrics/histogra + + + Possible status of slot selection by the Loader App + + + + + + + + + + + + + + + diff --git a/tools/metrics/histograms/metadata/cobalt/histograms.xml b/tools/metrics/histograms/metadata/cobalt/histograms.xml index 4fba1e4004e8..5dd70d0124f4 100644 --- a/tools/metrics/histograms/metadata/cobalt/histograms.xml +++ b/tools/metrics/histograms/metadata/cobalt/histograms.xml @@ -119,6 +119,15 @@ Always run the pretty print utility on this file after editing: + + + + yuying@google.com + cobalt-team@google.com + Status of slot selection by the Loader App. + +