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

Commit 56b9b7a3 authored by zhidou's avatar zhidou Committed by Zhi Dou
Browse files

Add counter for bulk sync and check namespace in comparison

This commit changes the following

1. Add counter to bulk sync. The code will compare the local counter and
   the server counter to decide if a bulk sync should be executed. As
   continue fixing issues in the new storage system, we need to force
   the bulk sync after each fix. This change enable to trigger the
   update on the server side.

2. check namespace in comparison. Some flags have changed their
   namespace, but the server, and device keep the old flags. When the
   comparison is running it will pick the first flag it meets, which
   might be the old one. So this change will check the namespace, and
   only pick the right one.

Test: atest
SettingsProviderTest: com.android.providers.settings.SettingsStateTest
Bug: 349855915
Change-Id: Ib54f5217b96fa9a66bafc6a2adfee483f5f093bb
parent c5002e47
Loading
Loading
Loading
Loading
+34 −18
Original line number Diff line number Diff line
@@ -203,6 +203,12 @@ final class SettingsState {

    private static final String NULL_VALUE = "null";

    // TOBO(b/312444587): remove after Test Mission 2.
    // Bulk sync names
    private static final String BULK_SYNC_MARKER = "aconfigd_marker/bulk_synced";
    private static final String BULK_SYNC_TRIGGER_COUNTER =
        "core_experiments_team_internal/BulkSyncTriggerCounterFlag__bulk_sync_trigger_counter";

    private static final ArraySet<String> sSystemPackages = new ArraySet<>();

    private final Object mWriteLock = new Object();
@@ -409,8 +415,7 @@ final class SettingsState {
                    }
                }
                // TOBO(b/312444587): remove the comparison logic after Test Mission 2.
                if (mSettings.get("aconfigd_marker/bulk_synced").value.equals("true")
                        && requests == null) {
                if (requests == null) {
                    Map<String, AconfigdFlagInfo> aconfigdFlagMap =
                            AconfigdJavaUtils.listFlagsValueInNewStorage(localSocket);
                    compareFlagValueInNewStorage(
@@ -534,7 +539,7 @@ final class SettingsState {
            return null;
        }
        AconfigdFlagInfo flag = flagInfoDefault.get(fullFlagName);
        if (flag == null) {
        if (flag == null || !namespace.equals(flag.getNamespace())) {
            return null;
        }

@@ -553,15 +558,33 @@ final class SettingsState {
    public ProtoOutputStream handleBulkSyncToNewStorage(
            Map<String, AconfigdFlagInfo> aconfigFlagMap) {
        // get marker or add marker if it does not exist
        final String bulkSyncMarkerName = new String("aconfigd_marker/bulk_synced");
        Setting markerSetting = mSettings.get(bulkSyncMarkerName);
        Setting markerSetting = mSettings.get(BULK_SYNC_MARKER);
        int localCounter = 0;
        if (markerSetting == null) {
            markerSetting = new Setting(bulkSyncMarkerName, "false", false, "aconfig", "aconfig");
            mSettings.put(bulkSyncMarkerName, markerSetting);
            markerSetting = new Setting(BULK_SYNC_MARKER, "0", false, "aconfig", "aconfig");
            mSettings.put(BULK_SYNC_MARKER, markerSetting);
        }
        try {
            localCounter = Integer.parseInt(markerSetting.value);
        } catch(NumberFormatException e) {
            // reset local counter
            markerSetting.value = "0";
        }

        if (enableAconfigStorageDaemon()) {
            if (markerSetting.value.equals("true")) {
            Setting bulkSyncCounter = mSettings.get(BULK_SYNC_TRIGGER_COUNTER);
            int serverCounter = 0;
            if (bulkSyncCounter != null) {
                try {
                    serverCounter = Integer.parseInt(bulkSyncCounter.value);
                } catch (NumberFormatException e) {
                    // reset the local value of server counter
                    bulkSyncCounter.value = "0";
                }
            }

            boolean shouldSync = localCounter < serverCounter;
            if (!shouldSync) {
                // CASE 1, flag is on, bulk sync marker true, nothing to do
                return null;
            } else {
@@ -600,22 +623,14 @@ final class SettingsState {
                }

                // mark sync has been done
                markerSetting.value = "true";
                markerSetting.value = String.valueOf(serverCounter);
                scheduleWriteIfNeededLocked();
                return requests;
            }
        } else {
            if (markerSetting.value.equals("true")) {
                // CASE 3, flag is off, bulk sync marker true, clear the marker
                markerSetting.value = "false";
                scheduleWriteIfNeededLocked();
                return null;
            } else {
                // CASE 4, flag is off, bulk sync marker false, nothing to do
            return null;
        }
    }
    }

    @GuardedBy("mLock")
    private void loadAconfigDefaultValuesLocked(List<String> filePaths) {
@@ -692,6 +707,7 @@ final class SettingsState {
                                    .setFlagName(flag.getName())
                                    .setDefaultFlagValue(flagValue)
                                    .setIsReadWrite(isReadWrite)
                                    .setNamespace(flag.getNamespace())
                                    .build());
                }
            }
+57 −10
Original line number Diff line number Diff line
@@ -151,12 +151,14 @@ public class SettingsStateTest {
                                                .setFlagName("flag1")
                                                .setDefaultFlagValue("false")
                                                .setIsReadWrite(true)
                                                .setNamespace("test_namespace")
                                                .build();
        AconfigdFlagInfo flag2 = AconfigdFlagInfo.newBuilder()
                                                .setPackageName("com.android.flags")
                                                .setFlagName("flag2")
                                                .setDefaultFlagValue("true")
                                                .setIsReadWrite(false)
                                                .setNamespace("test_namespace")
                                                .build();
        Map<String, AconfigdFlagInfo> flagInfoDefault = new HashMap<>();

@@ -1018,12 +1020,17 @@ public class SettingsStateTest {
                        .setFlagName("flag1")
                        .setDefaultFlagValue("false")
                        .setIsReadWrite(true)
                        .setNamespace("test_namespace")
                        .build();

        flagInfoDefault.put(flag1.getFullFlagName(), flag1);

        // server override
        // not the right namespace
        assertNull(
                settingsState.getFlagOverrideToSync(
                        "some_namespace/com.android.flags.flag1", "true", flagInfoDefault));

        // server override
        settingsState.getFlagOverrideToSync(
                "test_namespace/com.android.flags.flag1", "true", flagInfoDefault);
        assertEquals("com.android.flags", flag1.getPackageName());
@@ -1079,21 +1086,45 @@ public class SettingsStateTest {
                        .setIsReadWrite(false)
                        .build());

        String bulkSyncMarker = "aconfigd_marker/bulk_synced";
        String bulkSyncCounter =
                "core_experiments_team_internal/" +
                "BulkSyncTriggerCounterFlag__bulk_sync_trigger_counter";

        synchronized (lock) {
            settingsState.insertSettingLocked(
                    "aconfigd_marker/bulk_synced", "false", null, false, "aconfig");
            settingsState.insertSettingLocked(bulkSyncMarker, "0", null, false, "aconfig");
            settingsState.insertSettingLocked(bulkSyncCounter, "1", null, false,
                    "com.google.android.platform.core_experiments_team_internal");

            // first bulk sync
            ProtoOutputStream requests = settingsState.handleBulkSyncToNewStorage(flags);
            assertTrue(requests != null);
            String value = settingsState.getSettingLocked("aconfigd_marker/bulk_synced").getValue();
            assertEquals("true", value);
            assertEquals("1", value);

            // send time should no longer bulk sync
            requests = settingsState.handleBulkSyncToNewStorage(flags);
            assertTrue(requests == null);
            assertNull(requests);
            value = settingsState.getSettingLocked("aconfigd_marker/bulk_synced").getValue();
            assertEquals("1", value);

            // won't sync if the marker is string
            settingsState.insertSettingLocked(bulkSyncMarker, "true", null, false, "aconfig");
            settingsState.insertSettingLocked(bulkSyncCounter, "0", null, false,
                    "com.google.android.platform.core_experiments_team_internal");
            requests = settingsState.handleBulkSyncToNewStorage(flags);
            assertNull(requests);
            value = settingsState.getSettingLocked("aconfigd_marker/bulk_synced").getValue();
            assertEquals("true", value);
            assertEquals("0", value);

            // won't sync if the marker and counter value are the same
            settingsState.insertSettingLocked(bulkSyncMarker, "1", null, false, "aconfig");
            settingsState.insertSettingLocked(bulkSyncCounter, "1", null, false,
                    "com.google.android.platform.core_experiments_team_internal");
            requests = settingsState.handleBulkSyncToNewStorage(flags);
            assertNull(requests);
            value = settingsState.getSettingLocked("aconfigd_marker/bulk_synced").getValue();
            assertEquals("1", value);
        }
    }

@@ -1107,21 +1138,34 @@ public class SettingsStateTest {
                SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, Looper.getMainLooper());

        Map<String, AconfigdFlagInfo> flags = new HashMap<>();
        String bulkSyncMarker = "aconfigd_marker/bulk_synced";
        String bulkSyncCounter =
                "core_experiments_team_internal/" +
                "BulkSyncTriggerCounterFlag__bulk_sync_trigger_counter";
        synchronized (lock) {
            settingsState.insertSettingLocked("aconfigd_marker/bulk_synced",
                    "true", null, false, "aconfig");

            // when aconfigd is off, should change the marker to false
            ProtoOutputStream requests = settingsState.handleBulkSyncToNewStorage(flags);
            assertTrue(requests == null);
            assertNull(requests);
            String value = settingsState.getSettingLocked("aconfigd_marker/bulk_synced").getValue();
            assertEquals("false", value);
            assertEquals("0", value);

            // marker started with false value, after call, it should remain false
            requests = settingsState.handleBulkSyncToNewStorage(flags);
            assertTrue(requests == null);
            assertNull(requests);
            value = settingsState.getSettingLocked("aconfigd_marker/bulk_synced").getValue();
            assertEquals("0", value);

            // won't sync
            settingsState.insertSettingLocked(bulkSyncMarker, "0", null, false, "aconfig");
            settingsState.insertSettingLocked(bulkSyncCounter, "1", null, false,
                    "com.google.android.platform.core_experiments_team_internal");
            requests = settingsState.handleBulkSyncToNewStorage(flags);
            assertNull(requests);
            value = settingsState.getSettingLocked("aconfigd_marker/bulk_synced").getValue();
            assertEquals("false", value);
            assertEquals("0", value);
        }
    }

@@ -1164,6 +1208,7 @@ public class SettingsStateTest {
                        .setFlagName("flag1")
                        .setDefaultFlagValue("false")
                        .setIsReadWrite(true)
                        .setNamespace("test_namespace")
                        .build();
        flagInfoDefault.put(flag1.getFullFlagName(), flag1);

@@ -1186,6 +1231,7 @@ public class SettingsStateTest {
                        .setFlagName("flag2")
                        .setDefaultFlagValue("false")
                        .setIsReadWrite(true)
                        .setNamespace("test_namespace")
                        .build();
        flagInfoDefault.put(flag2.getFullFlagName(), flag2);
        synchronized (lock) {
@@ -1207,6 +1253,7 @@ public class SettingsStateTest {
                        .setFlagName("flag3")
                        .setDefaultFlagValue("false")
                        .setIsReadWrite(false)
                        .setNamespace("test_namespace")
                        .build();
        flagInfoDefault.put(flag3.getFullFlagName(), flag3);
        synchronized (lock) {