From 36c02987c6fe5249143783bb9c43a8e5461eb1b9 Mon Sep 17 00:00:00 2001 From: junyulai Date: Fri, 26 Mar 2021 00:40:48 +0800 Subject: [PATCH] Fix nascent timer never get removed By design, the nascent timer will be removed after a network satisfied first request. However, this never happens. Because the mInactive is false when that happens, so isNascent is never true. Furthermore, when removing a nascent timer, the inactivity state can never be updated since no condition in the updateInactivityState will be met to update the state correctly. Thus, update inactive state accordingly when adding/removing the nascent timer. Test: TH Bug: 184227264 Merged-In: I3c2563d4ae4e3715d0c6270344ba8f7ef067872f Merged-In: I4c1521b6e0ef68ac489771a2ab6b09ef3e381577 Change-Id: I4c1521b6e0ef68ac489771a2ab6b09ef3e381577 (cherry-picked from ag/14060609) --- .../src/com/android/server/ConnectivityService.java | 2 ++ .../com/android/server/ConnectivityServiceTest.java | 13 +++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java index 0166fc0c5c..b804a51a48 100644 --- a/service/src/com/android/server/ConnectivityService.java +++ b/service/src/com/android/server/ConnectivityService.java @@ -7851,6 +7851,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // all networks except in the case of an underlying network for a VCN. if (newSatisfier.isNascent()) { newSatisfier.unlingerRequest(NetworkRequest.REQUEST_ID_NONE); + newSatisfier.unsetInactive(); } // if newSatisfier is not null, then newRequest may not be null. @@ -8355,6 +8356,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // But it will be removed as soon as the network satisfies a request for the first time. networkAgent.lingerRequest(NetworkRequest.REQUEST_ID_NONE, SystemClock.elapsedRealtime(), mNascentDelayMs); + networkAgent.setInactive(); // Consider network even though it is not yet validated. rematchAllNetworksAndRequests(); diff --git a/tests/unit/java/com/android/server/ConnectivityServiceTest.java b/tests/unit/java/com/android/server/ConnectivityServiceTest.java index e275a5e213..52f7a1a1f2 100644 --- a/tests/unit/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/unit/java/com/android/server/ConnectivityServiceTest.java @@ -4567,9 +4567,8 @@ public class ConnectivityServiceTest { expectNoRequestChanged(testFactory); testFactory.assertRequestCountEquals(0); assertFalse(testFactory.getMyStartRequested()); - // ... and cell data to be torn down after nascent network timeout. - cellNetworkCallback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent, - mService.mNascentDelayMs + TEST_CALLBACK_TIMEOUT_MS); + // ... and cell data to be torn down immediately since it is no longer nascent. + cellNetworkCallback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent); waitForIdle(); assertLength(1, mCm.getAllNetworks()); } finally { @@ -11874,6 +11873,11 @@ public class ConnectivityServiceTest { internetFactory.expectRequestRemove(); internetFactory.assertRequestCountEquals(0); + // Create a request that holds the upcoming wifi network. + final TestNetworkCallback wifiCallback = new TestNetworkCallback(); + mCm.requestNetwork(new NetworkRequest.Builder().addTransportType(TRANSPORT_WIFI).build(), + wifiCallback); + // Now WiFi connects and it's unmetered, but it's weaker than cell. mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); mWiFiNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED); @@ -11882,7 +11886,7 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.connect(true); // The OEM_PAID preference prefers an unmetered network to an OEM_PAID network, so - // the oemPaidFactory can't beat this no matter how high its score. + // the oemPaidFactory can't beat wifi no matter how high its score. oemPaidFactory.expectRequestRemove(); expectNoRequestChanged(internetFactory); @@ -11893,6 +11897,7 @@ public class ConnectivityServiceTest { // unmetered network, so the oemPaidNetworkFactory still can't beat this. expectNoRequestChanged(oemPaidFactory); internetFactory.expectRequestAdd(); + mCm.unregisterNetworkCallback(wifiCallback); } /**