Last-ditch clamping of negative NetworkStats.
We've seen reports of negative values flowing through to attempt being recorded, which will outright crash. This change does one last-ditch check to see if we're about to work with negative values, reporting any trouble and clamping them to zero so we don't crash. This gives us the data we need to continue investigating without triggering runtime restarts in the field. Bug: 80057433 Test: atest android.net.NetworkStatsTest Change-Id: I8174391c6cf5dadc2c2c10a8d841ee07e1f7d934
This commit is contained in:
@@ -1100,6 +1100,8 @@ public class NetworkStats implements Parcelable {
|
|||||||
public interface NonMonotonicObserver<C> {
|
public interface NonMonotonicObserver<C> {
|
||||||
public void foundNonMonotonic(
|
public void foundNonMonotonic(
|
||||||
NetworkStats left, int leftIndex, NetworkStats right, int rightIndex, C cookie);
|
NetworkStats left, int leftIndex, NetworkStats right, int rightIndex, C cookie);
|
||||||
|
public void foundNonMonotonic(
|
||||||
|
NetworkStats stats, int statsIndex, C cookie);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -241,6 +241,20 @@ public class NetworkStatsRecorder {
|
|||||||
NetworkStats.Entry entry = null;
|
NetworkStats.Entry entry = null;
|
||||||
for (int i = 0; i < delta.size(); i++) {
|
for (int i = 0; i < delta.size(); i++) {
|
||||||
entry = delta.getValues(i, entry);
|
entry = delta.getValues(i, entry);
|
||||||
|
|
||||||
|
// As a last-ditch sanity check, report any negative values and
|
||||||
|
// clamp them so recording below doesn't croak.
|
||||||
|
if (entry.isNegative()) {
|
||||||
|
if (mObserver != null) {
|
||||||
|
mObserver.foundNonMonotonic(delta, i, mCookie);
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
final NetworkIdentitySet ident = ifaceIdent.get(entry.iface);
|
final NetworkIdentitySet ident = ifaceIdent.get(entry.iface);
|
||||||
if (ident == null) {
|
if (ident == null) {
|
||||||
unknownIfaces.add(entry.iface);
|
unknownIfaces.add(entry.iface);
|
||||||
|
|||||||
@@ -1713,7 +1713,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
@Override
|
@Override
|
||||||
public void foundNonMonotonic(NetworkStats left, int leftIndex, NetworkStats right,
|
public void foundNonMonotonic(NetworkStats left, int leftIndex, NetworkStats right,
|
||||||
int rightIndex, String cookie) {
|
int rightIndex, String cookie) {
|
||||||
Log.w(TAG, "found non-monotonic values; saving to dropbox");
|
Log.w(TAG, "Found non-monotonic values; saving to dropbox");
|
||||||
|
|
||||||
// record error for debugging
|
// record error for debugging
|
||||||
final StringBuilder builder = new StringBuilder();
|
final StringBuilder builder = new StringBuilder();
|
||||||
@@ -1722,9 +1722,21 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
builder.append("left=").append(left).append('\n');
|
builder.append("left=").append(left).append('\n');
|
||||||
builder.append("right=").append(right).append('\n');
|
builder.append("right=").append(right).append('\n');
|
||||||
|
|
||||||
final DropBoxManager dropBox = (DropBoxManager) mContext.getSystemService(
|
mContext.getSystemService(DropBoxManager.class).addText(TAG_NETSTATS_ERROR,
|
||||||
Context.DROPBOX_SERVICE);
|
builder.toString());
|
||||||
dropBox.addText(TAG_NETSTATS_ERROR, builder.toString());
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void foundNonMonotonic(
|
||||||
|
NetworkStats stats, int statsIndex, String cookie) {
|
||||||
|
Log.w(TAG, "Found non-monotonic values; saving to dropbox");
|
||||||
|
|
||||||
|
final StringBuilder builder = new StringBuilder();
|
||||||
|
builder.append("Found non-monotonic " + cookie + " values at [" + statsIndex + "]\n");
|
||||||
|
builder.append("stats=").append(stats).append('\n');
|
||||||
|
|
||||||
|
mContext.getSystemService(DropBoxManager.class).addText(TAG_NETSTATS_ERROR,
|
||||||
|
builder.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user