Merge "Clean up JobPackageTracker dumping code." into sc-dev

This commit is contained in:
Kweku Adams
2021-02-19 01:55:15 +00:00
committed by Android (Google) Code Review
2 changed files with 39 additions and 25 deletions

View File

@@ -25,6 +25,7 @@ import android.app.job.JobParameters;
import android.os.UserHandle; import android.os.UserHandle;
import android.text.format.DateFormat; import android.text.format.DateFormat;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.IndentingPrintWriter;
import android.util.SparseArray; import android.util.SparseArray;
import android.util.SparseIntArray; import android.util.SparseIntArray;
import android.util.TimeUtils; import android.util.TimeUtils;
@@ -33,8 +34,6 @@ import android.util.proto.ProtoOutputStream;
import com.android.internal.util.RingBufferIndices; import com.android.internal.util.RingBufferIndices;
import com.android.server.job.controllers.JobStatus; import com.android.server.job.controllers.JobStatus;
import java.io.PrintWriter;
public final class JobPackageTracker { public final class JobPackageTracker {
// We batch every 30 minutes. // We batch every 30 minutes.
static final long BATCHING_TIME = 30*60*1000; static final long BATCHING_TIME = 30*60*1000;
@@ -294,34 +293,44 @@ public final class JobPackageTracker {
} }
} }
void printDuration(PrintWriter pw, long period, long duration, int count, String suffix) { /** Return {@code true} if text was printed. */
boolean printDuration(IndentingPrintWriter pw, long period, long duration, int count,
String suffix) {
float fraction = duration / (float) period; float fraction = duration / (float) period;
int percent = (int) ((fraction * 100) + .5f); int percent = (int) ((fraction * 100) + .5f);
if (percent > 0) { if (percent > 0) {
pw.print(" ");
pw.print(percent); pw.print(percent);
pw.print("% "); pw.print("% ");
pw.print(count); pw.print(count);
pw.print("x "); pw.print("x ");
pw.print(suffix); pw.print(suffix);
return true;
} else if (count > 0) { } else if (count > 0) {
pw.print(" ");
pw.print(count); pw.print(count);
pw.print("x "); pw.print("x ");
pw.print(suffix); pw.print(suffix);
return true;
} }
return false;
} }
void dump(PrintWriter pw, String header, String prefix, long now, long nowElapsed, void dump(IndentingPrintWriter pw, String header, long now, long nowElapsed,
int filterAppId) { int filterAppId) {
final long period = getTotalTime(now); final long period = getTotalTime(now);
pw.print(prefix); pw.print(header); pw.print(" at "); pw.print(header); pw.print(" at ");
pw.print(DateFormat.format("yyyy-MM-dd-HH-mm-ss", mStartClockTime).toString()); pw.print(DateFormat.format("yyyy-MM-dd-HH-mm-ss", mStartClockTime).toString());
pw.print(" ("); pw.print(" (");
TimeUtils.formatDuration(mStartElapsedTime, nowElapsed, pw); TimeUtils.formatDuration(mStartElapsedTime, nowElapsed, pw);
pw.print(") over "); pw.print(") over ");
TimeUtils.formatDuration(period, pw); TimeUtils.formatDuration(period, pw);
pw.println(":"); pw.println(":");
pw.increaseIndent();
pw.print("Max concurrency: ");
pw.print(mMaxTotalActive); pw.print(" total, ");
pw.print(mMaxFgActive); pw.println(" foreground");
pw.println();
final int NE = mEntries.size(); final int NE = mEntries.size();
for (int i = 0; i < NE; i++) { for (int i = 0; i < NE; i++) {
int uid = mEntries.keyAt(i); int uid = mEntries.keyAt(i);
@@ -332,15 +341,21 @@ public final class JobPackageTracker {
final int NP = uidMap.size(); final int NP = uidMap.size();
for (int j = 0; j < NP; j++) { for (int j = 0; j < NP; j++) {
PackageEntry pe = uidMap.valueAt(j); PackageEntry pe = uidMap.valueAt(j);
pw.print(prefix); pw.print(" ");
UserHandle.formatUid(pw, uid); UserHandle.formatUid(pw, uid);
pw.print(" / "); pw.print(uidMap.keyAt(j)); pw.print(" / "); pw.print(uidMap.keyAt(j));
pw.println(":"); pw.println(":");
pw.print(prefix); pw.print(" ");
printDuration(pw, period, pe.getPendingTime(now), pe.pendingCount, "pending"); pw.increaseIndent();
printDuration(pw, period, pe.getActiveTime(now), pe.activeCount, "active"); if (printDuration(pw, period,
printDuration(pw, period, pe.getActiveTopTime(now), pe.activeTopCount, pe.getPendingTime(now), pe.pendingCount, "pending")) {
"active-top"); pw.print(" ");
}
if (printDuration(pw, period,
pe.getActiveTime(now), pe.activeCount, "active")) {
pw.print(" ");
}
printDuration(pw, period,
pe.getActiveTopTime(now), pe.activeTopCount, "active-top");
if (pe.pendingNesting > 0 || pe.hadPending) { if (pe.pendingNesting > 0 || pe.hadPending) {
pw.print(" (pending)"); pw.print(" (pending)");
} }
@@ -352,7 +367,6 @@ public final class JobPackageTracker {
} }
pw.println(); pw.println();
if (pe.stopReasons.size() > 0) { if (pe.stopReasons.size() > 0) {
pw.print(prefix); pw.print(" ");
for (int k = 0; k < pe.stopReasons.size(); k++) { for (int k = 0; k < pe.stopReasons.size(); k++) {
if (k > 0) { if (k > 0) {
pw.print(", "); pw.print(", ");
@@ -364,11 +378,10 @@ public final class JobPackageTracker {
} }
pw.println(); pw.println();
} }
pw.decreaseIndent();
} }
} }
pw.print(prefix); pw.print(" Max concurrency: "); pw.decreaseIndent();
pw.print(mMaxTotalActive); pw.print(" total, ");
pw.print(mMaxFgActive); pw.println(" foreground");
} }
private void printPackageEntryState(ProtoOutputStream proto, long fieldId, private void printPackageEntryState(ProtoOutputStream proto, long fieldId,
@@ -520,7 +533,7 @@ public final class JobPackageTracker {
return time / (float)period; return time / (float)period;
} }
public void dump(PrintWriter pw, String prefix, int filterAppId) { void dump(IndentingPrintWriter pw, int filterAppId) {
final long now = sUptimeMillisClock.millis(); final long now = sUptimeMillisClock.millis();
final long nowElapsed = sElapsedRealtimeClock.millis(); final long nowElapsed = sElapsedRealtimeClock.millis();
final DataSet total; final DataSet total;
@@ -533,11 +546,11 @@ public final class JobPackageTracker {
mCurDataSet.addTo(total, now); mCurDataSet.addTo(total, now);
for (int i = 1; i < mLastDataSets.length; i++) { for (int i = 1; i < mLastDataSets.length; i++) {
if (mLastDataSets[i] != null) { if (mLastDataSets[i] != null) {
mLastDataSets[i].dump(pw, "Historical stats", prefix, now, nowElapsed, filterAppId); mLastDataSets[i].dump(pw, "Historical stats", now, nowElapsed, filterAppId);
pw.println(); pw.println();
} }
} }
total.dump(pw, "Current stats", prefix, now, nowElapsed, filterAppId); total.dump(pw, "Current stats", now, nowElapsed, filterAppId);
} }
public void dump(ProtoOutputStream proto, long fieldId, int filterUid) { public void dump(ProtoOutputStream proto, long fieldId, int filterUid) {
@@ -566,12 +579,14 @@ public final class JobPackageTracker {
proto.end(token); proto.end(token);
} }
public boolean dumpHistory(PrintWriter pw, String prefix, int filterAppId) { boolean dumpHistory(IndentingPrintWriter pw, int filterAppId) {
final int size = mEventIndices.size(); final int size = mEventIndices.size();
if (size <= 0) { if (size <= 0) {
return false; return false;
} }
pw.println(" Job history:"); pw.increaseIndent();
pw.println("Job history:");
pw.decreaseIndent();
final long now = sElapsedRealtimeClock.millis(); final long now = sElapsedRealtimeClock.millis();
for (int i=0; i<size; i++) { for (int i=0; i<size; i++) {
final int index = mEventIndices.indexOf(i); final int index = mEventIndices.indexOf(i);
@@ -591,7 +606,6 @@ public final class JobPackageTracker {
case EVENT_STOP_PERIODIC_JOB: label = " STOP-P"; break; case EVENT_STOP_PERIODIC_JOB: label = " STOP-P"; break;
default: label = " ??"; break; default: label = " ??"; break;
} }
pw.print(prefix);
TimeUtils.formatDuration(mEventTimes[index]-now, pw, TimeUtils.HUNDRED_DAY_FIELD_LEN); TimeUtils.formatDuration(mEventTimes[index]-now, pw, TimeUtils.HUNDRED_DAY_FIELD_LEN);
pw.print(" "); pw.print(" ");
pw.print(label); pw.print(label);

View File

@@ -3227,9 +3227,9 @@ public class JobSchedulerService extends com.android.server.SystemService
} }
pw.println(); pw.println();
mJobPackageTracker.dump(pw, "", filterAppId); mJobPackageTracker.dump(pw, filterAppId);
pw.println(); pw.println();
if (mJobPackageTracker.dumpHistory(pw, "", filterAppId)) { if (mJobPackageTracker.dumpHistory(pw, filterAppId)) {
pw.println(); pw.println();
} }