summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kweku Adams <kwekua@google.com> 2023-05-16 17:01:02 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2023-05-16 17:01:02 +0000
commit0d0b09276179881fd19eaa7a8e60a03e4030ecdf (patch)
tree321458d26bdf32d7c9fbd1039161d1faabf2590e
parent7c8a3a703d36095b85d6a1a5b56b748ada0d4c44 (diff)
parent0f26a22cdb4be26e9b10a11c62a7489c2ebc6595 (diff)
Merge "Don't back off for first few system stops." into udc-dev am: 0f26a22cdb
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23249503 Change-Id: I07c90223a86e1a31f372f099005a76ca8d9f6073 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java57
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java4
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,