Merge "aconfig: update rust_codegen to just read from new storage when flag is true" into main
This commit is contained in:
@@ -116,10 +116,6 @@ use std::io::Write;
|
|||||||
use std::sync::LazyLock;
|
use std::sync::LazyLock;
|
||||||
use log::{log, LevelFilter, Level};
|
use log::{log, LevelFilter, Level};
|
||||||
|
|
||||||
static STORAGE_MIGRATION_MARKER_FILE: &str =
|
|
||||||
"/metadata/aconfig_test_missions/mission_1";
|
|
||||||
static MIGRATION_LOG_TAG: &str = "AconfigTestMission1";
|
|
||||||
|
|
||||||
/// flag provider
|
/// flag provider
|
||||||
pub struct FlagProvider;
|
pub struct FlagProvider;
|
||||||
|
|
||||||
@@ -260,13 +256,13 @@ use std::io::Write;
|
|||||||
use std::sync::LazyLock;
|
use std::sync::LazyLock;
|
||||||
use log::{log, LevelFilter, Level};
|
use log::{log, LevelFilter, Level};
|
||||||
|
|
||||||
static STORAGE_MIGRATION_MARKER_FILE: &str =
|
|
||||||
"/metadata/aconfig_test_missions/mission_1";
|
|
||||||
static MIGRATION_LOG_TAG: &str = "AconfigTestMission1";
|
|
||||||
|
|
||||||
/// flag provider
|
/// flag provider
|
||||||
pub struct FlagProvider;
|
pub struct FlagProvider;
|
||||||
|
|
||||||
|
static READ_FROM_NEW_STORAGE: LazyLock<bool> = LazyLock::new(|| unsafe {
|
||||||
|
Path::new("/metadata/aconfig/boot/enable_only_new_storage").exists()
|
||||||
|
});
|
||||||
|
|
||||||
static PACKAGE_OFFSET: LazyLock<Result<Option<u32>, AconfigStorageError>> = LazyLock::new(|| unsafe {
|
static PACKAGE_OFFSET: LazyLock<Result<Option<u32>, AconfigStorageError>> = LazyLock::new(|| unsafe {
|
||||||
get_mapped_storage_file("system", StorageFileType::PackageMap)
|
get_mapped_storage_file("system", StorageFileType::PackageMap)
|
||||||
.and_then(|package_map| get_package_read_context(&package_map, "com.android.aconfig.test"))
|
.and_then(|package_map| get_package_read_context(&package_map, "com.android.aconfig.test"))
|
||||||
@@ -279,24 +275,14 @@ static FLAG_VAL_MAP: LazyLock<Result<Mmap, AconfigStorageError>> = LazyLock::new
|
|||||||
|
|
||||||
/// flag value cache for disabled_rw
|
/// flag value cache for disabled_rw
|
||||||
static CACHED_disabled_rw: LazyLock<bool> = LazyLock::new(|| {
|
static CACHED_disabled_rw: LazyLock<bool> = LazyLock::new(|| {
|
||||||
let result = flags_rust::GetServerConfigurableFlag(
|
if *READ_FROM_NEW_STORAGE {
|
||||||
"aconfig_flags.aconfig_test",
|
|
||||||
"com.android.aconfig.test.disabled_rw",
|
|
||||||
"false") == "true";
|
|
||||||
|
|
||||||
let use_new_storage_value = flags_rust::GetServerConfigurableFlag(
|
|
||||||
"aconfig_flags.core_experiments_team_internal",
|
|
||||||
"com.android.providers.settings.use_new_storage_value",
|
|
||||||
"false") == "true";
|
|
||||||
|
|
||||||
if Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
|
|
||||||
// This will be called multiple times. Subsequent calls after the first are noops.
|
// This will be called multiple times. Subsequent calls after the first are noops.
|
||||||
logger::init(
|
logger::init(
|
||||||
logger::Config::default()
|
logger::Config::default()
|
||||||
.with_tag_on_device(MIGRATION_LOG_TAG)
|
.with_tag_on_device("aconfig_rust_codegen")
|
||||||
.with_max_level(LevelFilter::Info));
|
.with_max_level(LevelFilter::Info));
|
||||||
|
|
||||||
let aconfig_storage_result = FLAG_VAL_MAP
|
let flag_value_result = FLAG_VAL_MAP
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map_err(|err| format!("failed to get flag val map: {err}"))
|
.map_err(|err| format!("failed to get flag val map: {err}"))
|
||||||
.and_then(|flag_val_map| {
|
.and_then(|flag_val_map| {
|
||||||
@@ -314,54 +300,33 @@ static CACHED_disabled_rw: LazyLock<bool> = LazyLock::new(|| {
|
|||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
match aconfig_storage_result {
|
match flag_value_result {
|
||||||
Ok(storage_result) if storage_result == result => {
|
Ok(flag_value) => {
|
||||||
if use_new_storage_value {
|
return flag_value;
|
||||||
return storage_result;
|
|
||||||
} else {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
Ok(storage_result) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: mismatch for flag 'disabled_rw'. Legacy storage was {result}, new storage was {storage_result}");
|
|
||||||
if use_new_storage_value {
|
|
||||||
return storage_result;
|
|
||||||
} else {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log!(Level::Error, "AconfigTestMission1: error: {err}");
|
log!(Level::Error, "aconfig_rust_codegen: error: {err}");
|
||||||
if use_new_storage_value {
|
panic!("failed to read flag value: {err}");
|
||||||
panic!("failed to read flag value: {err}");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
flags_rust::GetServerConfigurableFlag(
|
||||||
|
"aconfig_flags.aconfig_test",
|
||||||
|
"com.android.aconfig.test.disabled_rw",
|
||||||
|
"false") == "true"
|
||||||
}
|
}
|
||||||
|
|
||||||
result
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/// flag value cache for disabled_rw_exported
|
/// flag value cache for disabled_rw_exported
|
||||||
static CACHED_disabled_rw_exported: LazyLock<bool> = LazyLock::new(|| {
|
static CACHED_disabled_rw_exported: LazyLock<bool> = LazyLock::new(|| {
|
||||||
let result = flags_rust::GetServerConfigurableFlag(
|
if *READ_FROM_NEW_STORAGE {
|
||||||
"aconfig_flags.aconfig_test",
|
|
||||||
"com.android.aconfig.test.disabled_rw_exported",
|
|
||||||
"false") == "true";
|
|
||||||
|
|
||||||
let use_new_storage_value = flags_rust::GetServerConfigurableFlag(
|
|
||||||
"aconfig_flags.core_experiments_team_internal",
|
|
||||||
"com.android.providers.settings.use_new_storage_value",
|
|
||||||
"false") == "true";
|
|
||||||
|
|
||||||
if Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
|
|
||||||
// This will be called multiple times. Subsequent calls after the first are noops.
|
// This will be called multiple times. Subsequent calls after the first are noops.
|
||||||
logger::init(
|
logger::init(
|
||||||
logger::Config::default()
|
logger::Config::default()
|
||||||
.with_tag_on_device(MIGRATION_LOG_TAG)
|
.with_tag_on_device("aconfig_rust_codegen")
|
||||||
.with_max_level(LevelFilter::Info));
|
.with_max_level(LevelFilter::Info));
|
||||||
|
|
||||||
let aconfig_storage_result = FLAG_VAL_MAP
|
let flag_value_result = FLAG_VAL_MAP
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map_err(|err| format!("failed to get flag val map: {err}"))
|
.map_err(|err| format!("failed to get flag val map: {err}"))
|
||||||
.and_then(|flag_val_map| {
|
.and_then(|flag_val_map| {
|
||||||
@@ -379,54 +344,33 @@ static CACHED_disabled_rw_exported: LazyLock<bool> = LazyLock::new(|| {
|
|||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
match aconfig_storage_result {
|
match flag_value_result {
|
||||||
Ok(storage_result) if storage_result == result => {
|
Ok(flag_value) => {
|
||||||
if use_new_storage_value {
|
return flag_value;
|
||||||
return storage_result;
|
|
||||||
} else {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
Ok(storage_result) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: mismatch for flag 'disabled_rw_exported'. Legacy storage was {result}, new storage was {storage_result}");
|
|
||||||
if use_new_storage_value {
|
|
||||||
return storage_result;
|
|
||||||
} else {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log!(Level::Error, "AconfigTestMission1: error: {err}");
|
log!(Level::Error, "aconfig_rust_codegen: error: {err}");
|
||||||
if use_new_storage_value {
|
panic!("failed to read flag value: {err}");
|
||||||
panic!("failed to read flag value: {err}");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
flags_rust::GetServerConfigurableFlag(
|
||||||
|
"aconfig_flags.aconfig_test",
|
||||||
|
"com.android.aconfig.test.disabled_rw_exported",
|
||||||
|
"false") == "true"
|
||||||
}
|
}
|
||||||
|
|
||||||
result
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/// flag value cache for disabled_rw_in_other_namespace
|
/// flag value cache for disabled_rw_in_other_namespace
|
||||||
static CACHED_disabled_rw_in_other_namespace: LazyLock<bool> = LazyLock::new(|| {
|
static CACHED_disabled_rw_in_other_namespace: LazyLock<bool> = LazyLock::new(|| {
|
||||||
let result = flags_rust::GetServerConfigurableFlag(
|
if *READ_FROM_NEW_STORAGE {
|
||||||
"aconfig_flags.other_namespace",
|
|
||||||
"com.android.aconfig.test.disabled_rw_in_other_namespace",
|
|
||||||
"false") == "true";
|
|
||||||
|
|
||||||
let use_new_storage_value = flags_rust::GetServerConfigurableFlag(
|
|
||||||
"aconfig_flags.core_experiments_team_internal",
|
|
||||||
"com.android.providers.settings.use_new_storage_value",
|
|
||||||
"false") == "true";
|
|
||||||
|
|
||||||
if Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
|
|
||||||
// This will be called multiple times. Subsequent calls after the first are noops.
|
// This will be called multiple times. Subsequent calls after the first are noops.
|
||||||
logger::init(
|
logger::init(
|
||||||
logger::Config::default()
|
logger::Config::default()
|
||||||
.with_tag_on_device(MIGRATION_LOG_TAG)
|
.with_tag_on_device("aconfig_rust_codegen")
|
||||||
.with_max_level(LevelFilter::Info));
|
.with_max_level(LevelFilter::Info));
|
||||||
|
|
||||||
let aconfig_storage_result = FLAG_VAL_MAP
|
let flag_value_result = FLAG_VAL_MAP
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map_err(|err| format!("failed to get flag val map: {err}"))
|
.map_err(|err| format!("failed to get flag val map: {err}"))
|
||||||
.and_then(|flag_val_map| {
|
.and_then(|flag_val_map| {
|
||||||
@@ -444,55 +388,34 @@ static CACHED_disabled_rw_in_other_namespace: LazyLock<bool> = LazyLock::new(||
|
|||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
match aconfig_storage_result {
|
match flag_value_result {
|
||||||
Ok(storage_result) if storage_result == result => {
|
Ok(flag_value) => {
|
||||||
if use_new_storage_value {
|
return flag_value;
|
||||||
return storage_result;
|
|
||||||
} else {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
Ok(storage_result) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: mismatch for flag 'disabled_rw_in_other_namespace'. Legacy storage was {result}, new storage was {storage_result}");
|
|
||||||
if use_new_storage_value {
|
|
||||||
return storage_result;
|
|
||||||
} else {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log!(Level::Error, "AconfigTestMission1: error: {err}");
|
log!(Level::Error, "aconfig_rust_codegen: error: {err}");
|
||||||
if use_new_storage_value {
|
panic!("failed to read flag value: {err}");
|
||||||
panic!("failed to read flag value: {err}");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
flags_rust::GetServerConfigurableFlag(
|
||||||
|
"aconfig_flags.other_namespace",
|
||||||
|
"com.android.aconfig.test.disabled_rw_in_other_namespace",
|
||||||
|
"false") == "true"
|
||||||
}
|
}
|
||||||
|
|
||||||
result
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
/// flag value cache for enabled_rw
|
/// flag value cache for enabled_rw
|
||||||
static CACHED_enabled_rw: LazyLock<bool> = LazyLock::new(|| {
|
static CACHED_enabled_rw: LazyLock<bool> = LazyLock::new(|| {
|
||||||
let result = flags_rust::GetServerConfigurableFlag(
|
if *READ_FROM_NEW_STORAGE {
|
||||||
"aconfig_flags.aconfig_test",
|
|
||||||
"com.android.aconfig.test.enabled_rw",
|
|
||||||
"true") == "true";
|
|
||||||
|
|
||||||
let use_new_storage_value = flags_rust::GetServerConfigurableFlag(
|
|
||||||
"aconfig_flags.core_experiments_team_internal",
|
|
||||||
"com.android.providers.settings.use_new_storage_value",
|
|
||||||
"false") == "true";
|
|
||||||
|
|
||||||
if Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
|
|
||||||
// This will be called multiple times. Subsequent calls after the first are noops.
|
// This will be called multiple times. Subsequent calls after the first are noops.
|
||||||
logger::init(
|
logger::init(
|
||||||
logger::Config::default()
|
logger::Config::default()
|
||||||
.with_tag_on_device(MIGRATION_LOG_TAG)
|
.with_tag_on_device("aconfig_rust_codegen")
|
||||||
.with_max_level(LevelFilter::Info));
|
.with_max_level(LevelFilter::Info));
|
||||||
|
|
||||||
let aconfig_storage_result = FLAG_VAL_MAP
|
let flag_value_result = FLAG_VAL_MAP
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map_err(|err| format!("failed to get flag val map: {err}"))
|
.map_err(|err| format!("failed to get flag val map: {err}"))
|
||||||
.and_then(|flag_val_map| {
|
.and_then(|flag_val_map| {
|
||||||
@@ -510,32 +433,21 @@ static CACHED_enabled_rw: LazyLock<bool> = LazyLock::new(|| {
|
|||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
match aconfig_storage_result {
|
match flag_value_result {
|
||||||
Ok(storage_result) if storage_result == result => {
|
Ok(flag_value) => {
|
||||||
if use_new_storage_value {
|
return flag_value;
|
||||||
return storage_result;
|
|
||||||
} else {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
Ok(storage_result) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: mismatch for flag 'enabled_rw'. Legacy storage was {result}, new storage was {storage_result}");
|
|
||||||
if use_new_storage_value {
|
|
||||||
return storage_result;
|
|
||||||
} else {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log!(Level::Error, "AconfigTestMission1: error: {err}");
|
log!(Level::Error, "aconfig_rust_codegen: error: {err}");
|
||||||
if use_new_storage_value {
|
panic!("failed to read flag value: {err}");
|
||||||
panic!("failed to read flag value: {err}");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
flags_rust::GetServerConfigurableFlag(
|
||||||
|
"aconfig_flags.aconfig_test",
|
||||||
|
"com.android.aconfig.test.enabled_rw",
|
||||||
|
"true") == "true"
|
||||||
}
|
}
|
||||||
|
|
||||||
result
|
|
||||||
});
|
});
|
||||||
|
|
||||||
impl FlagProvider {
|
impl FlagProvider {
|
||||||
@@ -596,65 +508,7 @@ pub static PROVIDER: FlagProvider = FlagProvider;
|
|||||||
/// query flag disabled_ro
|
/// query flag disabled_ro
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn disabled_ro() -> bool {
|
pub fn disabled_ro() -> bool {
|
||||||
|
false
|
||||||
|
|
||||||
let result = false;
|
|
||||||
if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This will be called multiple times. Subsequent calls after the first
|
|
||||||
// are noops.
|
|
||||||
logger::init(
|
|
||||||
logger::Config::default()
|
|
||||||
.with_tag_on_device(MIGRATION_LOG_TAG)
|
|
||||||
.with_max_level(LevelFilter::Info),
|
|
||||||
);
|
|
||||||
|
|
||||||
unsafe {
|
|
||||||
let package_map = match get_mapped_storage_file("system", StorageFileType::PackageMap) {
|
|
||||||
Ok(file) => file,
|
|
||||||
Err(err) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'disabled_ro': {err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let package_read_context = match get_package_read_context(&package_map, "com.android.aconfig.test") {
|
|
||||||
Ok(Some(context)) => context,
|
|
||||||
Ok(None) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'disabled_ro': did not get context");
|
|
||||||
return result;
|
|
||||||
},
|
|
||||||
Err(err) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'disabled_ro': {err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let flag_val_map = match get_mapped_storage_file("system", StorageFileType::FlagVal) {
|
|
||||||
Ok(val_map) => val_map,
|
|
||||||
Err(err) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'disabled_ro': {err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let value = match get_boolean_flag_value(&flag_val_map, 0 + package_read_context.boolean_start_index) {
|
|
||||||
Ok(val) => val,
|
|
||||||
Err(err) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'disabled_ro': {err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if result != value {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: flag mismatch for 'disabled_ro'. Legacy storage was {result}, new storage was {value}");
|
|
||||||
} else {
|
|
||||||
let default_value = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// query flag disabled_rw
|
/// query flag disabled_rw
|
||||||
@@ -678,257 +532,25 @@ pub fn disabled_rw_in_other_namespace() -> bool {
|
|||||||
/// query flag enabled_fixed_ro
|
/// query flag enabled_fixed_ro
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn enabled_fixed_ro() -> bool {
|
pub fn enabled_fixed_ro() -> bool {
|
||||||
|
true
|
||||||
|
|
||||||
let result = true;
|
|
||||||
if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This will be called multiple times. Subsequent calls after the first
|
|
||||||
// are noops.
|
|
||||||
logger::init(
|
|
||||||
logger::Config::default()
|
|
||||||
.with_tag_on_device(MIGRATION_LOG_TAG)
|
|
||||||
.with_max_level(LevelFilter::Info),
|
|
||||||
);
|
|
||||||
|
|
||||||
unsafe {
|
|
||||||
let package_map = match get_mapped_storage_file("system", StorageFileType::PackageMap) {
|
|
||||||
Ok(file) => file,
|
|
||||||
Err(err) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'enabled_fixed_ro': {err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let package_read_context = match get_package_read_context(&package_map, "com.android.aconfig.test") {
|
|
||||||
Ok(Some(context)) => context,
|
|
||||||
Ok(None) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'enabled_fixed_ro': did not get context");
|
|
||||||
return result;
|
|
||||||
},
|
|
||||||
Err(err) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'enabled_fixed_ro': {err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let flag_val_map = match get_mapped_storage_file("system", StorageFileType::FlagVal) {
|
|
||||||
Ok(val_map) => val_map,
|
|
||||||
Err(err) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'enabled_fixed_ro': {err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let value = match get_boolean_flag_value(&flag_val_map, 4 + package_read_context.boolean_start_index) {
|
|
||||||
Ok(val) => val,
|
|
||||||
Err(err) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'enabled_fixed_ro': {err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if result != value {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: flag mismatch for 'enabled_fixed_ro'. Legacy storage was {result}, new storage was {value}");
|
|
||||||
} else {
|
|
||||||
let default_value = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// query flag enabled_fixed_ro_exported
|
/// query flag enabled_fixed_ro_exported
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn enabled_fixed_ro_exported() -> bool {
|
pub fn enabled_fixed_ro_exported() -> bool {
|
||||||
|
true
|
||||||
|
|
||||||
let result = true;
|
|
||||||
if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This will be called multiple times. Subsequent calls after the first
|
|
||||||
// are noops.
|
|
||||||
logger::init(
|
|
||||||
logger::Config::default()
|
|
||||||
.with_tag_on_device(MIGRATION_LOG_TAG)
|
|
||||||
.with_max_level(LevelFilter::Info),
|
|
||||||
);
|
|
||||||
|
|
||||||
unsafe {
|
|
||||||
let package_map = match get_mapped_storage_file("system", StorageFileType::PackageMap) {
|
|
||||||
Ok(file) => file,
|
|
||||||
Err(err) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'enabled_fixed_ro_exported': {err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let package_read_context = match get_package_read_context(&package_map, "com.android.aconfig.test") {
|
|
||||||
Ok(Some(context)) => context,
|
|
||||||
Ok(None) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'enabled_fixed_ro_exported': did not get context");
|
|
||||||
return result;
|
|
||||||
},
|
|
||||||
Err(err) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'enabled_fixed_ro_exported': {err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let flag_val_map = match get_mapped_storage_file("system", StorageFileType::FlagVal) {
|
|
||||||
Ok(val_map) => val_map,
|
|
||||||
Err(err) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'enabled_fixed_ro_exported': {err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let value = match get_boolean_flag_value(&flag_val_map, 5 + package_read_context.boolean_start_index) {
|
|
||||||
Ok(val) => val,
|
|
||||||
Err(err) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'enabled_fixed_ro_exported': {err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if result != value {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: flag mismatch for 'enabled_fixed_ro_exported'. Legacy storage was {result}, new storage was {value}");
|
|
||||||
} else {
|
|
||||||
let default_value = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// query flag enabled_ro
|
/// query flag enabled_ro
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn enabled_ro() -> bool {
|
pub fn enabled_ro() -> bool {
|
||||||
|
true
|
||||||
|
|
||||||
let result = true;
|
|
||||||
if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This will be called multiple times. Subsequent calls after the first
|
|
||||||
// are noops.
|
|
||||||
logger::init(
|
|
||||||
logger::Config::default()
|
|
||||||
.with_tag_on_device(MIGRATION_LOG_TAG)
|
|
||||||
.with_max_level(LevelFilter::Info),
|
|
||||||
);
|
|
||||||
|
|
||||||
unsafe {
|
|
||||||
let package_map = match get_mapped_storage_file("system", StorageFileType::PackageMap) {
|
|
||||||
Ok(file) => file,
|
|
||||||
Err(err) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'enabled_ro': {err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let package_read_context = match get_package_read_context(&package_map, "com.android.aconfig.test") {
|
|
||||||
Ok(Some(context)) => context,
|
|
||||||
Ok(None) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'enabled_ro': did not get context");
|
|
||||||
return result;
|
|
||||||
},
|
|
||||||
Err(err) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'enabled_ro': {err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let flag_val_map = match get_mapped_storage_file("system", StorageFileType::FlagVal) {
|
|
||||||
Ok(val_map) => val_map,
|
|
||||||
Err(err) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'enabled_ro': {err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let value = match get_boolean_flag_value(&flag_val_map, 6 + package_read_context.boolean_start_index) {
|
|
||||||
Ok(val) => val,
|
|
||||||
Err(err) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'enabled_ro': {err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if result != value {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: flag mismatch for 'enabled_ro'. Legacy storage was {result}, new storage was {value}");
|
|
||||||
} else {
|
|
||||||
let default_value = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// query flag enabled_ro_exported
|
/// query flag enabled_ro_exported
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn enabled_ro_exported() -> bool {
|
pub fn enabled_ro_exported() -> bool {
|
||||||
|
true
|
||||||
|
|
||||||
let result = true;
|
|
||||||
if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This will be called multiple times. Subsequent calls after the first
|
|
||||||
// are noops.
|
|
||||||
logger::init(
|
|
||||||
logger::Config::default()
|
|
||||||
.with_tag_on_device(MIGRATION_LOG_TAG)
|
|
||||||
.with_max_level(LevelFilter::Info),
|
|
||||||
);
|
|
||||||
|
|
||||||
unsafe {
|
|
||||||
let package_map = match get_mapped_storage_file("system", StorageFileType::PackageMap) {
|
|
||||||
Ok(file) => file,
|
|
||||||
Err(err) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'enabled_ro_exported': {err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let package_read_context = match get_package_read_context(&package_map, "com.android.aconfig.test") {
|
|
||||||
Ok(Some(context)) => context,
|
|
||||||
Ok(None) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'enabled_ro_exported': did not get context");
|
|
||||||
return result;
|
|
||||||
},
|
|
||||||
Err(err) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'enabled_ro_exported': {err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let flag_val_map = match get_mapped_storage_file("system", StorageFileType::FlagVal) {
|
|
||||||
Ok(val_map) => val_map,
|
|
||||||
Err(err) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'enabled_ro_exported': {err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let value = match get_boolean_flag_value(&flag_val_map, 7 + package_read_context.boolean_start_index) {
|
|
||||||
Ok(val) => val,
|
|
||||||
Err(err) => {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag 'enabled_ro_exported': {err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if result != value {
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: flag mismatch for 'enabled_ro_exported'. Legacy storage was {result}, new storage was {value}");
|
|
||||||
} else {
|
|
||||||
let default_value = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// query flag enabled_rw
|
/// query flag enabled_rw
|
||||||
@@ -1203,10 +825,6 @@ use std::io::Write;
|
|||||||
use std::sync::LazyLock;
|
use std::sync::LazyLock;
|
||||||
use log::{log, LevelFilter, Level};
|
use log::{log, LevelFilter, Level};
|
||||||
|
|
||||||
static STORAGE_MIGRATION_MARKER_FILE: &str =
|
|
||||||
"/metadata/aconfig_test_missions/mission_1";
|
|
||||||
static MIGRATION_LOG_TAG: &str = "AconfigTestMission1";
|
|
||||||
|
|
||||||
/// flag provider
|
/// flag provider
|
||||||
pub struct FlagProvider;
|
pub struct FlagProvider;
|
||||||
|
|
||||||
@@ -1275,10 +893,6 @@ use std::io::Write;
|
|||||||
use std::sync::LazyLock;
|
use std::sync::LazyLock;
|
||||||
use log::{log, LevelFilter, Level};
|
use log::{log, LevelFilter, Level};
|
||||||
|
|
||||||
static STORAGE_MIGRATION_MARKER_FILE: &str =
|
|
||||||
"/metadata/aconfig_test_missions/mission_1";
|
|
||||||
static MIGRATION_LOG_TAG: &str = "AconfigTestMission1";
|
|
||||||
|
|
||||||
/// flag provider
|
/// flag provider
|
||||||
pub struct FlagProvider;
|
pub struct FlagProvider;
|
||||||
|
|
||||||
|
@@ -5,15 +5,15 @@ use std::io::Write;
|
|||||||
use std::sync::LazyLock;
|
use std::sync::LazyLock;
|
||||||
use log::\{log, LevelFilter, Level};
|
use log::\{log, LevelFilter, Level};
|
||||||
|
|
||||||
static STORAGE_MIGRATION_MARKER_FILE: &str =
|
|
||||||
"/metadata/aconfig_test_missions/mission_1";
|
|
||||||
static MIGRATION_LOG_TAG: &str = "AconfigTestMission1";
|
|
||||||
|
|
||||||
/// flag provider
|
/// flag provider
|
||||||
pub struct FlagProvider;
|
pub struct FlagProvider;
|
||||||
|
|
||||||
{{ if has_readwrite- }}
|
{{ if has_readwrite- }}
|
||||||
{{ if allow_instrumentation }}
|
{{ if allow_instrumentation }}
|
||||||
|
static READ_FROM_NEW_STORAGE: LazyLock<bool> = LazyLock::new(|| unsafe \{
|
||||||
|
Path::new("/metadata/aconfig/boot/enable_only_new_storage").exists()
|
||||||
|
});
|
||||||
|
|
||||||
static PACKAGE_OFFSET: LazyLock<Result<Option<u32>, AconfigStorageError>> = LazyLock::new(|| unsafe \{
|
static PACKAGE_OFFSET: LazyLock<Result<Option<u32>, AconfigStorageError>> = LazyLock::new(|| unsafe \{
|
||||||
get_mapped_storage_file("{container}", StorageFileType::PackageMap)
|
get_mapped_storage_file("{container}", StorageFileType::PackageMap)
|
||||||
.and_then(|package_map| get_package_read_context(&package_map, "{package}"))
|
.and_then(|package_map| get_package_read_context(&package_map, "{package}"))
|
||||||
@@ -30,24 +30,15 @@ static FLAG_VAL_MAP: LazyLock<Result<Mmap, AconfigStorageError>> = LazyLock::new
|
|||||||
/// flag value cache for {flag.name}
|
/// flag value cache for {flag.name}
|
||||||
{{ if allow_instrumentation }}
|
{{ if allow_instrumentation }}
|
||||||
static CACHED_{flag.name}: LazyLock<bool> = LazyLock::new(|| \{
|
static CACHED_{flag.name}: LazyLock<bool> = LazyLock::new(|| \{
|
||||||
let result = flags_rust::GetServerConfigurableFlag(
|
|
||||||
"aconfig_flags.{flag.device_config_namespace}",
|
|
||||||
"{flag.device_config_flag}",
|
|
||||||
"{flag.default_value}") == "true";
|
|
||||||
|
|
||||||
let use_new_storage_value = flags_rust::GetServerConfigurableFlag(
|
if *READ_FROM_NEW_STORAGE \{
|
||||||
"aconfig_flags.core_experiments_team_internal",
|
|
||||||
"com.android.providers.settings.use_new_storage_value",
|
|
||||||
"false") == "true";
|
|
||||||
|
|
||||||
if Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() \{
|
|
||||||
// This will be called multiple times. Subsequent calls after the first are noops.
|
// This will be called multiple times. Subsequent calls after the first are noops.
|
||||||
logger::init(
|
logger::init(
|
||||||
logger::Config::default()
|
logger::Config::default()
|
||||||
.with_tag_on_device(MIGRATION_LOG_TAG)
|
.with_tag_on_device("aconfig_rust_codegen")
|
||||||
.with_max_level(LevelFilter::Info));
|
.with_max_level(LevelFilter::Info));
|
||||||
|
|
||||||
let aconfig_storage_result = FLAG_VAL_MAP
|
let flag_value_result = FLAG_VAL_MAP
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map_err(|err| format!("failed to get flag val map: \{err}"))
|
.map_err(|err| format!("failed to get flag val map: \{err}"))
|
||||||
.and_then(|flag_val_map| \{
|
.and_then(|flag_val_map| \{
|
||||||
@@ -65,33 +56,23 @@ static CACHED_{flag.name}: LazyLock<bool> = LazyLock::new(|| \{
|
|||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
match aconfig_storage_result \{
|
match flag_value_result \{
|
||||||
Ok(storage_result) if storage_result == result => \{
|
Ok(flag_value) => \{
|
||||||
if use_new_storage_value \{
|
return flag_value;
|
||||||
return storage_result;
|
|
||||||
} else \{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
Ok(storage_result) => \{
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: mismatch for flag '{flag.name}'. Legacy storage was \{result}, new storage was \{storage_result}");
|
|
||||||
if use_new_storage_value \{
|
|
||||||
return storage_result;
|
|
||||||
} else \{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
Err(err) => \{
|
Err(err) => \{
|
||||||
log!(Level::Error, "AconfigTestMission1: error: \{err}");
|
log!(Level::Error, "aconfig_rust_codegen: error: \{err}");
|
||||||
if use_new_storage_value \{
|
panic!("failed to read flag value: \{err}");
|
||||||
panic!("failed to read flag value: \{err}");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else \{
|
||||||
|
flags_rust::GetServerConfigurableFlag(
|
||||||
|
"aconfig_flags.{flag.device_config_namespace}",
|
||||||
|
"{flag.device_config_flag}",
|
||||||
|
"{flag.default_value}") == "true"
|
||||||
}
|
}
|
||||||
|
|
||||||
result
|
});
|
||||||
});
|
|
||||||
{{ else }}
|
{{ else }}
|
||||||
static CACHED_{flag.name}: LazyLock<bool> = LazyLock::new(|| flags_rust::GetServerConfigurableFlag(
|
static CACHED_{flag.name}: LazyLock<bool> = LazyLock::new(|| flags_rust::GetServerConfigurableFlag(
|
||||||
"aconfig_flags.{flag.device_config_namespace}",
|
"aconfig_flags.{flag.device_config_namespace}",
|
||||||
@@ -123,72 +104,11 @@ pub static PROVIDER: FlagProvider = FlagProvider;
|
|||||||
{{ for flag in template_flags }}
|
{{ for flag in template_flags }}
|
||||||
/// query flag {flag.name}
|
/// query flag {flag.name}
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
{{ -if flag.readwrite }}
|
|
||||||
pub fn {flag.name}() -> bool \{
|
pub fn {flag.name}() -> bool \{
|
||||||
|
{{ -if flag.readwrite }}
|
||||||
PROVIDER.{flag.name}()
|
PROVIDER.{flag.name}()
|
||||||
{{ -else }}
|
{{ -else }}
|
||||||
pub fn {flag.name}() -> bool \{
|
|
||||||
{{ if not allow_instrumentation }}
|
|
||||||
{flag.default_value}
|
{flag.default_value}
|
||||||
{{ else }}
|
|
||||||
|
|
||||||
let result = {flag.default_value};
|
|
||||||
if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() \{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This will be called multiple times. Subsequent calls after the first
|
|
||||||
// are noops.
|
|
||||||
logger::init(
|
|
||||||
logger::Config::default()
|
|
||||||
.with_tag_on_device(MIGRATION_LOG_TAG)
|
|
||||||
.with_max_level(LevelFilter::Info),
|
|
||||||
);
|
|
||||||
|
|
||||||
unsafe \{
|
|
||||||
let package_map = match get_mapped_storage_file("{flag.container}", StorageFileType::PackageMap) \{
|
|
||||||
Ok(file) => file,
|
|
||||||
Err(err) => \{
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag '{flag.name}': \{err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let package_read_context = match get_package_read_context(&package_map, "{package}") \{
|
|
||||||
Ok(Some(context)) => context,
|
|
||||||
Ok(None) => \{
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag '{flag.name}': did not get context");
|
|
||||||
return result;
|
|
||||||
},
|
|
||||||
Err(err) => \{
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag '{flag.name}': \{err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let flag_val_map = match get_mapped_storage_file("{flag.container}", StorageFileType::FlagVal) \{
|
|
||||||
Ok(val_map) => val_map,
|
|
||||||
Err(err) => \{
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag '{flag.name}': \{err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let value = match get_boolean_flag_value(&flag_val_map, {flag.flag_offset} + package_read_context.boolean_start_index) \{
|
|
||||||
Ok(val) => val,
|
|
||||||
Err(err) => \{
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: failed to read flag '{flag.name}': \{err}");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if result != value \{
|
|
||||||
log!(Level::Error, "AconfigTestMission1: error: flag mismatch for '{flag.name}'. Legacy storage was \{result}, new storage was \{value}");
|
|
||||||
} else \{
|
|
||||||
let default_value = {flag.default_value};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result
|
|
||||||
{{ endif }}
|
|
||||||
{{ -endif }}
|
{{ -endif }}
|
||||||
}
|
}
|
||||||
{{ endfor }}
|
{{ endfor }}
|
||||||
|
Reference in New Issue
Block a user