Merge "Clamp non-monotonic stats instead of dropping." into ics-mr1

This commit is contained in:
Jeff Sharkey
2011-11-10 20:31:03 -08:00
committed by Android (Google) Code Review
2 changed files with 45 additions and 7 deletions

View File

@@ -464,6 +464,19 @@ public class NetworkStats implements Parcelable {
* time, and that none of them have disappeared. * time, and that none of them have disappeared.
*/ */
public NetworkStats subtract(NetworkStats value) throws NonMonotonicException { public NetworkStats subtract(NetworkStats value) throws NonMonotonicException {
return subtract(value, false);
}
/**
* Subtract the given {@link NetworkStats}, effectively leaving the delta
* between two snapshots in time. Assumes that statistics rows collect over
* time, and that none of them have disappeared.
*
* @param clampNonMonotonic When non-monotonic stats are found, just clamp
* to 0 instead of throwing {@link NonMonotonicException}.
*/
public NetworkStats subtract(NetworkStats value, boolean clampNonMonotonic)
throws NonMonotonicException {
final long deltaRealtime = this.elapsedRealtime - value.elapsedRealtime; final long deltaRealtime = this.elapsedRealtime - value.elapsedRealtime;
if (deltaRealtime < 0) { if (deltaRealtime < 0) {
throw new NonMonotonicException(this, value); throw new NonMonotonicException(this, value);
@@ -497,7 +510,15 @@ public class NetworkStats implements Parcelable {
if (entry.rxBytes < 0 || entry.rxPackets < 0 || entry.txBytes < 0 if (entry.rxBytes < 0 || entry.rxPackets < 0 || entry.txBytes < 0
|| entry.txPackets < 0 || entry.operations < 0) { || entry.txPackets < 0 || entry.operations < 0) {
throw new NonMonotonicException(this, i, value, j); if (clampNonMonotonic) {
entry.rxBytes = Math.max(entry.rxBytes, 0);
entry.rxPackets = Math.max(entry.rxPackets, 0);
entry.txBytes = Math.max(entry.txBytes, 0);
entry.txPackets = Math.max(entry.txPackets, 0);
entry.operations = Math.max(entry.operations, 0);
} else {
throw new NonMonotonicException(this, i, value, j);
}
} }
} }

View File

@@ -806,9 +806,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
final NetworkStats networkDevSnapshot; final NetworkStats networkDevSnapshot;
try { try {
// collect any tethering stats // collect any tethering stats
final String[] tetheredIfacePairs = mConnManager.getTetheredIfacePairs(); final NetworkStats tetherSnapshot = getNetworkStatsTethering();
final NetworkStats tetherSnapshot = mNetworkManager.getNetworkStatsTethering(
tetheredIfacePairs);
// record uid stats, folding in tethering stats // record uid stats, folding in tethering stats
uidSnapshot = mNetworkManager.getNetworkStatsUidDetail(UID_ALL); uidSnapshot = mNetworkManager.getNetworkStatsUidDetail(UID_ALL);
@@ -1505,7 +1503,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
NetworkStats before, NetworkStats current, boolean collectStale, String type) { NetworkStats before, NetworkStats current, boolean collectStale, String type) {
if (before != null) { if (before != null) {
try { try {
return current.subtract(before); return current.subtract(before, false);
} catch (NonMonotonicException e) { } catch (NonMonotonicException e) {
Log.w(TAG, "found non-monotonic values; saving to dropbox"); Log.w(TAG, "found non-monotonic values; saving to dropbox");
@@ -1517,8 +1515,13 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
builder.append("right=").append(e.right).append('\n'); builder.append("right=").append(e.right).append('\n');
mDropBox.addText(TAG_NETSTATS_ERROR, builder.toString()); mDropBox.addText(TAG_NETSTATS_ERROR, builder.toString());
// return empty delta to avoid recording broken stats try {
return new NetworkStats(0L, 10); // return clamped delta to help recover
return current.subtract(before, true);
} catch (NonMonotonicException e1) {
Log.wtf(TAG, "found non-monotonic values; returning empty delta", e1);
return new NetworkStats(0L, 10);
}
} }
} else if (collectStale) { } else if (collectStale) {
// caller is okay collecting stale stats for first call. // caller is okay collecting stale stats for first call.
@@ -1530,6 +1533,20 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
} }
} }
/**
* Return snapshot of current tethering statistics. Will return empty
* {@link NetworkStats} if any problems are encountered.
*/
private NetworkStats getNetworkStatsTethering() throws RemoteException {
try {
final String[] tetheredIfacePairs = mConnManager.getTetheredIfacePairs();
return mNetworkManager.getNetworkStatsTethering(tetheredIfacePairs);
} catch (IllegalStateException e) {
Log.wtf(TAG, "problem reading network stats", e);
return new NetworkStats(0L, 10);
}
}
private static NetworkStats computeNetworkXtSnapshotFromUid(NetworkStats uidSnapshot) { private static NetworkStats computeNetworkXtSnapshotFromUid(NetworkStats uidSnapshot) {
return uidSnapshot.groupedByIface(); return uidSnapshot.groupedByIface();
} }