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
This commit is contained in:
Kweku Adams
2022-12-14 20:25:21 +00:00
parent 9999839191
commit f27e6d70ad

View File

@@ -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("}");