18
18
import org .elasticsearch .action .support .master .TransportMasterNodeAction ;
19
19
import org .elasticsearch .client .Client ;
20
20
import org .elasticsearch .cluster .ClusterState ;
21
+ import org .elasticsearch .cluster .ClusterStateUpdateTask ;
21
22
import org .elasticsearch .cluster .block .ClusterBlockException ;
22
23
import org .elasticsearch .cluster .block .ClusterBlockLevel ;
23
24
import org .elasticsearch .cluster .metadata .AliasOrIndex ;
24
25
import org .elasticsearch .cluster .metadata .IndexMetaData ;
25
26
import org .elasticsearch .cluster .metadata .IndexNameExpressionResolver ;
26
27
import org .elasticsearch .cluster .metadata .MappingMetaData ;
28
+ import org .elasticsearch .cluster .metadata .MetaData ;
27
29
import org .elasticsearch .cluster .node .DiscoveryNode ;
28
30
import org .elasticsearch .cluster .routing .IndexRoutingTable ;
29
31
import org .elasticsearch .cluster .service .ClusterService ;
@@ -455,12 +457,25 @@ protected ClusterBlockException checkBlock(OpenJobAction.Request request, Cluste
455
457
protected void masterOperation (OpenJobAction .Request request , ClusterState state , ActionListener <OpenJobAction .Response > listener ) {
456
458
OpenJobAction .JobParams jobParams = request .getJobParams ();
457
459
if (licenseState .isMachineLearningAllowed ()) {
458
- // Step 5. Wait for job to be started and respond
459
- ActionListener <PersistentTasksCustomMetaData .PersistentTask <OpenJobAction .JobParams >> finalListener =
460
+
461
+ // Step 6. Clear job finished time once the job is started and respond
462
+ ActionListener <OpenJobAction .Response > clearJobFinishTime = ActionListener .wrap (
463
+ response -> {
464
+ if (response .isAcknowledged ()) {
465
+ clearJobFinishedTime (jobParams .getJobId (), listener );
466
+ } else {
467
+ listener .onResponse (response );
468
+ }
469
+ },
470
+ listener ::onFailure
471
+ );
472
+
473
+ // Step 5. Wait for job to be started
474
+ ActionListener <PersistentTasksCustomMetaData .PersistentTask <OpenJobAction .JobParams >> waitForJobToStart =
460
475
new ActionListener <PersistentTasksCustomMetaData .PersistentTask <OpenJobAction .JobParams >>() {
461
476
@ Override
462
477
public void onResponse (PersistentTasksCustomMetaData .PersistentTask <OpenJobAction .JobParams > task ) {
463
- waitForJobStarted (task .getId (), jobParams , listener );
478
+ waitForJobStarted (task .getId (), jobParams , clearJobFinishTime );
464
479
}
465
480
466
481
@ Override
@@ -476,7 +491,7 @@ public void onFailure(Exception e) {
476
491
// Step 4. Start job task
477
492
ActionListener <PutJobAction .Response > jobUpateListener = ActionListener .wrap (
478
493
response -> persistentTasksService .sendStartRequest (MlTasks .jobTaskId (jobParams .getJobId ()),
479
- OpenJobAction .TASK_NAME , jobParams , finalListener ),
494
+ OpenJobAction .TASK_NAME , jobParams , waitForJobToStart ),
480
495
listener ::onFailure
481
496
);
482
497
@@ -579,6 +594,35 @@ public void onTimeout(TimeValue timeout) {
579
594
});
580
595
}
581
596
597
+ private void clearJobFinishedTime (String jobId , ActionListener <OpenJobAction .Response > listener ) {
598
+ clusterService .submitStateUpdateTask ("clearing-job-finish-time-for-" + jobId , new ClusterStateUpdateTask () {
599
+ @ Override
600
+ public ClusterState execute (ClusterState currentState ) {
601
+ MlMetadata mlMetadata = MlMetadata .getMlMetadata (currentState );
602
+ MlMetadata .Builder mlMetadataBuilder = new MlMetadata .Builder (mlMetadata );
603
+ Job .Builder jobBuilder = new Job .Builder (mlMetadata .getJobs ().get (jobId ));
604
+ jobBuilder .setFinishedTime (null );
605
+
606
+ mlMetadataBuilder .putJob (jobBuilder .build (), true );
607
+ ClusterState .Builder builder = ClusterState .builder (currentState );
608
+ return builder .metaData (new MetaData .Builder (currentState .metaData ())
609
+ .putCustom (MlMetadata .TYPE , mlMetadataBuilder .build ()))
610
+ .build ();
611
+ }
612
+
613
+ @ Override
614
+ public void onFailure (String source , Exception e ) {
615
+ logger .error ("[" + jobId + "] Failed to clear finished_time; source [" + source + "]" , e );
616
+ listener .onResponse (new OpenJobAction .Response (true ));
617
+ }
618
+
619
+ @ Override
620
+ public void clusterStateProcessed (String source , ClusterState oldState ,
621
+ ClusterState newState ) {
622
+ listener .onResponse (new OpenJobAction .Response (true ));
623
+ }
624
+ });
625
+ }
582
626
private void cancelJobStart (PersistentTasksCustomMetaData .PersistentTask <OpenJobAction .JobParams > persistentTask , Exception exception ,
583
627
ActionListener <OpenJobAction .Response > listener ) {
584
628
persistentTasksService .sendRemoveRequest (persistentTask .getId (),
0 commit comments