From f27e6d70adec352611ffd1d616267bb1cd603ae5 Mon Sep 17 00:00:00 2001 From: Kweku Adams Date: Wed, 14 Dec 2022 20:25:21 +0000 Subject: [PATCH] Increase connectivity callback prioritization for user-initiated jobs. Increase the priority of app connectivity callbacks when they have user-initiated jobs waiting around. Bug: 261999509 Test: N/A Change-Id: I0a3eab93616576ab1fa4310a46b0825dfa46995f --- .../controllers/ConnectivityController.java | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java index 6166921d64b22..3610b0a0064ba 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java @@ -149,11 +149,13 @@ public final class ConnectivityController extends RestrictingController implemen // 2. Waiting connectivity jobs would be ready with connectivity // 3. An existing network satisfies a waiting connectivity job's requirements // 4. TOP proc state - // 5. Existence of treat-as-EJ EJs (not just requested EJs) - // 6. FGS proc state - // 7. EJ enqueue time - // 8. Any other important job priorities/proc states - // 9. Enqueue time + // 5. Existence of treat-as-UI UIJs (not just requested UIJs) + // 6. Existence of treat-as-EJ EJs (not just requested EJs) + // 7. FGS proc state + // 8. UIJ enqueue time + // 9. EJ enqueue time + // 10. Any other important job priorities/proc states + // 11. Enqueue time // TODO: maybe consider number of jobs // TODO: consider IMPORTANT_WHILE_FOREGROUND bit final int runningPriority = prioritizeExistenceOver(0, @@ -181,8 +183,13 @@ public final class ConnectivityController extends RestrictingController implemen if (topPriority != 0) { return topPriority; } - // They're either both TOP or both not TOP. Prioritize the app that has runnable EJs + // They're either both TOP or both not TOP. Prioritize the app that has runnable UIJs // pending. + final int uijPriority = prioritizeExistenceOver(0, us1.numUIJs, us2.numUIJs); + if (uijPriority != 0) { + return uijPriority; + } + // Still equivalent. Prioritize the app that has runnable EJs pending. final int ejPriority = prioritizeExistenceOver(0, us1.numEJs, us2.numEJs); if (ejPriority != 0) { return ejPriority; @@ -195,6 +202,12 @@ public final class ConnectivityController extends RestrictingController implemen if (fgsPriority != 0) { return fgsPriority; } + // Order them by UIJ enqueue time to help provide low UIJ latency. + if (us1.earliestUIJEnqueueTime < us2.earliestUIJEnqueueTime) { + return -1; + } else if (us1.earliestUIJEnqueueTime > us2.earliestUIJEnqueueTime) { + return 1; + } // Order them by EJ enqueue time to help provide low EJ latency. if (us1.earliestEJEnqueueTime < us2.earliestEJEnqueueTime) { return -1; @@ -414,7 +427,7 @@ public final class ConnectivityController extends RestrictingController implemen final UidStats uidStats = getUidStats(jobStatus.getSourceUid(), jobStatus.getSourcePackageName(), true); - if (jobStatus.shouldTreatAsExpeditedJob()) { + if (jobStatus.shouldTreatAsExpeditedJob() && jobStatus.shouldTreatAsUserInitiated()) { if (!jobStatus.isConstraintSatisfied(JobStatus.CONSTRAINT_CONNECTIVITY)) { // Don't request a direct hole through any of the firewalls. Instead, mark the // constraint as satisfied if the network is available, and the job will get @@ -936,10 +949,12 @@ public final class ConnectivityController extends RestrictingController implemen if (us.lastUpdatedElapsed + MIN_STATS_UPDATE_INTERVAL_MS < nowElapsed) { us.earliestEnqueueTime = Long.MAX_VALUE; us.earliestEJEnqueueTime = Long.MAX_VALUE; + us.earliestUIJEnqueueTime = Long.MAX_VALUE; us.numReadyWithConnectivity = 0; us.numRequestedNetworkAvailable = 0; us.numRegular = 0; us.numEJs = 0; + us.numUIJs = 0; for (int j = 0; j < jobs.size(); ++j) { JobStatus job = jobs.valueAt(j); @@ -956,10 +971,15 @@ public final class ConnectivityController extends RestrictingController implemen if (job.shouldTreatAsExpeditedJob() || job.startedAsExpeditedJob) { us.earliestEJEnqueueTime = Math.min(us.earliestEJEnqueueTime, job.enqueueTime); + } else if (job.shouldTreatAsUserInitiated()) { + us.earliestUIJEnqueueTime = + Math.min(us.earliestUIJEnqueueTime, job.enqueueTime); } } if (job.shouldTreatAsExpeditedJob() || job.startedAsExpeditedJob) { us.numEJs++; + } else if (job.shouldTreatAsUserInitiated()) { + us.numUIJs++; } else { us.numRegular++; } @@ -1466,8 +1486,10 @@ public final class ConnectivityController extends RestrictingController implemen public int numRequestedNetworkAvailable; public int numEJs; public int numRegular; + public int numUIJs; public long earliestEnqueueTime; public long earliestEJEnqueueTime; + public long earliestUIJEnqueueTime; public long lastUpdatedElapsed; private UidStats(int uid) { @@ -1485,6 +1507,7 @@ public final class ConnectivityController extends RestrictingController implemen pw.print("#reg", numRegular); pw.print("earliestEnqueue", earliestEnqueueTime); pw.print("earliestEJEnqueue", earliestEJEnqueueTime); + pw.print("earliestUIJEnqueue", earliestUIJEnqueueTime); pw.print("updated="); TimeUtils.formatDuration(lastUpdatedElapsed - nowElapsed, pw); pw.println("}");