diff options
| author | 2022-04-08 19:10:50 +0000 | |
|---|---|---|
| committer | 2022-04-08 19:10:50 +0000 | |
| commit | c554e927925ab54037b64a0c00665b5a78940ea5 (patch) | |
| tree | af1d21fa72effc390584f22f2b47208b92ce0cd5 | |
| parent | e3c41047b4215d33dd4ca749ce0ae68d8ff5415d (diff) | |
Stop tracking ghost jobs.
Change I4a31cb1fd5e0a8997eddaed3ecb45a4309abfd59 fixed a problem that
resulted in JobScheduler keeping around jobs that were finished and not
rescheduled (ie. ghost jobs). Unfortunately, JS was telling controllers
that these ghost jobs had started running, but then not telling them
they had stopped running. Now, we log an error when we encounter a ghost
job and make sure to tell controllers to stop tracking them.
Bug: 228334264
Test: N/A
Change-Id: I48e59319c86be2c0494ecdc31e907f2554d8492e
| -rw-r--r-- | apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java | 8 | ||||
| -rw-r--r-- | apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java | 4 |
2 files changed, 11 insertions, 1 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 b25832c7d521..25db58ed6261 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java @@ -1745,7 +1745,13 @@ public class JobSchedulerService extends com.android.server.SystemService // Remove from store as well as controllers. final boolean removed = mJobs.remove(jobStatus, removeFromPersisted); - if (removed && mReadyToRock) { + if (!removed) { + // We never create JobStatus objects for the express purpose of removing them, and this + // method is only ever called for jobs that were saved in the JobStore at some point, + // so if we can't find it, something went seriously wrong. + Slog.wtfStack(TAG, "Job didn't exist in JobStore"); + } + if (mReadyToRock) { for (int i = 0; i < mControllers.size(); i++) { StateController controller = mControllers.get(i); controller.maybeStopTrackingJobLocked(jobStatus, incomingJob, false); diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java index 2a79ec4587fc..f7fe9cab60ae 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java @@ -992,6 +992,10 @@ public final class JobServiceContext implements ServiceConnection { if (mVerb == VERB_FINISHED) { return; } + if (DEBUG) { + Slog.d(TAG, "Cleaning up " + mRunningJob.toShortString() + + " reschedule=" + reschedule + " reason=" + reason); + } applyStoppedReasonLocked(reason); completedJob = mRunningJob; final int internalStopReason = mParams.getInternalStopReasonCode(); |