Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 869fdd13 authored by Dennis Shen's avatar Dennis Shen Committed by Gerrit Code Review
Browse files

Merge "aconfig: update rust_codegen to just read from new storage when flag is true" into main

parents 0b181c90 1b0a6667
Loading
Loading
Loading
Loading
+61 −447
Original line number Diff line number Diff line
@@ -116,10 +116,6 @@ use std::io::Write;
use std::sync::LazyLock;
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
pub struct FlagProvider;

@@ -260,13 +256,13 @@ use std::io::Write;
use std::sync::LazyLock;
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
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 {
    get_mapped_storage_file("system", StorageFileType::PackageMap)
    .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
static CACHED_disabled_rw: LazyLock<bool> = LazyLock::new(|| {
    let result = flags_rust::GetServerConfigurableFlag(
        "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() {
    if *READ_FROM_NEW_STORAGE {
        // 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_tag_on_device("aconfig_rust_codegen")
                .with_max_level(LevelFilter::Info));

        let aconfig_storage_result = FLAG_VAL_MAP
        let flag_value_result = FLAG_VAL_MAP
            .as_ref()
            .map_err(|err| format!("failed to get flag val map: {err}"))
            .and_then(|flag_val_map| {
@@ -314,54 +300,33 @@ static CACHED_disabled_rw: LazyLock<bool> = LazyLock::new(|| {
                    })
                });

        match aconfig_storage_result {
            Ok(storage_result) if storage_result == result => {
                if use_new_storage_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;
                }
        match flag_value_result {
            Ok(flag_value) => {
                 return flag_value;
            },
            Err(err) => {
                log!(Level::Error, "AconfigTestMission1: error: {err}");
                if use_new_storage_value {
                log!(Level::Error, "aconfig_rust_codegen: error: {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
static CACHED_disabled_rw_exported: LazyLock<bool> = LazyLock::new(|| {
    let result = flags_rust::GetServerConfigurableFlag(
        "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() {
    if *READ_FROM_NEW_STORAGE {
        // 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_tag_on_device("aconfig_rust_codegen")
                .with_max_level(LevelFilter::Info));

        let aconfig_storage_result = FLAG_VAL_MAP
        let flag_value_result = FLAG_VAL_MAP
            .as_ref()
            .map_err(|err| format!("failed to get flag val map: {err}"))
            .and_then(|flag_val_map| {
@@ -379,54 +344,33 @@ static CACHED_disabled_rw_exported: LazyLock<bool> = LazyLock::new(|| {
                    })
                });

        match aconfig_storage_result {
            Ok(storage_result) if storage_result == result => {
                if use_new_storage_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;
                }
        match flag_value_result {
            Ok(flag_value) => {
                 return flag_value;
            },
            Err(err) => {
                log!(Level::Error, "AconfigTestMission1: error: {err}");
                if use_new_storage_value {
                log!(Level::Error, "aconfig_rust_codegen: error: {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
static CACHED_disabled_rw_in_other_namespace: LazyLock<bool> = LazyLock::new(|| {
    let result = flags_rust::GetServerConfigurableFlag(
        "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() {
    if *READ_FROM_NEW_STORAGE {
        // 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_tag_on_device("aconfig_rust_codegen")
                .with_max_level(LevelFilter::Info));

        let aconfig_storage_result = FLAG_VAL_MAP
        let flag_value_result = FLAG_VAL_MAP
            .as_ref()
            .map_err(|err| format!("failed to get flag val map: {err}"))
            .and_then(|flag_val_map| {
@@ -444,55 +388,34 @@ static CACHED_disabled_rw_in_other_namespace: LazyLock<bool> = LazyLock::new(||
                    })
                });

        match aconfig_storage_result {
            Ok(storage_result) if storage_result == result => {
                if use_new_storage_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;
                }
        match flag_value_result {
            Ok(flag_value) => {
                 return flag_value;
            },
            Err(err) => {
                log!(Level::Error, "AconfigTestMission1: error: {err}");
                if use_new_storage_value {
                log!(Level::Error, "aconfig_rust_codegen: error: {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
static CACHED_enabled_rw: LazyLock<bool> = LazyLock::new(|| {
    let result = flags_rust::GetServerConfigurableFlag(
        "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() {
    if *READ_FROM_NEW_STORAGE {
        // 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_tag_on_device("aconfig_rust_codegen")
                .with_max_level(LevelFilter::Info));

        let aconfig_storage_result = FLAG_VAL_MAP
        let flag_value_result = FLAG_VAL_MAP
            .as_ref()
            .map_err(|err| format!("failed to get flag val map: {err}"))
            .and_then(|flag_val_map| {
@@ -510,32 +433,21 @@ static CACHED_enabled_rw: LazyLock<bool> = LazyLock::new(|| {
                    })
                });

        match aconfig_storage_result {
            Ok(storage_result) if storage_result == result => {
                if use_new_storage_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;
                }
        match flag_value_result {
            Ok(flag_value) => {
                 return flag_value;
            },
            Err(err) => {
                log!(Level::Error, "AconfigTestMission1: error: {err}");
                if use_new_storage_value {
                log!(Level::Error, "aconfig_rust_codegen: error: {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 {
@@ -596,65 +508,7 @@ pub static PROVIDER: FlagProvider = FlagProvider;
/// query flag disabled_ro
#[inline(always)]
pub fn disabled_ro() -> bool {


    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

   false
}

/// query flag disabled_rw
@@ -678,257 +532,25 @@ pub fn disabled_rw_in_other_namespace() -> bool {
/// query flag enabled_fixed_ro
#[inline(always)]
pub fn enabled_fixed_ro() -> bool {


    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

    true
}

/// query flag enabled_fixed_ro_exported
#[inline(always)]
pub fn enabled_fixed_ro_exported() -> bool {


    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

    true
}

/// query flag enabled_ro
#[inline(always)]
pub fn enabled_ro() -> bool {


    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

    true
}

/// query flag enabled_ro_exported
#[inline(always)]
pub fn enabled_ro_exported() -> bool {


    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

    true
}

/// query flag enabled_rw
@@ -1203,10 +825,6 @@ use std::io::Write;
use std::sync::LazyLock;
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
pub struct FlagProvider;

@@ -1275,10 +893,6 @@ use std::io::Write;
use std::sync::LazyLock;
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
pub struct FlagProvider;

+19 −99

File changed.

Preview size limit exceeded, changes collapsed.