summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/restrictions/ThermalStatusRestriction.java23
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/job/restrictions/ThermalStatusRestrictionTest.java68
2 files changed, 85 insertions, 6 deletions
diff --git a/apex/jobscheduler/service/java/com/android/server/job/restrictions/ThermalStatusRestriction.java b/apex/jobscheduler/service/java/com/android/server/job/restrictions/ThermalStatusRestriction.java
index 830031e2f442..85b762d1e524 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/restrictions/ThermalStatusRestriction.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/restrictions/ThermalStatusRestriction.java
@@ -91,12 +91,23 @@ public class ThermalStatusRestriction extends JobRestriction {
}
final int priority = job.getEffectivePriority();
if (mThermalStatus >= HIGHER_PRIORITY_THRESHOLD) {
- // For moderate throttling, only let expedited jobs and high priority regular jobs that
- // haven't been running for a long time run.
- return !job.shouldTreatAsExpeditedJob()
- && !(priority == JobInfo.PRIORITY_HIGH
- && mService.isCurrentlyRunningLocked(job)
- && !mService.isJobInOvertimeLocked(job));
+ // For moderate throttling:
+ // Only let expedited & user-initiated jobs run if:
+ // 1. They haven't previously run
+ // 2. They're already running and aren't yet in overtime
+ // Only let high priority jobs run if:
+ // They are already running and aren't yet in overtime
+ // Don't let any other job run.
+ if (job.shouldTreatAsExpeditedJob() || job.shouldTreatAsUserInitiated()) {
+ return job.getNumPreviousAttempts() > 0
+ || (mService.isCurrentlyRunningLocked(job)
+ && mService.isJobInOvertimeLocked(job));
+ }
+ if (priority == JobInfo.PRIORITY_HIGH) {
+ return !mService.isCurrentlyRunningLocked(job)
+ || mService.isJobInOvertimeLocked(job);
+ }
+ return true;
}
if (mThermalStatus >= LOW_PRIORITY_THRESHOLD) {
// For light throttling, throttle all min priority jobs and all low priority jobs that
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/restrictions/ThermalStatusRestrictionTest.java b/services/tests/mockingservicestests/src/com/android/server/job/restrictions/ThermalStatusRestrictionTest.java
index f88e18b4ced1..49426901b142 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/restrictions/ThermalStatusRestrictionTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/restrictions/ThermalStatusRestrictionTest.java
@@ -180,14 +180,47 @@ public class ThermalStatusRestrictionTest {
createJobBuilder(7).setExpedited(true).build());
final JobStatus ej = spy(createJobStatus("testIsJobRestricted",
createJobBuilder(8).setExpedited(true).build()));
+ final JobStatus ejRetried = spy(createJobStatus("testIsJobRestricted",
+ createJobBuilder(11).setExpedited(true).build()));
+ final JobStatus ejRunning = spy(createJobStatus("testIsJobRestricted",
+ createJobBuilder(12).setExpedited(true).build()));
+ final JobStatus ejRunningLong = spy(createJobStatus("testIsJobRestricted",
+ createJobBuilder(13).setExpedited(true).build()));
+ final JobStatus ui = spy(createJobStatus("testIsJobRestricted",
+ createJobBuilder(14).build()));
+ final JobStatus uiRetried = spy(createJobStatus("testIsJobRestricted",
+ createJobBuilder(15).build()));
+ final JobStatus uiRunning = spy(createJobStatus("testIsJobRestricted",
+ createJobBuilder(16).build()));
+ final JobStatus uiRunningLong = spy(createJobStatus("testIsJobRestricted",
+ createJobBuilder(17).build()));
when(ej.shouldTreatAsExpeditedJob()).thenReturn(true);
+ when(ejRetried.shouldTreatAsExpeditedJob()).thenReturn(true);
+ when(ejRunning.shouldTreatAsExpeditedJob()).thenReturn(true);
+ when(ejRunningLong.shouldTreatAsExpeditedJob()).thenReturn(true);
+ when(ui.shouldTreatAsUserInitiated()).thenReturn(true);
+ when(uiRetried.shouldTreatAsUserInitiated()).thenReturn(true);
+ when(uiRunning.shouldTreatAsUserInitiated()).thenReturn(true);
+ when(uiRunningLong.shouldTreatAsUserInitiated()).thenReturn(true);
+ when(ejRetried.getNumPreviousAttempts()).thenReturn(1);
+ when(uiRetried.getNumPreviousAttempts()).thenReturn(2);
when(mJobSchedulerService.isCurrentlyRunningLocked(jobLowPriorityRunning)).thenReturn(true);
when(mJobSchedulerService.isCurrentlyRunningLocked(jobHighPriorityRunning))
.thenReturn(true);
+ when(mJobSchedulerService.isCurrentlyRunningLocked(jobLowPriorityRunningLong))
+ .thenReturn(true);
+ when(mJobSchedulerService.isCurrentlyRunningLocked(jobHighPriorityRunningLong))
+ .thenReturn(true);
+ when(mJobSchedulerService.isCurrentlyRunningLocked(ejRunning)).thenReturn(true);
+ when(mJobSchedulerService.isCurrentlyRunningLocked(ejRunningLong)).thenReturn(true);
+ when(mJobSchedulerService.isCurrentlyRunningLocked(uiRunning)).thenReturn(true);
+ when(mJobSchedulerService.isCurrentlyRunningLocked(uiRunningLong)).thenReturn(true);
when(mJobSchedulerService.isJobInOvertimeLocked(jobLowPriorityRunningLong))
.thenReturn(true);
when(mJobSchedulerService.isJobInOvertimeLocked(jobHighPriorityRunningLong))
.thenReturn(true);
+ when(mJobSchedulerService.isJobInOvertimeLocked(ejRunningLong)).thenReturn(true);
+ when(mJobSchedulerService.isJobInOvertimeLocked(uiRunningLong)).thenReturn(true);
assertFalse(mThermalStatusRestriction.isJobRestricted(jobMinPriority));
assertFalse(mThermalStatusRestriction.isJobRestricted(jobLowPriority));
@@ -199,6 +232,13 @@ public class ThermalStatusRestrictionTest {
assertFalse(mThermalStatusRestriction.isJobRestricted(jobHighPriorityRunningLong));
assertFalse(mThermalStatusRestriction.isJobRestricted(ej));
assertFalse(mThermalStatusRestriction.isJobRestricted(ejDowngraded));
+ assertFalse(mThermalStatusRestriction.isJobRestricted(ejRetried));
+ assertFalse(mThermalStatusRestriction.isJobRestricted(ejRunning));
+ assertFalse(mThermalStatusRestriction.isJobRestricted(ejRunningLong));
+ assertFalse(mThermalStatusRestriction.isJobRestricted(ui));
+ assertFalse(mThermalStatusRestriction.isJobRestricted(uiRetried));
+ assertFalse(mThermalStatusRestriction.isJobRestricted(uiRunning));
+ assertFalse(mThermalStatusRestriction.isJobRestricted(uiRunningLong));
mStatusChangedListener.onThermalStatusChanged(THERMAL_STATUS_LIGHT);
@@ -212,6 +252,13 @@ public class ThermalStatusRestrictionTest {
assertFalse(mThermalStatusRestriction.isJobRestricted(jobHighPriorityRunningLong));
assertFalse(mThermalStatusRestriction.isJobRestricted(ejDowngraded));
assertFalse(mThermalStatusRestriction.isJobRestricted(ej));
+ assertFalse(mThermalStatusRestriction.isJobRestricted(ejRetried));
+ assertFalse(mThermalStatusRestriction.isJobRestricted(ejRunning));
+ assertFalse(mThermalStatusRestriction.isJobRestricted(ejRunningLong));
+ assertFalse(mThermalStatusRestriction.isJobRestricted(ui));
+ assertFalse(mThermalStatusRestriction.isJobRestricted(uiRetried));
+ assertFalse(mThermalStatusRestriction.isJobRestricted(uiRunning));
+ assertFalse(mThermalStatusRestriction.isJobRestricted(uiRunningLong));
mStatusChangedListener.onThermalStatusChanged(THERMAL_STATUS_MODERATE);
@@ -225,6 +272,13 @@ public class ThermalStatusRestrictionTest {
assertTrue(mThermalStatusRestriction.isJobRestricted(jobHighPriorityRunningLong));
assertTrue(mThermalStatusRestriction.isJobRestricted(ejDowngraded));
assertFalse(mThermalStatusRestriction.isJobRestricted(ej));
+ assertTrue(mThermalStatusRestriction.isJobRestricted(ejRetried));
+ assertFalse(mThermalStatusRestriction.isJobRestricted(ejRunning));
+ assertTrue(mThermalStatusRestriction.isJobRestricted(ejRunningLong));
+ assertFalse(mThermalStatusRestriction.isJobRestricted(ui));
+ assertTrue(mThermalStatusRestriction.isJobRestricted(uiRetried));
+ assertFalse(mThermalStatusRestriction.isJobRestricted(uiRunning));
+ assertTrue(mThermalStatusRestriction.isJobRestricted(uiRunningLong));
mStatusChangedListener.onThermalStatusChanged(THERMAL_STATUS_SEVERE);
@@ -238,6 +292,13 @@ public class ThermalStatusRestrictionTest {
assertTrue(mThermalStatusRestriction.isJobRestricted(jobHighPriorityRunningLong));
assertTrue(mThermalStatusRestriction.isJobRestricted(ejDowngraded));
assertTrue(mThermalStatusRestriction.isJobRestricted(ej));
+ assertTrue(mThermalStatusRestriction.isJobRestricted(ejRetried));
+ assertTrue(mThermalStatusRestriction.isJobRestricted(ejRunning));
+ assertTrue(mThermalStatusRestriction.isJobRestricted(ejRunningLong));
+ assertTrue(mThermalStatusRestriction.isJobRestricted(ui));
+ assertTrue(mThermalStatusRestriction.isJobRestricted(uiRetried));
+ assertTrue(mThermalStatusRestriction.isJobRestricted(uiRunning));
+ assertTrue(mThermalStatusRestriction.isJobRestricted(uiRunningLong));
mStatusChangedListener.onThermalStatusChanged(THERMAL_STATUS_CRITICAL);
@@ -251,6 +312,13 @@ public class ThermalStatusRestrictionTest {
assertTrue(mThermalStatusRestriction.isJobRestricted(jobHighPriorityRunningLong));
assertTrue(mThermalStatusRestriction.isJobRestricted(ejDowngraded));
assertTrue(mThermalStatusRestriction.isJobRestricted(ej));
+ assertTrue(mThermalStatusRestriction.isJobRestricted(ejRetried));
+ assertTrue(mThermalStatusRestriction.isJobRestricted(ejRunning));
+ assertTrue(mThermalStatusRestriction.isJobRestricted(ejRunningLong));
+ assertTrue(mThermalStatusRestriction.isJobRestricted(ui));
+ assertTrue(mThermalStatusRestriction.isJobRestricted(uiRetried));
+ assertTrue(mThermalStatusRestriction.isJobRestricted(uiRunning));
+ assertTrue(mThermalStatusRestriction.isJobRestricted(uiRunningLong));
}
private JobInfo.Builder createJobBuilder(int jobId) {