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

Commit f0541557 authored by JW Wang's avatar JW Wang
Browse files

Fix a race in setExplicitHealthCheckEnabled() (4/n)

Sometimes the property change callback is not called within the
sleep timeout. Let's call updateConfigs() to apply device config
changes immediately to eliminate the race condition.

Bug: 178675924
Test: atest PackageWatchdogTest
Change-Id: I2b3ce79eac36cfc5ef98a62750142bb6d936e043
parent 757da37e
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -994,7 +994,8 @@ public class PackageWatchdog {
     * Health check is enabled or disabled after reading the flags
     * Health check is enabled or disabled after reading the flags
     * from DeviceConfig.
     * from DeviceConfig.
     */
     */
    private void updateConfigs() {
    @VisibleForTesting
    void updateConfigs() {
        synchronized (mLock) {
        synchronized (mLock) {
            mTriggerFailureCount = DeviceConfig.getInt(
            mTriggerFailureCount = DeviceConfig.getInt(
                    DeviceConfig.NAMESPACE_ROLLBACK,
                    DeviceConfig.NAMESPACE_ROLLBACK,
+9 −5
Original line number Original line Diff line number Diff line
@@ -98,6 +98,8 @@ public class PackageWatchdogTest {
    private final TestClock mTestClock = new TestClock();
    private final TestClock mTestClock = new TestClock();
    private TestLooper mTestLooper;
    private TestLooper mTestLooper;
    private Context mSpyContext;
    private Context mSpyContext;
    // Keep track of all created watchdogs to apply device config changes
    private List<PackageWatchdog> mAllocatedWatchdogs;
    @Mock
    @Mock
    private ConnectivityModuleConnector mConnectivityModuleConnector;
    private ConnectivityModuleConnector mConnectivityModuleConnector;
    @Mock
    @Mock
@@ -166,12 +168,15 @@ public class PackageWatchdogTest {
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ROLLBACK,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ROLLBACK,
                PackageWatchdog.PROPERTY_WATCHDOG_TRIGGER_FAILURE_COUNT,
                PackageWatchdog.PROPERTY_WATCHDOG_TRIGGER_FAILURE_COUNT,
                Integer.toString(PackageWatchdog.DEFAULT_TRIGGER_FAILURE_COUNT), false);
                Integer.toString(PackageWatchdog.DEFAULT_TRIGGER_FAILURE_COUNT), false);

        mAllocatedWatchdogs = new ArrayList<>();
    }
    }


    @After
    @After
    public void tearDown() throws Exception {
    public void tearDown() throws Exception {
        dropShellPermissions();
        dropShellPermissions();
        mSession.finishMocking();
        mSession.finishMocking();
        mAllocatedWatchdogs.clear();
    }
    }


    @Test
    @Test
@@ -1295,11 +1300,9 @@ public class PackageWatchdogTest {
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ROLLBACK,
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ROLLBACK,
                PackageWatchdog.PROPERTY_WATCHDOG_EXPLICIT_HEALTH_CHECK_ENABLED,
                PackageWatchdog.PROPERTY_WATCHDOG_EXPLICIT_HEALTH_CHECK_ENABLED,
                Boolean.toString(enabled), /*makeDefault*/false);
                Boolean.toString(enabled), /*makeDefault*/false);
        //give time for DeviceConfig to broadcast the property value change
        // Call updateConfigs() so device config changes take effect immediately
        try {
        for (PackageWatchdog watchdog : mAllocatedWatchdogs) {
            Thread.sleep(SHORT_DURATION);
            watchdog.updateConfigs();
        } catch (InterruptedException e) {
            fail("Thread.sleep unexpectedly failed!");
        }
        }
    }
    }


@@ -1348,6 +1351,7 @@ public class PackageWatchdogTest {
            verify(mConnectivityModuleConnector).registerHealthListener(
            verify(mConnectivityModuleConnector).registerHealthListener(
                    mConnectivityModuleCallbackCaptor.capture());
                    mConnectivityModuleCallbackCaptor.capture());
        }
        }
        mAllocatedWatchdogs.add(watchdog);
        return watchdog;
        return watchdog;
    }
    }