Fix default network transition event recording
When disconnecting from a default network X and falling back on another connected network Y as the new default, ConnectivityService was attempting to record this event as a X -> Y "atomic" transition. In practice the default network connectivity is actually lost and recovering default network takes some non-zero time. This patch changes the event recording to always record disconnection as X -> 0 events. At the same time, if there is a fallback network that is elected as the new default ConnectivityService will also record a 0 -> Y event. This patch also improves pretty-printing of DefaultNetworkEvent. Extract from $ adb shell dumpsys connectivity_metrics_logger --events 17:51:00.086: DefaultNetworkEvent(0 -> 100:CELLULAR) 17:51:25.232: DefaultNetworkEvent(100:IPv4 -> 101:WIFI) # wifi goes on 17:51:44.064: DefaultNetworkEvent(101:DUAL -> 0) # wifi goes off 17:51:44.187: DefaultNetworkEvent(0 -> 100:CELLULAR) Bug: 28204408 Change-Id: I63252633235bf6ba833b9ac431a80dda75a93e67
This commit is contained in:
@@ -2245,6 +2245,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
final boolean wasDefault = isDefaultNetwork(nai);
|
final boolean wasDefault = isDefaultNetwork(nai);
|
||||||
if (wasDefault) {
|
if (wasDefault) {
|
||||||
mDefaultInetConditionPublished = 0;
|
mDefaultInetConditionPublished = 0;
|
||||||
|
// Log default network disconnection before required book-keeping.
|
||||||
|
// Let rematchAllNetworksAndRequests() below record a new default network event
|
||||||
|
// if there is a fallback. Taken together, the two form a X -> 0, 0 -> Y sequence
|
||||||
|
// whose timestamps tell how long it takes to recover a default network.
|
||||||
|
logDefaultNetworkEvent(null, nai);
|
||||||
}
|
}
|
||||||
notifyIfacesChangedForNetworkStats();
|
notifyIfacesChangedForNetworkStats();
|
||||||
// TODO - we shouldn't send CALLBACK_LOST to requests that can be satisfied
|
// TODO - we shouldn't send CALLBACK_LOST to requests that can be satisfied
|
||||||
@@ -2278,10 +2283,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
}
|
}
|
||||||
mLegacyTypeTracker.remove(nai, wasDefault);
|
mLegacyTypeTracker.remove(nai, wasDefault);
|
||||||
rematchAllNetworksAndRequests(null, 0);
|
rematchAllNetworksAndRequests(null, 0);
|
||||||
if (wasDefault && getDefaultNetwork() == null) {
|
|
||||||
// Log that we lost the default network and there is no replacement.
|
|
||||||
logDefaultNetworkEvent(null, nai);
|
|
||||||
}
|
|
||||||
if (nai.created) {
|
if (nai.created) {
|
||||||
// Tell netd to clean up the configuration for this network
|
// Tell netd to clean up the configuration for this network
|
||||||
// (routing rules, DNS, etc).
|
// (routing rules, DNS, etc).
|
||||||
@@ -4583,7 +4584,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
teardownUnneededNetwork(oldNetwork);
|
teardownUnneededNetwork(oldNetwork);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void makeDefault(NetworkAgentInfo newNetwork, NetworkAgentInfo prevNetwork) {
|
private void makeDefault(NetworkAgentInfo newNetwork) {
|
||||||
if (DBG) log("Switching to new default network: " + newNetwork);
|
if (DBG) log("Switching to new default network: " + newNetwork);
|
||||||
setupDataActivityTracking(newNetwork);
|
setupDataActivityTracking(newNetwork);
|
||||||
try {
|
try {
|
||||||
@@ -4595,7 +4596,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
handleApplyDefaultProxy(newNetwork.linkProperties.getHttpProxy());
|
handleApplyDefaultProxy(newNetwork.linkProperties.getHttpProxy());
|
||||||
updateTcpBufferSizes(newNetwork);
|
updateTcpBufferSizes(newNetwork);
|
||||||
setDefaultDnsSystemProperties(newNetwork.linkProperties.getDnsServers());
|
setDefaultDnsSystemProperties(newNetwork.linkProperties.getDnsServers());
|
||||||
logDefaultNetworkEvent(newNetwork, prevNetwork);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handles a network appearing or improving its score.
|
// Handles a network appearing or improving its score.
|
||||||
@@ -4746,7 +4746,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
}
|
}
|
||||||
if (isNewDefault) {
|
if (isNewDefault) {
|
||||||
// Notify system services that this network is up.
|
// Notify system services that this network is up.
|
||||||
makeDefault(newNetwork, oldDefaultNetwork);
|
makeDefault(newNetwork);
|
||||||
|
// Log 0 -> X and Y -> X default network transitions, where X is the new default.
|
||||||
|
logDefaultNetworkEvent(newNetwork, oldDefaultNetwork);
|
||||||
synchronized (ConnectivityService.this) {
|
synchronized (ConnectivityService.this) {
|
||||||
// have a new default network, release the transition wakelock in
|
// have a new default network, release the transition wakelock in
|
||||||
// a second if it's held. The second pause is to allow apps
|
// a second if it's held. The second pause is to allow apps
|
||||||
|
|||||||
Reference in New Issue
Block a user