6565import org .elasticsearch .xpack .core .ml .job .process .autodetect .state .Quantiles ;
6666import org .elasticsearch .xpack .core .ml .utils .ExceptionsHelper ;
6767import org .elasticsearch .xpack .ml .datafeed .persistence .DatafeedConfigProvider ;
68- import org .elasticsearch .xpack .ml .job .persistence . JobConfigProvider ;
68+ import org .elasticsearch .xpack .ml .job .JobManager ;
6969import org .elasticsearch .xpack .ml .job .persistence .JobDataDeleter ;
7070import org .elasticsearch .xpack .ml .job .persistence .JobResultsProvider ;
7171import org .elasticsearch .xpack .ml .notifications .Auditor ;
@@ -93,7 +93,7 @@ public class TransportDeleteJobAction extends TransportMasterNodeAction<DeleteJo
9393 private final PersistentTasksService persistentTasksService ;
9494 private final Auditor auditor ;
9595 private final JobResultsProvider jobResultsProvider ;
96- private final JobConfigProvider jobConfigProvider ;
96+ private final JobManager jobManager ;
9797 private final DatafeedConfigProvider datafeedConfigProvider ;
9898 private final MlMemoryTracker memoryTracker ;
9999
@@ -110,15 +110,15 @@ public TransportDeleteJobAction(Settings settings, TransportService transportSer
110110 ThreadPool threadPool , ActionFilters actionFilters ,
111111 IndexNameExpressionResolver indexNameExpressionResolver , PersistentTasksService persistentTasksService ,
112112 Client client , Auditor auditor , JobResultsProvider jobResultsProvider ,
113- JobConfigProvider jobConfigProvider , DatafeedConfigProvider datafeedConfigProvider ,
113+ JobManager jobManager , DatafeedConfigProvider datafeedConfigProvider ,
114114 MlMemoryTracker memoryTracker ) {
115115 super (settings , DeleteJobAction .NAME , transportService , clusterService , threadPool , actionFilters ,
116116 indexNameExpressionResolver , DeleteJobAction .Request ::new );
117117 this .client = client ;
118118 this .persistentTasksService = persistentTasksService ;
119119 this .auditor = auditor ;
120120 this .jobResultsProvider = jobResultsProvider ;
121- this .jobConfigProvider = jobConfigProvider ;
121+ this .jobManager = jobManager ;
122122 this .datafeedConfigProvider = datafeedConfigProvider ;
123123 this .memoryTracker = memoryTracker ;
124124 this .listenersByJobId = new HashMap <>();
@@ -189,7 +189,15 @@ protected void masterOperation(Task task, DeleteJobAction.Request request, Clust
189189 finalListener .onFailure (e );
190190 });
191191
192- markJobAsDeletingIfNotUsed (request .getJobId (), markAsDeletingListener );
192+ ActionListener <Boolean > checkForDatafeedsListener = ActionListener .wrap (
193+ ok -> jobManager .markJobAsDeleting (request .getJobId (), request .isForce (), markAsDeletingListener ),
194+ finalListener ::onFailure
195+ );
196+
197+ // This check only applies to index configurations.
198+ // ClusterState config makes the same check against the
199+ // job being used by a datafeed in MlMetadata.markJobAsDeleting()
200+ checkJobNotUsedByDatafeed (request .getJobId (), checkForDatafeedsListener );
193201 }
194202
195203 private void notifyListeners (String jobId , @ Nullable AcknowledgedResponse ack , @ Nullable Exception error ) {
@@ -231,7 +239,7 @@ private void normalDeleteJob(ParentTaskAssigningClient parentTaskClient, DeleteJ
231239 // Step 3. When the physical storage has been deleted, delete the job config document
232240 // -------
233241 // Don't report an error if the document has already been deleted
234- CheckedConsumer <Boolean , Exception > deleteJobStateHandler = response -> jobConfigProvider .deleteJob (jobId , false ,
242+ CheckedConsumer <Boolean , Exception > deleteJobStateHandler = response -> jobManager .deleteJob (request ,
235243 ActionListener .wrap (
236244 deleteResponse -> apiResponseHandler .accept (Boolean .TRUE ),
237245 listener ::onFailure
@@ -332,9 +340,8 @@ private void deleteJobDocuments(ParentTaskAssigningClient parentTaskClient, Stri
332340 );
333341
334342 // Step 5. Determine if we are on a shared index by looking at `.ml-anomalies-shared` or the custom index's aliases
335- ActionListener <Job .Builder > getJobHandler = ActionListener .wrap (
336- builder -> {
337- Job job = builder .build ();
343+ ActionListener <Job > getJobHandler = ActionListener .wrap (
344+ job -> {
338345 indexName .set (job .getResultsIndexName ());
339346 if (indexName .get ().equals (AnomalyDetectorsIndexFields .RESULTS_INDEX_PREFIX +
340347 AnomalyDetectorsIndexFields .RESULTS_INDEX_DEFAULT )) {
@@ -357,7 +364,7 @@ private void deleteJobDocuments(ParentTaskAssigningClient parentTaskClient, Stri
357364 // Step 4. Get the job as the result index name is required
358365 ActionListener <Boolean > deleteCategorizerStateHandler = ActionListener .wrap (
359366 response -> {
360- jobConfigProvider .getJob (jobId , getJobHandler );
367+ jobManager .getJob (jobId , getJobHandler );
361368 },
362369 failureHandler
363370 );
@@ -574,16 +581,15 @@ private void checkJobIsNotOpen(String jobId, ClusterState state) {
574581 }
575582 }
576583
577- private void markJobAsDeletingIfNotUsed (String jobId , ActionListener <Boolean > listener ) {
578-
584+ private void checkJobNotUsedByDatafeed (String jobId , ActionListener <Boolean > listener ) {
579585 datafeedConfigProvider .findDatafeedsForJobIds (Collections .singletonList (jobId ), ActionListener .wrap (
580586 datafeedIds -> {
581587 if (datafeedIds .isEmpty () == false ) {
582588 listener .onFailure (ExceptionsHelper .conflictStatusException ("Cannot delete job [" + jobId + "] because datafeed ["
583589 + datafeedIds .iterator ().next () + "] refers to it" ));
584590 return ;
585591 }
586- jobConfigProvider . markJobAsDeleting ( jobId , listener );
592+ listener . onResponse ( Boolean . TRUE );
587593 },
588594 listener ::onFailure
589595 ));
0 commit comments