diff options
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) { |