[NS A44 2/2] Apply requests after all networks rematching is computed

This patch finally separates completely computing the rematch
from all the side effects. A collateral effect of this is to
compute correctly the background network state in
rematchNetworkAndRequests, which compensates the breakage
from the previous patch.

Bug: 113554781
Test: ConnectivityServiceTest
Change-Id: I998c729c385940168fcd6ba3f2e01911f1844ce1
This commit is contained in:
Chalard Jean
2019-12-04 19:55:32 +09:00
parent 1a1d2783cb
commit 208f81bb50

View File

@@ -6601,11 +6601,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
return change;
}
private ArrayMap<NetworkRequestInfo, NetworkAgentInfo> computeRequestReassignmentForNetwork(
@NonNull final NetworkReassignment changes,
private void computeRequestReassignmentForNetwork(@NonNull final NetworkReassignment changes,
@NonNull final NetworkAgentInfo newNetwork) {
final int score = newNetwork.getCurrentScore();
final ArrayMap<NetworkRequestInfo, NetworkAgentInfo> reassignedRequests = new ArrayMap<>();
for (NetworkRequestInfo nri : mNetworkRequests.values()) {
// Process requests in the first pass and listens in the second pass. This allows us to
// change a network's capabilities depending on which requests it has. This is only
@@ -6631,18 +6629,14 @@ public class ConnectivityService extends IConnectivityManager.Stub
+ ", newScore = " + score);
}
if (currentNetwork == null || currentNetwork.getCurrentScore() < score) {
reassignedRequests.put(nri, newNetwork);
changes.addRequestReassignment(new NetworkReassignment.RequestReassignment(
nri, currentNetwork, newNetwork));
}
} else if (newNetwork == currentNetwork) {
reassignedRequests.put(nri, null);
changes.addRequestReassignment(new NetworkReassignment.RequestReassignment(
nri, currentNetwork, null));
}
}
return reassignedRequests;
}
// Handles a network appearing or improving its score.
@@ -6661,7 +6655,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// @param newNetwork is the network to be matched against NetworkRequests.
// @param now the time the rematch starts, as returned by SystemClock.elapsedRealtime();
private void rematchNetworkAndRequests(@NonNull final NetworkReassignment changes,
@NonNull final NetworkAgentInfo newNetwork, final long now) {
@NonNull final NetworkAgentInfo newNetwork) {
ensureRunningOnConnectivityServiceThread();
if (!newNetwork.everConnected) return;
@@ -6670,18 +6664,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (VDBG || DDBG) log("rematching " + newNetwork.name());
final ArrayMap<NetworkRequestInfo, NetworkAgentInfo> reassignedRequests =
computeRequestReassignmentForNetwork(changes, newNetwork);
// Find and migrate to this Network any NetworkRequests for
// which this network is now the best.
for (final Map.Entry<NetworkRequestInfo, NetworkAgentInfo> entry :
reassignedRequests.entrySet()) {
final NetworkRequestInfo nri = entry.getKey();
final NetworkAgentInfo previousSatisfier = nri.mSatisfier;
final NetworkAgentInfo newSatisfier = entry.getValue();
updateSatisfiersForRematchRequest(nri, previousSatisfier, newSatisfier, now);
}
computeRequestReassignmentForNetwork(changes, newNetwork);
}
private void updateSatisfiersForRematchRequest(@NonNull final NetworkRequestInfo nri,
@@ -6734,7 +6717,20 @@ public class ConnectivityService extends IConnectivityManager.Stub
Arrays.sort(nais);
final NetworkReassignment changes = computeInitialReassignment();
for (final NetworkAgentInfo nai : nais) {
rematchNetworkAndRequests(changes, nai, now);
rematchNetworkAndRequests(changes, nai);
}
// Now that the entire rematch is computed, update the lists of satisfied requests in
// the network agents. This is necessary because some code later depends on this state
// to be correct, most prominently computing the linger status.
for (final NetworkReassignment.RequestReassignment event :
changes.getRequestReassignments()) {
// The rematch is seeded with an entry for each request, and requests that don't
// change satisfiers have the same network as old and new.
// TODO : remove these entries when they are not needed any more.
if (event.mOldNetwork == event.mNewNetwork) continue;
updateSatisfiersForRematchRequest(event.mRequest, event.mOldNetwork,
event.mNewNetwork, now);
}
final NetworkRequestInfo defaultRequestInfo = mNetworkRequests.get(mDefaultRequest);