summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Sanath Kumar <sanathku@google.com> 2025-01-08 15:08:25 -0600
committer Sanath Kumar <sanathku@google.com> 2025-02-18 16:21:40 -0800
commita1e75debecdf27bb7586966001a2a6baf3720f9e (patch)
treeb3929bd5cb815ce86f5ceb742a4f8e8d865b2019
parentaaa454ed859d43e691ff43a50b261ac516c5c412 (diff)
Use mVerb to track job execution state in system for consistency.
System currently uses `mRunningJob` to track job execution as a simple binary (executing/not executing) state. However, `mRunningJob` doesn't accurately reflect transient states, such as during initial binding for `onStartJob` or when stopping due to `onStopJob`. These granular state changes, from non-executing to executing, are tracked by `mVerb`. While `mRunningJob` is functional, using `mVerb` for consistency with other job related API implementation related to job state checks would provide a more accurate and consistent reflection of the job's lifecycle within the system. Test: atest CtsJobSchedulerTestCases Test: atest FrameworksMockingServicesTests Bug: 372529068 Flag: android.app.job.handle_abandoned_jobs Change-Id: Ib8077f601b9f476a71bbb1bd948aba4698d2fbc2
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java6
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/job/JobServiceContextTest.java19
2 files changed, 24 insertions, 1 deletions
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 ebfda527001d..010006edc995 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java
@@ -809,7 +809,11 @@ public final class JobServiceContext implements ServiceConnection {
if (!verifyCallerLocked(cb)) {
return;
}
-
+ if (mVerb != VERB_EXECUTING) {
+ // Any state other than executing means the
+ // job is in transient or stopped state
+ return;
+ }
executing = getRunningJobLocked();
}
if (executing != null && jobId == executing.getJobId()) {
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/JobServiceContextTest.java b/services/tests/mockingservicestests/src/com/android/server/job/JobServiceContextTest.java
index 904545bd3cc3..b4e845171a0b 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/JobServiceContextTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/JobServiceContextTest.java
@@ -276,6 +276,7 @@ public class JobServiceContextTest {
final int jobId = 123;
mJobServiceContext.setRunningJobLockedForTest(mMockJobStatus);
mJobServiceContext.setRunningCallbackLockedForTest(mMockJobCallback);
+ mJobServiceContext.mVerb = JobServiceContext.VERB_EXECUTING;
doReturn(jobId).when(mMockJobStatus).getJobId();
mJobServiceContext.doHandleAbandonedJob(mMockJobCallback, jobId);
@@ -296,7 +297,25 @@ public class JobServiceContextTest {
mJobServiceContext.setRunningCallbackLockedForTest(mMockJobCallback);
mJobServiceContext.doHandleAbandonedJob(mMockJobCallback, jobId);
+ verify(mMockJobStatus, never()).setAbandoned(true);
+
+ mJobServiceContext.setRunningJobLockedForTest(mMockJobStatus);
+ doReturn(jobId).when(mMockJobStatus).getJobId();
+
+ mJobServiceContext.mVerb = JobServiceContext.VERB_BINDING;
+ mJobServiceContext.doHandleAbandonedJob(mMockJobCallback, jobId);
+ verify(mMockJobStatus, never()).setAbandoned(true);
+ mJobServiceContext.mVerb = JobServiceContext.VERB_STARTING;
+ mJobServiceContext.doHandleAbandonedJob(mMockJobCallback, jobId);
+ verify(mMockJobStatus, never()).setAbandoned(true);
+
+ mJobServiceContext.mVerb = JobServiceContext.VERB_STOPPING;
+ mJobServiceContext.doHandleAbandonedJob(mMockJobCallback, jobId);
+ verify(mMockJobStatus, never()).setAbandoned(true);
+
+ mJobServiceContext.mVerb = JobServiceContext.VERB_FINISHED;
+ mJobServiceContext.doHandleAbandonedJob(mMockJobCallback, jobId);
verify(mMockJobStatus, never()).setAbandoned(true);
}