Skip to content

Commit 6041d50

Browse files
j-gaocopybara-github
authored andcommitted
Internal change
PiperOrigin-RevId: 941526158
1 parent d6bceb2 commit 6041d50

6 files changed

Lines changed: 244 additions & 43 deletions

File tree

src/java/com/google/devtools/mobileharness/infra/ats/common/jobcreator/XtsJobCreator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -589,7 +589,7 @@ public ImmutableList<JobInfo> createXtsNonTradefedJobs(SessionRequestInfo sessio
589589
*/
590590
private JobInfo createSetUpJob(JsonObject specJson, SessionRequestInfo sessionRequestInfo)
591591
throws MobileHarnessException, InterruptedException {
592-
String name = "setup";
592+
String name = XtsConstants.SETUP_JOB_NAME;
593593
ImmutableList<SubDeviceSpec> subDeviceSpecList =
594594
sessionRequestHandlerUtil
595595
.getSessionSubDeviceSpecList(sessionRequestInfo, /* forMultiDeviceJob= */ true)

src/java/com/google/devtools/mobileharness/infra/ats/console/controller/sessionplugin/AtsSessionPlugin.java

Lines changed: 102 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
import static com.google.devtools.mobileharness.shared.util.time.TimeUtils.toProtoTimestamp;
3131
import static java.util.Arrays.stream;
3232

33+
import com.google.common.annotations.VisibleForTesting;
34+
import com.google.common.base.Ascii;
3335
import com.google.common.collect.ImmutableList;
3436
import com.google.common.collect.ImmutableSet;
3537
import com.google.common.eventbus.Subscribe;
@@ -41,6 +43,7 @@
4143
import com.google.devtools.mobileharness.api.model.job.out.Result.ResultTypeWithCause;
4244
import com.google.devtools.mobileharness.api.model.lab.LabLocator;
4345
import com.google.devtools.mobileharness.api.model.proto.Test.TestResult;
46+
import com.google.devtools.mobileharness.infra.ats.common.SessionHandlerHelper;
4447
import com.google.devtools.mobileharness.infra.ats.common.jobcreator.XtsJobCreator;
4548
import com.google.devtools.mobileharness.infra.ats.console.controller.proto.SessionPluginProto.AtsSessionCancellation;
4649
import com.google.devtools.mobileharness.infra.ats.console.controller.proto.SessionPluginProto.AtsSessionPluginConfig;
@@ -126,7 +129,7 @@ public class AtsSessionPlugin {
126129

127130
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
128131

129-
private static final AtomicInteger NEXT_RUN_COMMAND_ID = new AtomicInteger(1);
132+
@VisibleForTesting static final AtomicInteger NEXT_RUN_COMMAND_ID = new AtomicInteger(1);
130133

131134
private final Object testCancellationLock = new Object();
132135
private final Object runningTestsLock = new Object();
@@ -173,7 +176,13 @@ public class AtsSessionPlugin {
173176
/** Set in {@link #onSessionStarting}. */
174177
private volatile AtsSessionPluginConfig config;
175178

176-
private ImmutableList<JobInfo> nonTradefedJobs = ImmutableList.of();
179+
private volatile ImmutableList<JobInfo> tradefedJobs = ImmutableList.of();
180+
private volatile ImmutableList<JobInfo> nonTradefedJobs = ImmutableList.of();
181+
182+
private final Object setupJobLock = new Object();
183+
184+
@GuardedBy("setupJobLock")
185+
private Optional<String> runningSetupJobId = Optional.empty();
177186

178187
@Inject
179188
AtsSessionPlugin(
@@ -293,7 +302,6 @@ public void onSessionStarted(SessionStartedEvent event)
293302
runCommandHandler.initialize(runCommand);
294303

295304
// Create tradefed jobs.
296-
ImmutableList<JobInfo> tradefedJobs;
297305
try {
298306
tradefedJobs = runCommandHandler.createTradefedJobs(runCommand);
299307
} catch (MobileHarnessException e) {
@@ -332,44 +340,12 @@ public void onSessionStarted(SessionStartedEvent event)
332340
/* cause= */ null);
333341
}
334342

335-
boolean startedTfJobs = false;
336-
if (tradefedJobs.size() <= 1) {
337-
startedTfJobs = addAndTrackTradefedJobs(tradefedJobs);
338-
} else {
339-
// If there are multiple tradefed jobs, add them to the session sequentially.
340-
// Prioritize static XTS jobs. Other jobs are added to additional tradefed jobs list.
341-
List<JobInfo> staticXtsJobs = new ArrayList<>();
342-
343-
synchronized (additionalTradefedJobs) {
344-
tradefedJobs.forEach(
345-
tradefedJob -> {
346-
if (tradefedJob.locator().getName().contains(XtsConstants.STATIC_XTS_JOB_NAME)) {
347-
staticXtsJobs.add(tradefedJob);
348-
} else {
349-
additionalTradefedJobs.add(tradefedJob);
350-
}
351-
});
352-
}
343+
Optional<JobInfo> setupJobOpt = nonTradefedJobs.stream().filter(this::isSetupJob).findFirst();
353344

354-
if (!staticXtsJobs.isEmpty()) {
355-
startedTfJobs = addAndTrackTradefedJobs(staticXtsJobs);
356-
} else {
357-
// No static XTS jobs found, add the first of the additional jobs.
358-
synchronized (additionalTradefedJobs) {
359-
if (!additionalTradefedJobs.isEmpty()) {
360-
startedTfJobs =
361-
addAndTrackTradefedJobs(ImmutableList.of(additionalTradefedJobs.remove(0)));
362-
}
363-
}
364-
}
365-
}
366-
367-
if (!startedTfJobs) {
368-
logger.atInfo().log(
369-
"On session [%s] starting, no tradefed job was added, try add non-tradefed jobs if"
370-
+ " needed.",
371-
sessionInfo.getSessionId());
372-
addJobsToSession(nonTradefedJobs);
345+
if (setupJobOpt.isPresent()) {
346+
addSetupJob(setupJobOpt.get());
347+
} else {
348+
addMainJobs();
373349
}
374350

375351
// Starts TF runtime info updater.
@@ -443,8 +419,21 @@ public void onJobEnd(JobEndEvent jobEndEvent)
443419
}
444420
}
445421

422+
String jobId = currentJob.locator().getId();
423+
boolean isSetupJobEnd = false;
424+
synchronized (setupJobLock) {
425+
if (runningSetupJobId.isPresent() && runningSetupJobId.get().equals(jobId)) {
426+
runningSetupJobId = Optional.empty();
427+
isSetupJobEnd = true;
428+
}
429+
}
430+
if (isSetupJobEnd) {
431+
logger.atInfo().log("Setup job [%s] ended, starting main jobs.", jobId);
432+
addMainJobs();
433+
return;
434+
}
435+
446436
synchronized (runningTradefedJobs) {
447-
String jobId = currentJob.locator().getId();
448437
if (!runningTradefedJobs.containsKey(jobId)) {
449438
return;
450439
}
@@ -828,6 +817,78 @@ private void addDeviceIdsToSubDeviceSpecs(
828817
}
829818
}
830819

820+
private boolean isSetupJob(JobInfo jobInfo) {
821+
return Ascii.equalsIgnoreCase(jobInfo.locator().getName(), XtsConstants.SETUP_JOB_NAME)
822+
|| Ascii.equalsIgnoreCase(
823+
jobInfo.properties().getOptional(SessionHandlerHelper.XTS_MODULE_NAME_PROP).orElse(""),
824+
XtsConstants.SETUP_JOB_NAME);
825+
}
826+
827+
/**
828+
* Adds the ATS setup job to the session and records its execution ID in {@code
829+
* runningSetupJobId}.
830+
*/
831+
private void addSetupJob(JobInfo setupJob) {
832+
nonTradefedJobs =
833+
nonTradefedJobs.stream().filter(job -> !job.equals(setupJob)).collect(toImmutableList());
834+
ImmutableList<String> setupJobIds = addJobsToSession(ImmutableList.of(setupJob));
835+
if (!setupJobIds.isEmpty()) {
836+
synchronized (setupJobLock) {
837+
runningSetupJobId = Optional.of(setupJobIds.get(0));
838+
}
839+
}
840+
}
841+
842+
/**
843+
* Adds main Tradefed jobs to the session.
844+
*
845+
* <p>If multiple Tradefed jobs exist, they are partitioned:
846+
*
847+
* <ul>
848+
* <li><b>Static xTS jobs</b> are prioritized and added immediately to run concurrently.
849+
* <li><b>Additional Tradefed jobs</b> are queued in {@code additionalTradefedJobs} to execute
850+
* sequentially as previous jobs finish in {@link #onJobEnd}.
851+
* </ul>
852+
*
853+
* <p>If no Tradefed jobs could be started, falls back to adding non-Tradefed jobs.
854+
*/
855+
private void addMainJobs() {
856+
boolean startedTfJobs = false;
857+
if (tradefedJobs.size() <= 1) {
858+
startedTfJobs = addAndTrackTradefedJobs(tradefedJobs);
859+
} else {
860+
List<JobInfo> staticXtsJobs = new ArrayList<>();
861+
synchronized (additionalTradefedJobs) {
862+
tradefedJobs.forEach(
863+
tradefedJob -> {
864+
if (tradefedJob.locator().getName().contains(XtsConstants.STATIC_XTS_JOB_NAME)) {
865+
staticXtsJobs.add(tradefedJob);
866+
} else {
867+
additionalTradefedJobs.add(tradefedJob);
868+
}
869+
});
870+
}
871+
if (!staticXtsJobs.isEmpty()) {
872+
startedTfJobs = addAndTrackTradefedJobs(staticXtsJobs);
873+
} else {
874+
synchronized (additionalTradefedJobs) {
875+
if (!additionalTradefedJobs.isEmpty()) {
876+
startedTfJobs =
877+
addAndTrackTradefedJobs(ImmutableList.of(additionalTradefedJobs.remove(0)));
878+
}
879+
}
880+
}
881+
}
882+
883+
if (!startedTfJobs) {
884+
logger.atInfo().log(
885+
"On session [%s] starting, no tradefed job was added, try add non-tradefed jobs if"
886+
+ " needed.",
887+
sessionInfo.getSessionId());
888+
addJobsToSession(nonTradefedJobs);
889+
}
890+
}
891+
831892
/**
832893
* Adds Tradefed jobs to the session and records them in {@code runningTradefedJobs}.
833894
*

src/java/com/google/devtools/mobileharness/infra/ats/console/controller/sessionplugin/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ java_library(
5252
"//src/java/com/google/devtools/mobileharness/infra/ats/common:ats_session_plugin_util",
5353
"//src/java/com/google/devtools/mobileharness/infra/ats/common:local_device_util",
5454
"//src/java/com/google/devtools/mobileharness/infra/ats/common:local_device_util_impl",
55+
"//src/java/com/google/devtools/mobileharness/infra/ats/common:session_handler_helper",
5556
"//src/java/com/google/devtools/mobileharness/infra/ats/common/jobcreator:console_job_creator",
5657
"//src/java/com/google/devtools/mobileharness/infra/ats/common/jobcreator:xts_job_creator",
5758
"//src/java/com/google/devtools/mobileharness/infra/ats/console/result/report:compatibility_report_module",

src/java/com/google/devtools/mobileharness/platform/android/xts/constant/XtsConstants.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ public class XtsConstants {
7979
/** The job name of static xTS job. */
8080
public static final String STATIC_XTS_JOB_NAME = "STATIC_XTS";
8181

82+
/** The job name of xTS setup job. */
83+
public static final String SETUP_JOB_NAME = "SETUP";
84+
8285
/**
8386
* MH test property key for the a tradefed test's filtered expanded module names (e.g. arm64-v8a
8487
* CtsBatteryHealthTestCases).

src/javatests/com/google/devtools/mobileharness/infra/ats/common/jobcreator/ConsoleJobCreatorTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import com.google.devtools.mobileharness.infra.ats.common.proto.SessionRequestInfo;
4040
import com.google.devtools.mobileharness.infra.ats.common.proto.XtsCommonProto.DeviceInfo;
4141
import com.google.devtools.mobileharness.infra.ats.common.proto.XtsCommonProto.ShardingMode;
42+
import com.google.devtools.mobileharness.platform.android.xts.constant.XtsConstants;
4243
import com.google.devtools.mobileharness.platform.android.xts.constant.XtsPropertyName.Job;
4344
import com.google.devtools.mobileharness.platform.android.xts.suite.retry.PreviousResultLoader;
4445
import com.google.devtools.mobileharness.platform.android.xts.suite.retry.PreviousResultLoader.TradefedResultFilesBundle;
@@ -693,7 +694,7 @@ public void createXtsNonTradefedJobs_moblyOnly_setupJobInjected() throws Excepti
693694
ImmutableList<JobInfo> jobs = jobCreator.createXtsNonTradefedJobs(sessionRequestInfo);
694695

695696
assertThat(jobs).hasSize(2);
696-
assertThat(jobs.get(0).locator().getName()).isEqualTo("setup");
697+
assertThat(jobs.get(0).locator().getName()).isEqualTo(XtsConstants.SETUP_JOB_NAME);
697698
assertThat(jobs.get(0).type().getDriver()).isEqualTo("NoOpDriver");
698699
DeviceInfoCollectorDecoratorSpec spec =
699700
jobs.get(0)

0 commit comments

Comments
 (0)