@@ -60,7 +60,9 @@ import nextflow.trace.TraceRecord
60
60
@CompileStatic
61
61
class GoogleBatchTaskHandler extends TaskHandler implements FusionAwareTask {
62
62
63
- private static Pattern EXIT_CODE_REGEX = ~/ exit code 500(\d\d )/
63
+ private static final Pattern EXIT_CODE_REGEX = ~/ exit code 500(\d\d )/
64
+
65
+ private static final Pattern BATCH_ERROR_REGEX = ~/ Batch Error: code/
64
66
65
67
private GoogleBatchExecutor executor
66
68
@@ -98,6 +100,11 @@ class GoogleBatchTaskHandler extends TaskHandler implements FusionAwareTask {
98
100
99
101
private volatile long timestamp
100
102
103
+ /**
104
+ * A flag to indicate that the job has failed without launching any tasks
105
+ */
106
+ private volatile boolean noTaskJobfailure
107
+
101
108
GoogleBatchTaskHandler (TaskRun task , GoogleBatchExecutor executor ) {
102
109
super (task)
103
110
this . client = executor. getClient()
@@ -445,9 +452,10 @@ class GoogleBatchTaskHandler extends TaskHandler implements FusionAwareTask {
445
452
*/
446
453
protected String getTaskState () {
447
454
final tasks = client. listTasks(jobId)
448
- if ( ! tasks. iterator(). hasNext() )
449
- return ' PENDING'
450
-
455
+ if ( ! tasks. iterator(). hasNext() ) {
456
+ // if there are no tasks checks the job status
457
+ return checkJobStatus()
458
+ }
451
459
final now = System . currentTimeMillis()
452
460
final delta = now - timestamp;
453
461
if ( ! taskState || delta >= 1_000) {
@@ -468,6 +476,21 @@ class GoogleBatchTaskHandler extends TaskHandler implements FusionAwareTask {
468
476
return taskState
469
477
}
470
478
479
+ protected String checkJobStatus () {
480
+ final jobStatus = client. getJobStatus(jobId)
481
+ final newState = jobStatus?. state as String
482
+ if (newState) {
483
+ taskState = newState
484
+ timestamp = System . currentTimeMillis()
485
+ if (newState == " FAILED" ) {
486
+ noTaskJobfailure = true
487
+ }
488
+ return taskState
489
+ } else {
490
+ return " PENDING"
491
+ }
492
+ }
493
+
471
494
static private final List<String > RUNNING_OR_COMPLETED = [' RUNNING' , ' SUCCEEDED' , ' FAILED' ]
472
495
473
496
static private final List<String > COMPLETED = [' SUCCEEDED' , ' FAILED' ]
@@ -510,13 +533,14 @@ class GoogleBatchTaskHandler extends TaskHandler implements FusionAwareTask {
510
533
511
534
protected Throwable getJobError () {
512
535
try {
513
- final status = client. getTaskStatus(jobId, taskId)
514
- final eventsCount = status. getStatusEventsCount()
515
- final lastEvent = eventsCount > 0 ? status. getStatusEvents(eventsCount - 1 ) : null
536
+ final events = noTaskJobfailure
537
+ ? client. getJobStatus(jobId). getStatusEventsList()
538
+ : client. getTaskStatus(jobId, taskId). getStatusEventsList()
539
+ final lastEvent = events?. get(events. size() - 1 )
516
540
log. debug " [GOOGLE BATCH] Process `${ task.lazyName()} ` - last event: ${ lastEvent} ; exit code: ${ lastEvent?.taskExecution?.exitCode} "
517
541
518
542
final error = lastEvent?. description
519
- if ( error && EXIT_CODE_REGEX . matcher(error). find() ) {
543
+ if ( error && ( EXIT_CODE_REGEX . matcher(error). find() || BATCH_ERROR_REGEX . matcher(error) . find() ) ) {
520
544
return new ProcessException (error)
521
545
}
522
546
}
0 commit comments