diff options
| -rw-r--r-- | apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java | 57 | ||||
| -rw-r--r-- | services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java | 4 |
2 files changed, 36 insertions, 25 deletions
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java index 3f552b6906d0..ea7460dd2d71 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java @@ -2600,34 +2600,43 @@ public class JobSchedulerService extends com.android.server.SystemService } else { numSystemStops++; } - final int backoffAttempts = Math.max(1, - numFailures + numSystemStops / mConstants.SYSTEM_STOP_TO_FAILURE_RATIO); - long delayMillis; - - switch (job.getBackoffPolicy()) { - case JobInfo.BACKOFF_POLICY_LINEAR: { - long backoff = initialBackoffMillis; - if (backoff < mConstants.MIN_LINEAR_BACKOFF_TIME_MS) { - backoff = mConstants.MIN_LINEAR_BACKOFF_TIME_MS; - } - delayMillis = backoff * backoffAttempts; - } break; - default: - if (DEBUG) { - Slog.v(TAG, "Unrecognised back-off policy, defaulting to exponential."); + final int backoffAttempts = + numFailures + numSystemStops / mConstants.SYSTEM_STOP_TO_FAILURE_RATIO; + final long earliestRuntimeMs; + + if (backoffAttempts == 0) { + earliestRuntimeMs = JobStatus.NO_EARLIEST_RUNTIME; + } else { + long delayMillis; + switch (job.getBackoffPolicy()) { + case JobInfo.BACKOFF_POLICY_LINEAR: { + long backoff = initialBackoffMillis; + if (backoff < mConstants.MIN_LINEAR_BACKOFF_TIME_MS) { + backoff = mConstants.MIN_LINEAR_BACKOFF_TIME_MS; + } + delayMillis = backoff * backoffAttempts; } - case JobInfo.BACKOFF_POLICY_EXPONENTIAL: { - long backoff = initialBackoffMillis; - if (backoff < mConstants.MIN_EXP_BACKOFF_TIME_MS) { - backoff = mConstants.MIN_EXP_BACKOFF_TIME_MS; + break; + default: + if (DEBUG) { + Slog.v(TAG, "Unrecognised back-off policy, defaulting to exponential."); + } + // Intentional fallthrough. + case JobInfo.BACKOFF_POLICY_EXPONENTIAL: { + long backoff = initialBackoffMillis; + if (backoff < mConstants.MIN_EXP_BACKOFF_TIME_MS) { + backoff = mConstants.MIN_EXP_BACKOFF_TIME_MS; + } + delayMillis = (long) Math.scalb(backoff, backoffAttempts - 1); } - delayMillis = (long) Math.scalb(backoff, backoffAttempts - 1); - } break; + break; + } + delayMillis = + Math.min(delayMillis, JobInfo.MAX_BACKOFF_DELAY_MILLIS); + earliestRuntimeMs = elapsedNowMillis + delayMillis; } - delayMillis = - Math.min(delayMillis, JobInfo.MAX_BACKOFF_DELAY_MILLIS); JobStatus newJob = new JobStatus(failureToReschedule, - elapsedNowMillis + delayMillis, + earliestRuntimeMs, JobStatus.NO_LATEST_RUNTIME, numFailures, numSystemStops, failureToReschedule.getLastSuccessfulRunTime(), sSystemClock.millis(), failureToReschedule.getCumulativeExecutionTimeMs()); diff --git a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java index 9cd22dd292a5..b19a13c30e89 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java @@ -402,13 +402,15 @@ public class JobSchedulerServiceTest { JobStatus rescheduledJob = mService.getRescheduleJobForFailureLocked(originalJob, JobParameters.STOP_REASON_DEVICE_STATE, JobParameters.INTERNAL_STOP_REASON_DEVICE_THERMAL); - assertEquals(nowElapsed + initialBackoffMs, rescheduledJob.getEarliestRunTime()); + assertEquals(JobStatus.NO_EARLIEST_RUNTIME, rescheduledJob.getEarliestRunTime()); assertEquals(JobStatus.NO_LATEST_RUNTIME, rescheduledJob.getLatestRunTimeElapsed()); // failure = 0, systemStop = 2 rescheduledJob = mService.getRescheduleJobForFailureLocked(rescheduledJob, JobParameters.STOP_REASON_DEVICE_STATE, JobParameters.INTERNAL_STOP_REASON_PREEMPT); + assertEquals(JobStatus.NO_EARLIEST_RUNTIME, rescheduledJob.getEarliestRunTime()); + assertEquals(JobStatus.NO_LATEST_RUNTIME, rescheduledJob.getLatestRunTimeElapsed()); // failure = 0, systemStop = 3 rescheduledJob = mService.getRescheduleJobForFailureLocked(rescheduledJob, JobParameters.STOP_REASON_CONSTRAINT_CHARGING, |