From 42d7d1cfdc5de1734a12e1fe8b5bc287b312be0f Mon Sep 17 00:00:00 2001 From: Chad Reynolds Date: Wed, 28 Jan 2026 10:52:35 -0800 Subject: [PATCH 1/6] Add new enum for data image policy flag To be used as a target for converting the flag's string value. --- .../cuttlefish/host/libs/config/BUILD.bazel | 10 ++++ .../host/libs/config/data_image_policy.cc | 58 +++++++++++++++++++ .../host/libs/config/data_image_policy.h | 35 +++++++++++ 3 files changed, 103 insertions(+) create mode 100644 base/cvd/cuttlefish/host/libs/config/data_image_policy.cc create mode 100644 base/cvd/cuttlefish/host/libs/config/data_image_policy.h diff --git a/base/cvd/cuttlefish/host/libs/config/BUILD.bazel b/base/cvd/cuttlefish/host/libs/config/BUILD.bazel index 1347c3b5834..81aa5b2e274 100644 --- a/base/cvd/cuttlefish/host/libs/config/BUILD.bazel +++ b/base/cvd/cuttlefish/host/libs/config/BUILD.bazel @@ -164,6 +164,16 @@ cf_cc_library( ], ) +cf_cc_library( + name = "data_image_policy", + srcs = [ + "data_image_policy.cc", + ], + hdrs = [ + "data_image_policy.h", + ], +) + cf_cc_library( name = "display", srcs = ["display.cpp"], diff --git a/base/cvd/cuttlefish/host/libs/config/data_image_policy.cc b/base/cvd/cuttlefish/host/libs/config/data_image_policy.cc new file mode 100644 index 00000000000..e72445e66e2 --- /dev/null +++ b/base/cvd/cuttlefish/host/libs/config/data_image_policy.cc @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2026 The Android Open Source Project + * + * 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 "cuttlefish/host/libs/config/data_image_policy.h" + +#include +#include + +namespace cuttlefish { + +namespace { + +constexpr std::string_view kAlwaysCreate = "always_create"; +constexpr std::string_view kResizeUpTo = "resize_up_to"; +constexpr std::string_view kUnknown = "unknown"; +constexpr std::string_view kUseExisting = "use_existing"; + +} // namespace + +DataImagePolicy DataImagePolicyFromString(std::string_view policy) { + if (policy == kAlwaysCreate) { + return DataImagePolicy::AlwaysCreate; + } else if (policy == kResizeUpTo) { + return DataImagePolicy::ResizeUpTo; + } else if (policy == kUseExisting) { + return DataImagePolicy::UseExisting; + } else { + return DataImagePolicy::Unknown; + } +} + +std::string DataImagePolicyString(DataImagePolicy policy) { + switch (policy) { + case DataImagePolicy::AlwaysCreate: + return std::string(kAlwaysCreate); + case DataImagePolicy::ResizeUpTo: + return std::string(kResizeUpTo); + case DataImagePolicy::UseExisting: + return std::string(kUseExisting); + case DataImagePolicy::Unknown: + return std::string(kUnknown); + } +} + +} // namespace cuttlefish diff --git a/base/cvd/cuttlefish/host/libs/config/data_image_policy.h b/base/cvd/cuttlefish/host/libs/config/data_image_policy.h new file mode 100644 index 00000000000..ab0143f4738 --- /dev/null +++ b/base/cvd/cuttlefish/host/libs/config/data_image_policy.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2026 The Android Open Source Project + * + * 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. + */ + +#pragma once + +#include +#include + +namespace cuttlefish { + +enum class DataImagePolicy { + AlwaysCreate, + ResizeUpTo, + Unknown, + UseExisting, +}; + +DataImagePolicy DataImagePolicyFromString(std::string_view policy); + +std::string DataImagePolicyString(DataImagePolicy policy); + +} // namespace cuttlefish From 095f74591291e3a4a7b1509e3565912872bb977e Mon Sep 17 00:00:00 2001 From: Chad Reynolds Date: Wed, 28 Jan 2026 11:14:37 -0800 Subject: [PATCH 2/6] Utilize `DataImagePolicy` in `CuttlefishConfig` Also, remove the unused/unhandled `create_if_missing` option from the `data_policy` flag help text. --- .../host/commands/assemble_cvd/BUILD.bazel | 1 + .../assemble_cvd/assemble_cvd_flags.cpp | 3 +-- .../host/commands/assemble_cvd/flags.cc | 4 +++- .../cuttlefish/host/libs/config/BUILD.bazel | 2 ++ .../host/libs/config/cuttlefish_config.h | 5 +++-- .../config/cuttlefish_config_instance.cpp | 9 +++++---- .../host/libs/config/data_image.cpp | 20 +++++++++---------- 7 files changed, 24 insertions(+), 20 deletions(-) diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/BUILD.bazel b/base/cvd/cuttlefish/host/commands/assemble_cvd/BUILD.bazel index 604f3e9e289..a5fca956a3c 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/BUILD.bazel +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/BUILD.bazel @@ -315,6 +315,7 @@ cf_cc_library( "//cuttlefish/host/libs/config:config_constants", "//cuttlefish/host/libs/config:cuttlefish_config", "//cuttlefish/host/libs/config:display", + "//cuttlefish/host/libs/config:data_image_policy", "//cuttlefish/host/libs/config:external_network_mode", "//cuttlefish/host/libs/config:fetcher_configs", "//cuttlefish/host/libs/config:host_tools_version", diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.cpp b/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.cpp index b955a56653b..3268846d6e0 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.cpp +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.cpp @@ -29,8 +29,7 @@ DEFINE_vec(data_policy, CF_DEFAULTS_DATA_POLICY, "How to handle userdata partition." - " Either 'use_existing', 'create_if_missing', 'resize_up_to', or " - "'always_create'."); + " Either 'use_existing', 'resize_up_to', or 'always_create'."); DEFINE_vec(gdb_port, std::to_string(CF_DEFAULTS_GDB_PORT), "Port number to spawn kernel gdb on e.g. -gdb_port=1234. The" "kernel must have been built with CONFIG_RANDOMIZE_BASE " diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc index 1cac6ede01d..bf09d042ea8 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc @@ -72,6 +72,7 @@ #include "cuttlefish/host/libs/config/ap_boot_flow.h" #include "cuttlefish/host/libs/config/config_constants.h" #include "cuttlefish/host/libs/config/cuttlefish_config.h" +#include "cuttlefish/host/libs/config/data_image_policy.h" #include "cuttlefish/host/libs/config/display.h" #include "cuttlefish/host/libs/config/fetcher_configs.h" #include "cuttlefish/host/libs/config/host_tools_version.h" @@ -983,7 +984,8 @@ Result InitializeCuttlefishConfiguration( instance.set_camera_server_port(camera_server_port_vec[instance_index]); instance.set_gem5_binary_dir(gem5_binary_dir_vec[instance_index]); instance.set_gem5_checkpoint_dir(gem5_checkpoint_dir_vec[instance_index]); - instance.set_data_policy(data_policy_vec[instance_index]); + instance.set_data_policy( + DataImagePolicyFromString(data_policy_vec[instance_index])); instance.set_has_wifi_card(enable_wifi_vec[instance_index]); instance.set_mobile_bridge_name(StrForInstance("cvd-mbr-", num)); diff --git a/base/cvd/cuttlefish/host/libs/config/BUILD.bazel b/base/cvd/cuttlefish/host/libs/config/BUILD.bazel index 81aa5b2e274..04bab297a32 100644 --- a/base/cvd/cuttlefish/host/libs/config/BUILD.bazel +++ b/base/cvd/cuttlefish/host/libs/config/BUILD.bazel @@ -124,6 +124,7 @@ cf_cc_library( "//cuttlefish/host/libs/config:config_constants", "//cuttlefish/host/libs/config:config_fragment", "//cuttlefish/host/libs/config:config_utils", + "//cuttlefish/host/libs/config:data_image_policy", "//cuttlefish/host/libs/config:external_network_mode", "//cuttlefish/host/libs/config:guest_hwui_renderer", "//cuttlefish/host/libs/config:guest_renderer_preload", @@ -155,6 +156,7 @@ cf_cc_library( "//cuttlefish/host/libs/config:boot_flow", "//cuttlefish/host/libs/config:config_utils", "//cuttlefish/host/libs/config:cuttlefish_config", + "//cuttlefish/host/libs/config:data_image_policy", "//cuttlefish/host/libs/config:esp", "//cuttlefish/host/libs/config:openwrt_args", "//cuttlefish/host/libs/image_aggregator:mbr", diff --git a/base/cvd/cuttlefish/host/libs/config/cuttlefish_config.h b/base/cvd/cuttlefish/host/libs/config/cuttlefish_config.h index baa6e45cf48..f63a469050b 100644 --- a/base/cvd/cuttlefish/host/libs/config/cuttlefish_config.h +++ b/base/cvd/cuttlefish/host/libs/config/cuttlefish_config.h @@ -34,6 +34,7 @@ #include "cuttlefish/host/libs/config/config_constants.h" #include "cuttlefish/host/libs/config/config_fragment.h" #include "cuttlefish/host/libs/config/config_utils.h" +#include "cuttlefish/host/libs/config/data_image_policy.h" #include "cuttlefish/host/libs/config/external_network_mode.h" #include "cuttlefish/host/libs/config/guest_hwui_renderer.h" #include "cuttlefish/host/libs/config/guest_renderer_preload.h" @@ -470,7 +471,7 @@ class CuttlefishConfig { std::string vcpu_config_path() const; - std::string data_policy() const; + DataImagePolicy data_policy() const; int blank_data_image_mb() const; @@ -707,7 +708,7 @@ class CuttlefishConfig { void set_target_arch(Arch target_arch); void set_cpus(int cpus); void set_vcpu_config_path(const std::string& vcpu_config_path); - void set_data_policy(const std::string& data_policy); + void set_data_policy(DataImagePolicy data_policy); void set_blank_data_image_mb(int blank_data_image_mb); void set_gdb_port(int gdb_port); void set_display_configs(const std::vector& display_configs); diff --git a/base/cvd/cuttlefish/host/libs/config/cuttlefish_config_instance.cpp b/base/cvd/cuttlefish/host/libs/config/cuttlefish_config_instance.cpp index 0293922f966..d64fa4379b8 100644 --- a/base/cvd/cuttlefish/host/libs/config/cuttlefish_config_instance.cpp +++ b/base/cvd/cuttlefish/host/libs/config/cuttlefish_config_instance.cpp @@ -46,6 +46,7 @@ #include "cuttlefish/host/libs/config/ap_boot_flow.h" #include "cuttlefish/host/libs/config/boot_flow.h" #include "cuttlefish/host/libs/config/config_constants.h" +#include "cuttlefish/host/libs/config/data_image_policy.h" #include "cuttlefish/host/libs/config/external_network_mode.h" #include "cuttlefish/host/libs/config/guest_hwui_renderer.h" #include "cuttlefish/host/libs/config/guest_renderer_preload.h" @@ -576,11 +577,11 @@ std::string CuttlefishConfig::InstanceSpecific::vcpu_config_path() const { static constexpr char kDataPolicy[] = "data_policy"; void CuttlefishConfig::MutableInstanceSpecific::set_data_policy( - const std::string& data_policy) { - (*Dictionary())[kDataPolicy] = data_policy; + DataImagePolicy data_policy) { + (*Dictionary())[kDataPolicy] = DataImagePolicyString(data_policy); } -std::string CuttlefishConfig::InstanceSpecific::data_policy() const { - return (*Dictionary())[kDataPolicy].asString(); +DataImagePolicy CuttlefishConfig::InstanceSpecific::data_policy() const { + return DataImagePolicyFromString((*Dictionary())[kDataPolicy].asString()); } static constexpr char kBlankDataImageMb[] = "blank_data_image_mb"; diff --git a/base/cvd/cuttlefish/host/libs/config/data_image.cpp b/base/cvd/cuttlefish/host/libs/config/data_image.cpp index c878eacafa9..c1147353d53 100644 --- a/base/cvd/cuttlefish/host/libs/config/data_image.cpp +++ b/base/cvd/cuttlefish/host/libs/config/data_image.cpp @@ -36,6 +36,7 @@ #include "cuttlefish/host/libs/config/boot_flow.h" #include "cuttlefish/host/libs/config/config_utils.h" #include "cuttlefish/host/libs/config/cuttlefish_config.h" +#include "cuttlefish/host/libs/config/data_image_policy.h" #include "cuttlefish/host/libs/config/esp.h" #include "cuttlefish/host/libs/config/openwrt_args.h" #include "cuttlefish/host/libs/image_aggregator/mbr.h" @@ -48,10 +49,6 @@ namespace cuttlefish { namespace { -static constexpr std::string_view kDataPolicyUseExisting = "use_existing"; -static constexpr std::string_view kDataPolicyAlwaysCreate = "always_create"; -static constexpr std::string_view kDataPolicyResizeUpTo = "resize_up_to"; - const int FSCK_ERROR_CORRECTED = 1; const int FSCK_ERROR_CORRECTED_REQUIRES_REBOOT = 2; @@ -135,24 +132,25 @@ enum class DataImageAction { kNoAction, kResizeImage, kCreateBlankImage }; static Result ChooseDataImageAction( const CuttlefishConfig::InstanceSpecific& instance) { - if (instance.data_policy() == kDataPolicyAlwaysCreate) { + if (instance.data_policy() == DataImagePolicy::AlwaysCreate) { return DataImageAction::kCreateBlankImage; } if (!FileHasContent(instance.data_image())) { return DataImageAction::kCreateBlankImage; } - if (instance.data_policy() == kDataPolicyUseExisting) { + if (instance.data_policy() == DataImagePolicy::UseExisting) { return DataImageAction::kNoAction; } auto current_fs_type = GetFsType(instance.data_image()); if (current_fs_type != instance.userdata_format()) { - CF_EXPECT(instance.data_policy() != kDataPolicyResizeUpTo, - "Changing the fs format is incompatible with -data_policy=" - << kDataPolicyResizeUpTo << " (\"" << current_fs_type - << "\" != \"" << instance.userdata_format() << "\")"); + CF_EXPECT(instance.data_policy() != DataImagePolicy::ResizeUpTo, + "Changing the fs format is incompatible with --data_policy=" + << DataImagePolicyString(DataImagePolicy::ResizeUpTo) + << " (\"" << current_fs_type << "\" != \"" + << instance.userdata_format() << "\")"); return DataImageAction::kCreateBlankImage; } - if (instance.data_policy() == kDataPolicyResizeUpTo) { + if (instance.data_policy() == DataImagePolicy::ResizeUpTo) { return DataImageAction::kResizeImage; } return DataImageAction::kNoAction; From 328a7499a69fda344ae3d517757e9ef3c9ee63da Mon Sep 17 00:00:00 2001 From: Chad Reynolds Date: Wed, 28 Jan 2026 18:32:11 -0800 Subject: [PATCH 3/6] Move `FlagBase` definitions to the header Otherwise, the source file will need to explicitly instantiate the templates for all types. Since we want to expand the list (for instance with the new `DataImagePolicy` enum, that will be inconvenient. Keep the destructor pure-virtual to avoid `FlagBase` instantiation: "Pure virtual destructors" section of https://en.cppreference.com/w/cpp/language/destructor.html `extern template` common flag types, to avoid some amount of template bloat. This does not require future `FlagBase` instantiations to update the `flag_base` header or source files like the previous version, however. --- .../commands/assemble_cvd/flags/flag_base.cc | 19 ------------------- .../commands/assemble_cvd/flags/flag_base.h | 18 ++++++++++++++++-- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/flag_base.cc b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/flag_base.cc index 4e8dea5e167..1bd64bfcce4 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/flag_base.cc +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/flag_base.cc @@ -16,29 +16,10 @@ #include "cuttlefish/host/commands/assemble_cvd/flags/flag_base.h" -#include #include -#include -#include namespace cuttlefish { -template -T FlagBase::ForIndex(const std::size_t index) const { - if (index < values_.size()) { - return values_[index]; - } else { - return values_[0]; - } -} - -template -FlagBase::FlagBase(std::vector flag_values) - : values_(std::move(flag_values)) {} - -template -FlagBase::~FlagBase() {} - template class FlagBase; template class FlagBase; template class FlagBase; diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/flag_base.h b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/flag_base.h index 557853ddb5b..b145012e1c8 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/flag_base.h +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/flag_base.h @@ -17,6 +17,7 @@ #pragma once #include +#include #include namespace cuttlefish { @@ -24,14 +25,27 @@ namespace cuttlefish { template class FlagBase { public: - T ForIndex(const std::size_t index) const; + T ForIndex(const std::size_t index) const { + if (index < values_.size()) { + return values_[index]; + } else { + return values_[0]; + } + } protected: - FlagBase(std::vector flag_values); + FlagBase(std::vector flag_values) : values_(std::move(flag_values)) {} virtual ~FlagBase() = 0; private: std::vector values_; }; +template +FlagBase::~FlagBase() {} + +extern template class FlagBase; +extern template class FlagBase; +extern template class FlagBase; + } // namespace cuttlefish From 202cc4e3a0a39a3bfc69e67d1b88f717b5c3f850 Mon Sep 17 00:00:00 2001 From: Chad Reynolds Date: Mon, 26 Jan 2026 18:03:50 -0800 Subject: [PATCH 4/6] Convert `data_policy` flag to `FlagBase` To re-use the same parsing logic for metrics gathering. Bug:442664611 --- .../host/commands/assemble_cvd/BUILD.bazel | 2 +- .../assemble_cvd/assemble_cvd_flags.cpp | 3 - .../assemble_cvd/assemble_cvd_flags.h | 1 - .../host/commands/assemble_cvd/flags.cc | 9 ++- .../commands/assemble_cvd/flags/BUILD.bazel | 14 +++++ .../assemble_cvd/flags/data_policy.cc | 56 +++++++++++++++++++ .../commands/assemble_cvd/flags/data_policy.h | 36 ++++++++++++ 7 files changed, 111 insertions(+), 10 deletions(-) create mode 100644 base/cvd/cuttlefish/host/commands/assemble_cvd/flags/data_policy.cc create mode 100644 base/cvd/cuttlefish/host/commands/assemble_cvd/flags/data_policy.h diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/BUILD.bazel b/base/cvd/cuttlefish/host/commands/assemble_cvd/BUILD.bazel index a5fca956a3c..1ad7525f946 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/BUILD.bazel +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/BUILD.bazel @@ -301,6 +301,7 @@ cf_cc_library( "//cuttlefish/host/commands/assemble_cvd/flags:bootloader", "//cuttlefish/host/commands/assemble_cvd/flags:cpus", "//cuttlefish/host/commands/assemble_cvd/flags:daemon", + "//cuttlefish/host/commands/assemble_cvd/flags:data_policy", "//cuttlefish/host/commands/assemble_cvd/flags:display_proto", "//cuttlefish/host/commands/assemble_cvd/flags:initramfs_path", "//cuttlefish/host/commands/assemble_cvd/flags:kernel_path", @@ -315,7 +316,6 @@ cf_cc_library( "//cuttlefish/host/libs/config:config_constants", "//cuttlefish/host/libs/config:cuttlefish_config", "//cuttlefish/host/libs/config:display", - "//cuttlefish/host/libs/config:data_image_policy", "//cuttlefish/host/libs/config:external_network_mode", "//cuttlefish/host/libs/config:fetcher_configs", "//cuttlefish/host/libs/config:host_tools_version", diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.cpp b/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.cpp index 3268846d6e0..e1fe2acb28b 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.cpp +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.cpp @@ -27,9 +27,6 @@ #define DEFINE_vec DEFINE_string -DEFINE_vec(data_policy, CF_DEFAULTS_DATA_POLICY, - "How to handle userdata partition." - " Either 'use_existing', 'resize_up_to', or 'always_create'."); DEFINE_vec(gdb_port, std::to_string(CF_DEFAULTS_GDB_PORT), "Port number to spawn kernel gdb on e.g. -gdb_port=1234. The" "kernel must have been built with CONFIG_RANDOMIZE_BASE " diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.h b/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.h index 7e180cd4f53..40f31e3294a 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.h +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.h @@ -20,7 +20,6 @@ #define DECLARE_vec DECLARE_string -DECLARE_vec(data_policy); DECLARE_vec(gdb_port); // TODO(b/192495477): combine these into a single repeatable '--display' flag diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc index bf09d042ea8..12ea66d3ddd 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc @@ -56,6 +56,7 @@ #include "cuttlefish/host/commands/assemble_cvd/flags/bootloader.h" #include "cuttlefish/host/commands/assemble_cvd/flags/cpus.h" #include "cuttlefish/host/commands/assemble_cvd/flags/daemon.h" +#include "cuttlefish/host/commands/assemble_cvd/flags/data_policy.h" #include "cuttlefish/host/commands/assemble_cvd/flags/display_proto.h" #include "cuttlefish/host/commands/assemble_cvd/flags/initramfs_path.h" #include "cuttlefish/host/commands/assemble_cvd/flags/kernel_path.h" @@ -72,7 +73,6 @@ #include "cuttlefish/host/libs/config/ap_boot_flow.h" #include "cuttlefish/host/libs/config/config_constants.h" #include "cuttlefish/host/libs/config/cuttlefish_config.h" -#include "cuttlefish/host/libs/config/data_image_policy.h" #include "cuttlefish/host/libs/config/display.h" #include "cuttlefish/host/libs/config/fetcher_configs.h" #include "cuttlefish/host/libs/config/host_tools_version.h" @@ -604,8 +604,8 @@ Result InitializeCuttlefishConfiguration( CF_EXPECT(GET_FLAG_STR_VALUE(gem5_binary_dir)); std::vector gem5_checkpoint_dir_vec = CF_EXPECT(GET_FLAG_STR_VALUE(gem5_checkpoint_dir)); - std::vector data_policy_vec = - CF_EXPECT(GET_FLAG_STR_VALUE(data_policy)); + DataPolicyFlag data_policy_values = + CF_EXPECT(DataPolicyFlag::FromGlobalGflags()); // multi-virtual-device multi-display proto input DisplaysProtoFlag instances_display_configs = @@ -984,8 +984,7 @@ Result InitializeCuttlefishConfiguration( instance.set_camera_server_port(camera_server_port_vec[instance_index]); instance.set_gem5_binary_dir(gem5_binary_dir_vec[instance_index]); instance.set_gem5_checkpoint_dir(gem5_checkpoint_dir_vec[instance_index]); - instance.set_data_policy( - DataImagePolicyFromString(data_policy_vec[instance_index])); + instance.set_data_policy(data_policy_values.ForIndex(instance_index)); instance.set_has_wifi_card(enable_wifi_vec[instance_index]); instance.set_mobile_bridge_name(StrForInstance("cvd-mbr-", num)); diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/BUILD.bazel b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/BUILD.bazel index 775e40ec025..29f086b496c 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/BUILD.bazel +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/BUILD.bazel @@ -125,6 +125,20 @@ cf_cc_library( ], ) +cf_cc_library( + name = "data_policy", + srcs = ["data_policy.cc"], + hdrs = ["data_policy.h"], + deps = [ + "//cuttlefish/host/commands/assemble_cvd:flags_defaults", + "//cuttlefish/host/commands/assemble_cvd/flags:flag_base", + "//cuttlefish/host/commands/assemble_cvd/flags:from_gflags", + "//cuttlefish/host/libs/config:data_image_policy", + "//cuttlefish/result", + "@gflags", + ], +) + cf_cc_library( name = "display_proto", srcs = ["display_proto.cc"], diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/data_policy.cc b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/data_policy.cc new file mode 100644 index 00000000000..b611d656ce0 --- /dev/null +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/data_policy.cc @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * 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 "cuttlefish/host/commands/assemble_cvd/flags/data_policy.h" + +#include +#include +#include +#include + +#include + +#include "cuttlefish/host/commands/assemble_cvd/flags/flag_base.h" +#include "cuttlefish/host/commands/assemble_cvd/flags/from_gflags.h" +#include "cuttlefish/host/commands/assemble_cvd/flags_defaults.h" +#include "cuttlefish/host/libs/config/data_image_policy.h" +#include "cuttlefish/result/result.h" + +DEFINE_string(data_policy, CF_DEFAULTS_DATA_POLICY, + "How to handle userdata partition. Either 'use_existing', " + "'resize_up_to', or 'always_create'."); + +namespace cuttlefish { +namespace { + +constexpr char kFlagName[] = "data_policy"; + +} // namespace + +Result DataPolicyFlag::FromGlobalGflags() { + const auto flag_info = gflags::GetCommandLineFlagInfoOrDie(kFlagName); + std::vector flag_string_values = + CF_EXPECT(StringFromGlobalGflags(flag_info, kFlagName)); + std::vector flag_values; + std::transform(flag_string_values.cbegin(), flag_string_values.cend(), + std::back_inserter(flag_values), DataImagePolicyFromString); + return DataPolicyFlag(std::move(flag_values)); +} + +DataPolicyFlag::DataPolicyFlag(std::vector flag_values) + : FlagBase(std::move(flag_values)) {} + +} // namespace cuttlefish diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/data_policy.h b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/data_policy.h new file mode 100644 index 00000000000..da6eb4d7fdd --- /dev/null +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/data_policy.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2026 The Android Open Source Project + * + * 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. + */ + +#pragma once + +#include + +#include "cuttlefish/host/commands/assemble_cvd/flags/flag_base.h" +#include "cuttlefish/host/libs/config/data_image_policy.h" +#include "cuttlefish/result/result.h" + +namespace cuttlefish { + +class DataPolicyFlag : public FlagBase { + public: + static Result FromGlobalGflags(); + ~DataPolicyFlag() override = default; + + private: + DataPolicyFlag(std::vector); +}; + +} // namespace cuttlefish From 53beff08df1c22343145bd68a671e4ab8a09c990 Mon Sep 17 00:00:00 2001 From: Chad Reynolds Date: Mon, 26 Jan 2026 18:07:05 -0800 Subject: [PATCH 5/6] Gather metrics data for `data_policy` Not yet converted for transmission, but available. Bug: 442664611 --- base/cvd/cuttlefish/host/libs/metrics/BUILD.bazel | 2 ++ base/cvd/cuttlefish/host/libs/metrics/flag_metrics.cc | 8 ++++++-- base/cvd/cuttlefish/host/libs/metrics/flag_metrics.h | 3 +++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/base/cvd/cuttlefish/host/libs/metrics/BUILD.bazel b/base/cvd/cuttlefish/host/libs/metrics/BUILD.bazel index beb9cd9eb53..dd7304341f1 100644 --- a/base/cvd/cuttlefish/host/libs/metrics/BUILD.bazel +++ b/base/cvd/cuttlefish/host/libs/metrics/BUILD.bazel @@ -38,6 +38,8 @@ cf_cc_library( deps = [ "//cuttlefish/host/commands/assemble_cvd/flags:cpus", "//cuttlefish/host/commands/assemble_cvd/flags:daemon", + "//cuttlefish/host/commands/assemble_cvd/flags:data_policy", + "//cuttlefish/host/libs/config:data_image_policy", "//cuttlefish/result", ], ) diff --git a/base/cvd/cuttlefish/host/libs/metrics/flag_metrics.cc b/base/cvd/cuttlefish/host/libs/metrics/flag_metrics.cc index 71826aacba3..70333244a23 100644 --- a/base/cvd/cuttlefish/host/libs/metrics/flag_metrics.cc +++ b/base/cvd/cuttlefish/host/libs/metrics/flag_metrics.cc @@ -20,6 +20,7 @@ #include "cuttlefish/host/commands/assemble_cvd/flags/cpus.h" #include "cuttlefish/host/commands/assemble_cvd/flags/daemon.h" +#include "cuttlefish/host/commands/assemble_cvd/flags/data_policy.h" #include "cuttlefish/result/result.h" namespace cuttlefish { @@ -30,11 +31,14 @@ Result> GetFlagMetrics(const int guest_count) { CpusFlag cpus_values = CF_EXPECT(CpusFlag::FromGlobalGflags()); DaemonFlag daemon_values = CF_EXPECT(DaemonFlag::FromGlobalGflags()); + DataPolicyFlag data_policy_values = + CF_EXPECT(DataPolicyFlag::FromGlobalGflags()); for (int i = 0; i < guest_count; i++) { result.emplace_back(FlagMetrics{ - .cpus = cpus_values.ForIndex(i), - .daemon = daemon_values.ForIndex(i), + .cpus = cpus_values.ForIndex(i), + .daemon = daemon_values.ForIndex(i), + .data_policy = data_policy_values.ForIndex(i), }); } return result; diff --git a/base/cvd/cuttlefish/host/libs/metrics/flag_metrics.h b/base/cvd/cuttlefish/host/libs/metrics/flag_metrics.h index e0b34b23bb3..41f268274d6 100644 --- a/base/cvd/cuttlefish/host/libs/metrics/flag_metrics.h +++ b/base/cvd/cuttlefish/host/libs/metrics/flag_metrics.h @@ -16,8 +16,10 @@ #pragma once +#include #include +#include "cuttlefish/host/libs/config/data_image_policy.h" #include "cuttlefish/result/result.h" namespace cuttlefish { @@ -25,6 +27,7 @@ namespace cuttlefish { struct FlagMetrics { int cpus; bool daemon; + DataImagePolicy data_policy; }; // depends on gflags::ParseCommandLineFlags being called previously From 24a85b0d1124f506a73867502df5089dc3db7501 Mon Sep 17 00:00:00 2001 From: Chad Reynolds Date: Mon, 26 Jan 2026 18:16:25 -0800 Subject: [PATCH 6/6] Add `data_policy` to transmitted proto data Bug: 442664611 --- .../cuttlefish/host/libs/metrics/BUILD.bazel | 1 + .../host/libs/metrics/metrics_conversion.cc | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/base/cvd/cuttlefish/host/libs/metrics/BUILD.bazel b/base/cvd/cuttlefish/host/libs/metrics/BUILD.bazel index dd7304341f1..1ac6a1ad3a9 100644 --- a/base/cvd/cuttlefish/host/libs/metrics/BUILD.bazel +++ b/base/cvd/cuttlefish/host/libs/metrics/BUILD.bazel @@ -91,6 +91,7 @@ cf_cc_library( ], deps = [ "//cuttlefish/common/libs/utils:host_info", + "//cuttlefish/host/libs/config:data_image_policy", "//cuttlefish/host/libs/metrics:event_type", "//cuttlefish/host/libs/metrics:flag_metrics", "//cuttlefish/host/libs/metrics:guest_metrics", diff --git a/base/cvd/cuttlefish/host/libs/metrics/metrics_conversion.cc b/base/cvd/cuttlefish/host/libs/metrics/metrics_conversion.cc index 2a4680f8590..83fb0272641 100644 --- a/base/cvd/cuttlefish/host/libs/metrics/metrics_conversion.cc +++ b/base/cvd/cuttlefish/host/libs/metrics/metrics_conversion.cc @@ -22,6 +22,7 @@ #include "google/protobuf/timestamp.pb.h" #include "cuttlefish/common/libs/utils/host_info.h" +#include "cuttlefish/host/libs/config/data_image_policy.h" #include "cuttlefish/host/libs/metrics/event_type.h" #include "external_proto/cf_flags.pb.h" #include "external_proto/cf_guest.pb.h" @@ -35,6 +36,8 @@ namespace { using google::protobuf::Timestamp; using logs::proto::wireless::android::cuttlefish::CuttlefishLogEvent; using logs::proto::wireless::android::cuttlefish::events::CuttlefishFlags; +using logs::proto::wireless::android::cuttlefish::events:: + CuttlefishFlags_DataPolicy; using logs::proto::wireless::android::cuttlefish::events::CuttlefishGuest; using logs::proto::wireless::android::cuttlefish::events:: CuttlefishGuest_EventType; @@ -42,6 +45,23 @@ using logs::proto::wireless::android::cuttlefish::events::CuttlefishHost; using logs::proto::wireless::android::cuttlefish::events::CuttlefishHost_OsType; using logs::proto::wireless::android::cuttlefish::events::MetricsEventV2; +CuttlefishFlags_DataPolicy ConvertDataPolicy(DataImagePolicy policy) { + switch (policy) { + case DataImagePolicy::AlwaysCreate: + return CuttlefishFlags_DataPolicy:: + CuttlefishFlags_DataPolicy_CUTTLEFISH_FLAGS_DATA_POLICY_ALWAYS_CREATE; + case DataImagePolicy::ResizeUpTo: + return CuttlefishFlags_DataPolicy:: + CuttlefishFlags_DataPolicy_CUTTLEFISH_FLAGS_DATA_POLICY_RESIZE_UP_TO; + case DataImagePolicy::Unknown: + return CuttlefishFlags_DataPolicy:: + CuttlefishFlags_DataPolicy_CUTTLEFISH_FLAGS_DATA_POLICY_UNSPECIFIED; + case DataImagePolicy::UseExisting: + return CuttlefishFlags_DataPolicy:: + CuttlefishFlags_DataPolicy_CUTTLEFISH_FLAGS_DATA_POLICY_USE_EXISTING; + } +} + CuttlefishGuest_EventType ConvertEventType(EventType event_type) { switch (event_type) { case EventType::DeviceInstantiation: @@ -100,6 +120,7 @@ void PopulateCuttlefishGuest(CuttlefishGuest& guest, CuttlefishFlags& flags = *guest.mutable_flags(); flags.set_cpus(flag_metrics.cpus); flags.set_daemon(flag_metrics.daemon); + flags.set_data_policy(ConvertDataPolicy(flag_metrics.data_policy)); } } // namespace