Loading apex/jobscheduler/service/java/com/android/server/job/JobPackageTracker.java +37 −23 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.app.job.JobParameters; import android.os.UserHandle; import android.text.format.DateFormat; import android.util.ArrayMap; import android.util.IndentingPrintWriter; import android.util.SparseArray; import android.util.SparseIntArray; import android.util.TimeUtils; Loading @@ -33,8 +34,6 @@ import android.util.proto.ProtoOutputStream; import com.android.internal.util.RingBufferIndices; import com.android.server.job.controllers.JobStatus; import java.io.PrintWriter; public final class JobPackageTracker { // We batch every 30 minutes. static final long BATCHING_TIME = 30*60*1000; Loading Loading @@ -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; int percent = (int) ((fraction * 100) + .5f); if (percent > 0) { pw.print(" "); pw.print(percent); pw.print("% "); pw.print(count); pw.print("x "); pw.print(suffix); return true; } else if (count > 0) { pw.print(" "); pw.print(count); pw.print("x "); 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) { 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(" ("); TimeUtils.formatDuration(mStartElapsedTime, nowElapsed, pw); pw.print(") over "); TimeUtils.formatDuration(period, pw); 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(); for (int i = 0; i < NE; i++) { int uid = mEntries.keyAt(i); Loading @@ -332,15 +341,21 @@ public final class JobPackageTracker { final int NP = uidMap.size(); for (int j = 0; j < NP; j++) { PackageEntry pe = uidMap.valueAt(j); pw.print(prefix); pw.print(" "); UserHandle.formatUid(pw, uid); pw.print(" / "); pw.print(uidMap.keyAt(j)); pw.println(":"); pw.print(prefix); pw.print(" "); printDuration(pw, period, pe.getPendingTime(now), pe.pendingCount, "pending"); printDuration(pw, period, pe.getActiveTime(now), pe.activeCount, "active"); printDuration(pw, period, pe.getActiveTopTime(now), pe.activeTopCount, "active-top"); pw.increaseIndent(); if (printDuration(pw, period, pe.getPendingTime(now), pe.pendingCount, "pending")) { 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) { pw.print(" (pending)"); } Loading @@ -352,7 +367,6 @@ public final class JobPackageTracker { } pw.println(); if (pe.stopReasons.size() > 0) { pw.print(prefix); pw.print(" "); for (int k = 0; k < pe.stopReasons.size(); k++) { if (k > 0) { pw.print(", "); Loading @@ -364,11 +378,10 @@ public final class JobPackageTracker { } pw.println(); } pw.decreaseIndent(); } } pw.print(prefix); pw.print(" Max concurrency: "); pw.print(mMaxTotalActive); pw.print(" total, "); pw.print(mMaxFgActive); pw.println(" foreground"); pw.decreaseIndent(); } private void printPackageEntryState(ProtoOutputStream proto, long fieldId, Loading Loading @@ -520,7 +533,7 @@ public final class JobPackageTracker { 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 nowElapsed = sElapsedRealtimeClock.millis(); final DataSet total; Loading @@ -533,11 +546,11 @@ public final class JobPackageTracker { mCurDataSet.addTo(total, now); for (int i = 1; i < mLastDataSets.length; i++) { 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(); } } 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) { Loading Loading @@ -566,12 +579,14 @@ public final class JobPackageTracker { proto.end(token); } public boolean dumpHistory(PrintWriter pw, String prefix, int filterAppId) { boolean dumpHistory(IndentingPrintWriter pw, int filterAppId) { final int size = mEventIndices.size(); if (size <= 0) { return false; } pw.increaseIndent(); pw.println("Job history:"); pw.decreaseIndent(); final long now = sElapsedRealtimeClock.millis(); for (int i=0; i<size; i++) { final int index = mEventIndices.indexOf(i); Loading @@ -591,7 +606,6 @@ public final class JobPackageTracker { case EVENT_STOP_PERIODIC_JOB: label = " STOP-P"; break; default: label = " ??"; break; } pw.print(prefix); TimeUtils.formatDuration(mEventTimes[index]-now, pw, TimeUtils.HUNDRED_DAY_FIELD_LEN); pw.print(" "); pw.print(label); Loading apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +2 −2 Original line number Diff line number Diff line Loading @@ -3227,9 +3227,9 @@ public class JobSchedulerService extends com.android.server.SystemService } pw.println(); mJobPackageTracker.dump(pw, "", filterAppId); mJobPackageTracker.dump(pw, filterAppId); pw.println(); if (mJobPackageTracker.dumpHistory(pw, "", filterAppId)) { if (mJobPackageTracker.dumpHistory(pw, filterAppId)) { pw.println(); } Loading Loading
apex/jobscheduler/service/java/com/android/server/job/JobPackageTracker.java +37 −23 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.app.job.JobParameters; import android.os.UserHandle; import android.text.format.DateFormat; import android.util.ArrayMap; import android.util.IndentingPrintWriter; import android.util.SparseArray; import android.util.SparseIntArray; import android.util.TimeUtils; Loading @@ -33,8 +34,6 @@ import android.util.proto.ProtoOutputStream; import com.android.internal.util.RingBufferIndices; import com.android.server.job.controllers.JobStatus; import java.io.PrintWriter; public final class JobPackageTracker { // We batch every 30 minutes. static final long BATCHING_TIME = 30*60*1000; Loading Loading @@ -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; int percent = (int) ((fraction * 100) + .5f); if (percent > 0) { pw.print(" "); pw.print(percent); pw.print("% "); pw.print(count); pw.print("x "); pw.print(suffix); return true; } else if (count > 0) { pw.print(" "); pw.print(count); pw.print("x "); 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) { 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(" ("); TimeUtils.formatDuration(mStartElapsedTime, nowElapsed, pw); pw.print(") over "); TimeUtils.formatDuration(period, pw); 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(); for (int i = 0; i < NE; i++) { int uid = mEntries.keyAt(i); Loading @@ -332,15 +341,21 @@ public final class JobPackageTracker { final int NP = uidMap.size(); for (int j = 0; j < NP; j++) { PackageEntry pe = uidMap.valueAt(j); pw.print(prefix); pw.print(" "); UserHandle.formatUid(pw, uid); pw.print(" / "); pw.print(uidMap.keyAt(j)); pw.println(":"); pw.print(prefix); pw.print(" "); printDuration(pw, period, pe.getPendingTime(now), pe.pendingCount, "pending"); printDuration(pw, period, pe.getActiveTime(now), pe.activeCount, "active"); printDuration(pw, period, pe.getActiveTopTime(now), pe.activeTopCount, "active-top"); pw.increaseIndent(); if (printDuration(pw, period, pe.getPendingTime(now), pe.pendingCount, "pending")) { 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) { pw.print(" (pending)"); } Loading @@ -352,7 +367,6 @@ public final class JobPackageTracker { } pw.println(); if (pe.stopReasons.size() > 0) { pw.print(prefix); pw.print(" "); for (int k = 0; k < pe.stopReasons.size(); k++) { if (k > 0) { pw.print(", "); Loading @@ -364,11 +378,10 @@ public final class JobPackageTracker { } pw.println(); } pw.decreaseIndent(); } } pw.print(prefix); pw.print(" Max concurrency: "); pw.print(mMaxTotalActive); pw.print(" total, "); pw.print(mMaxFgActive); pw.println(" foreground"); pw.decreaseIndent(); } private void printPackageEntryState(ProtoOutputStream proto, long fieldId, Loading Loading @@ -520,7 +533,7 @@ public final class JobPackageTracker { 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 nowElapsed = sElapsedRealtimeClock.millis(); final DataSet total; Loading @@ -533,11 +546,11 @@ public final class JobPackageTracker { mCurDataSet.addTo(total, now); for (int i = 1; i < mLastDataSets.length; i++) { 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(); } } 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) { Loading Loading @@ -566,12 +579,14 @@ public final class JobPackageTracker { proto.end(token); } public boolean dumpHistory(PrintWriter pw, String prefix, int filterAppId) { boolean dumpHistory(IndentingPrintWriter pw, int filterAppId) { final int size = mEventIndices.size(); if (size <= 0) { return false; } pw.increaseIndent(); pw.println("Job history:"); pw.decreaseIndent(); final long now = sElapsedRealtimeClock.millis(); for (int i=0; i<size; i++) { final int index = mEventIndices.indexOf(i); Loading @@ -591,7 +606,6 @@ public final class JobPackageTracker { case EVENT_STOP_PERIODIC_JOB: label = " STOP-P"; break; default: label = " ??"; break; } pw.print(prefix); TimeUtils.formatDuration(mEventTimes[index]-now, pw, TimeUtils.HUNDRED_DAY_FIELD_LEN); pw.print(" "); pw.print(label); Loading
apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +2 −2 Original line number Diff line number Diff line Loading @@ -3227,9 +3227,9 @@ public class JobSchedulerService extends com.android.server.SystemService } pw.println(); mJobPackageTracker.dump(pw, "", filterAppId); mJobPackageTracker.dump(pw, filterAppId); pw.println(); if (mJobPackageTracker.dumpHistory(pw, "", filterAppId)) { if (mJobPackageTracker.dumpHistory(pw, filterAppId)) { pw.println(); } Loading