Loading apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +33 −24 Original line number Diff line number Diff line Loading @@ -2600,10 +2600,14 @@ 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; 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; Loading @@ -2611,23 +2615,28 @@ public class JobSchedulerService extends com.android.server.SystemService backoff = mConstants.MIN_LINEAR_BACKOFF_TIME_MS; } delayMillis = backoff * backoffAttempts; } break; } 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); } break; } break; } delayMillis = Math.min(delayMillis, JobInfo.MAX_BACKOFF_DELAY_MILLIS); earliestRuntimeMs = elapsedNowMillis + delayMillis; } JobStatus newJob = new JobStatus(failureToReschedule, elapsedNowMillis + delayMillis, earliestRuntimeMs, JobStatus.NO_LATEST_RUNTIME, numFailures, numSystemStops, failureToReschedule.getLastSuccessfulRunTime(), sSystemClock.millis(), failureToReschedule.getCumulativeExecutionTimeMs()); Loading services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -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, Loading Loading
apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +33 −24 Original line number Diff line number Diff line Loading @@ -2600,10 +2600,14 @@ 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; 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; Loading @@ -2611,23 +2615,28 @@ public class JobSchedulerService extends com.android.server.SystemService backoff = mConstants.MIN_LINEAR_BACKOFF_TIME_MS; } delayMillis = backoff * backoffAttempts; } break; } 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); } break; } break; } delayMillis = Math.min(delayMillis, JobInfo.MAX_BACKOFF_DELAY_MILLIS); earliestRuntimeMs = elapsedNowMillis + delayMillis; } JobStatus newJob = new JobStatus(failureToReschedule, elapsedNowMillis + delayMillis, earliestRuntimeMs, JobStatus.NO_LATEST_RUNTIME, numFailures, numSystemStops, failureToReschedule.getLastSuccessfulRunTime(), sSystemClock.millis(), failureToReschedule.getCumulativeExecutionTimeMs()); Loading
services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -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, Loading