[NS B04] Make the network selection request-major.

This patch marks the most important turning point of this
refactoring. Cleanups removing unused code will follow.

Replace the old network-major reassignment computation with a
much simpler and faster loop that takes each request and assigns
it the highest-scoring network.

All tests pass, of course.

Bug: 113554781
Test: FrameworksNetTests
Change-Id: Ie143802995155151a38a4eb1d2f26c3f29e556bd
This commit is contained in:
Chalard Jean
2019-12-10 21:08:07 +09:00
parent 373391b2cd
commit 013fb14441

View File

@@ -6733,15 +6733,37 @@ public class ConnectivityService extends IConnectivityManager.Stub
@NonNull
private NetworkReassignment computeNetworkReassignment() {
ensureRunningOnConnectivityServiceThread();
final NetworkAgentInfo[] nais = mNetworkAgentInfos.values().toArray(
new NetworkAgentInfo[mNetworkAgentInfos.size()]);
// Rematch higher scoring networks first to prevent requests first matching a lower
// scoring network and then a higher scoring network, which could produce multiple
// callbacks.
Arrays.sort(nais);
final NetworkReassignment changes = computeInitialReassignment();
for (final NetworkAgentInfo nai : nais) {
rematchNetworkAndRequests(changes, nai);
final NetworkReassignment changes = new NetworkReassignment();
// Gather the list of all relevant agents and sort them by score.
final ArrayList<NetworkAgentInfo> nais = new ArrayList<>();
for (final NetworkAgentInfo nai : mNetworkAgentInfos.values()) {
if (!nai.everConnected) continue;
nais.add(nai);
changes.addRematchedNetwork(new NetworkReassignment.NetworkBgStatePair(nai,
nai.isBackgroundNetwork()));
}
Collections.sort(nais);
for (final NetworkRequestInfo nri : mNetworkRequests.values()) {
if (nri.request.isListen()) continue;
// Find the top scoring network satisfying this request.
NetworkAgentInfo bestNetwork = null;
for (final NetworkAgentInfo nai : nais) {
if (!nai.satisfies(nri.request)) continue;
bestNetwork = nai;
// As the nais are sorted by score, this is the top-scoring network that can
// satisfy this request. The best network for this request has been found,
// go process the next NRI
break;
}
// If no NAI satisfies this request, bestNetwork is still null. That's fine : it
// means no network can satisfy the request. If nri.mSatisfier is not null, it just
// means the network that used to satisfy the request stopped satisfying it.
if (nri.mSatisfier != bestNetwork) {
changes.addRequestReassignment(new NetworkReassignment.RequestReassignment(
nri, nri.mSatisfier, bestNetwork));
}
}
return changes;
}
@@ -6751,11 +6773,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
* being disconnected.
*/
private void rematchAllNetworksAndRequests() {
// TODO: This may be slow, and should be optimized. Unfortunately at this moment the
// processing is network-major instead of request-major (the code iterates through all
// networks, then for each it iterates for all requests), which is a problem for re-scoring
// requests. Once the code has switched to a request-major iteration style, this can
// be optimized to only do the processing needed.
// TODO: This may be slow, and should be optimized.
final long now = SystemClock.elapsedRealtime();
final NetworkAgentInfo oldDefaultNetwork = getDefaultNetwork();
final NetworkReassignment changes = computeNetworkReassignment();