Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7234fc6f authored by Christopher Tate's avatar Christopher Tate Committed by Chris Tate
Browse files

Track pending job latency

Timestamp jobs being marked 'pending' and 'active,' so we can then report their
pending latency in dumpsys.

Bug 35385393
Test: N/A

Change-Id: I3d981fbc7fbe6abdf30da3f86d88d3733b797f51
parent 0e59ab04
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -345,6 +345,7 @@ public final class JobPackageTracker {


    public void notePending(JobStatus job) {
    public void notePending(JobStatus job) {
        final long now = SystemClock.uptimeMillis();
        final long now = SystemClock.uptimeMillis();
        job.madePending = now;
        rebatchIfNeeded(now);
        rebatchIfNeeded(now);
        mCurDataSet.incPending(job.getSourceUid(), job.getSourcePackageName(), now);
        mCurDataSet.incPending(job.getSourceUid(), job.getSourcePackageName(), now);
    }
    }
@@ -357,6 +358,7 @@ public final class JobPackageTracker {


    public void noteActive(JobStatus job) {
    public void noteActive(JobStatus job) {
        final long now = SystemClock.uptimeMillis();
        final long now = SystemClock.uptimeMillis();
        job.madeActive = now;
        rebatchIfNeeded(now);
        rebatchIfNeeded(now);
        if (job.lastEvaluatedPriority >= JobInfo.PRIORITY_TOP_APP) {
        if (job.lastEvaluatedPriority >= JobInfo.PRIORITY_TOP_APP) {
            mCurDataSet.incActiveTop(job.getSourceUid(), job.getSourcePackageName(), now);
            mCurDataSet.incActiveTop(job.getSourceUid(), job.getSourcePackageName(), now);
+11 −3
Original line number Original line Diff line number Diff line
@@ -2035,27 +2035,35 @@ public final class JobSchedulerService extends com.android.server.SystemService
                    pw.print("    Evaluated priority: "); pw.println(priority);
                    pw.print("    Evaluated priority: "); pw.println(priority);
                }
                }
                pw.print("    Tag: "); pw.println(job.getTag());
                pw.print("    Tag: "); pw.println(job.getTag());
                pw.print("    Enq: ");
                TimeUtils.formatDuration(now - job.madePending, pw);
                pw.println(" ago");
            }
            }
            pw.println();
            pw.println();
            pw.println("Active jobs:");
            pw.println("Active jobs:");
            for (int i=0; i<mActiveServices.size(); i++) {
            for (int i=0; i<mActiveServices.size(); i++) {
                JobServiceContext jsc = mActiveServices.get(i);
                JobServiceContext jsc = mActiveServices.get(i);
                pw.print("  Slot #"); pw.print(i); pw.print(": ");
                pw.print("  Slot #"); pw.print(i); pw.print(": ");
                if (jsc.getRunningJob() == null) {
                final JobStatus job = jsc.getRunningJob();
                if (job == null) {
                    pw.println("inactive");
                    pw.println("inactive");
                    continue;
                    continue;
                } else {
                } else {
                    pw.println(jsc.getRunningJob().toShortString());
                    pw.println(job.toShortString());
                    pw.print("    Running for: ");
                    pw.print("    Running for: ");
                    TimeUtils.formatDuration(now - jsc.getExecutionStartTimeElapsed(), pw);
                    TimeUtils.formatDuration(now - jsc.getExecutionStartTimeElapsed(), pw);
                    pw.print(", timeout at: ");
                    pw.print(", timeout at: ");
                    TimeUtils.formatDuration(jsc.getTimeoutElapsed() - now, pw);
                    TimeUtils.formatDuration(jsc.getTimeoutElapsed() - now, pw);
                    pw.println();
                    pw.println();
                    jsc.getRunningJob().dump(pw, "    ", false);
                    job.dump(pw, "    ", false);
                    int priority = evaluateJobPriorityLocked(jsc.getRunningJob());
                    int priority = evaluateJobPriorityLocked(jsc.getRunningJob());
                    if (priority != JobInfo.PRIORITY_DEFAULT) {
                    if (priority != JobInfo.PRIORITY_DEFAULT) {
                        pw.print("    Evaluated priority: "); pw.println(priority);
                        pw.print("    Evaluated priority: "); pw.println(priority);
                    }
                    }
                    pw.print("    Active at "); pw.println(job.madeActive);
                    pw.print("    Pending for ");
                    TimeUtils.formatDuration(job.madeActive - job.madePending, pw);
                    pw.println();
                }
                }
            }
            }
            if (filterUid == -1) {
            if (filterUid == -1) {
+6 −2
Original line number Original line Diff line number Diff line
@@ -147,7 +147,6 @@ public class IdleController extends StateController {
        @Override
        @Override
        public void onReceive(Context context, Intent intent) {
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();
            final String action = intent.getAction();

            if (action.equals(Intent.ACTION_SCREEN_ON)
            if (action.equals(Intent.ACTION_SCREEN_ON)
                    || action.equals(Intent.ACTION_DREAMING_STOPPED)) {
                    || action.equals(Intent.ACTION_DREAMING_STOPPED)) {
                if (DEBUG) {
                if (DEBUG) {
@@ -183,6 +182,11 @@ public class IdleController extends StateController {
                    }
                    }
                    mIdle = true;
                    mIdle = true;
                    reportNewIdleState(mIdle);
                    reportNewIdleState(mIdle);
                } else {
                    if (DEBUG) {
                        Slog.v(TAG, "TRIGGER_IDLE received but not changing state; idle="
                                + mIdle + " screen=" + mScreenOn);
                    }
                }
                }
            }
            }
        }
        }
@@ -191,7 +195,7 @@ public class IdleController extends StateController {
    @Override
    @Override
    public void dumpControllerStateLocked(PrintWriter pw, int filterUid) {
    public void dumpControllerStateLocked(PrintWriter pw, int filterUid) {
        pw.print("Idle: ");
        pw.print("Idle: ");
        pw.println(mIdleTracker.isIdle() ? "true" : "false");
        pw.println(mIdleTracker.isIdle());
        pw.print("Tracking ");
        pw.print("Tracking ");
        pw.print(mTrackedTasks.size());
        pw.print(mTrackedTasks.size());
        pw.println(":");
        pw.println(":");
+4 −0
Original line number Original line Diff line number Diff line
@@ -129,6 +129,10 @@ public final class JobStatus {
    // Used by shell commands
    // Used by shell commands
    public int overrideState = 0;
    public int overrideState = 0;


    // Metrics about queue latency
    public long madePending;
    public long madeActive;

    /**
    /**
     * For use only by ContentObserverController: state it is maintaining about content URIs
     * For use only by ContentObserverController: state it is maintaining about content URIs
     * being observed.
     * being observed.