88
99import org .apache .logging .log4j .LogManager ;
1010import org .apache .logging .log4j .Logger ;
11+ import org .apache .logging .log4j .message .ParameterizedMessage ;
1112import org .elasticsearch .ElasticsearchStatusException ;
1213import org .elasticsearch .ResourceNotFoundException ;
1314import org .elasticsearch .action .ActionListener ;
2324import org .elasticsearch .cluster .block .ClusterBlockLevel ;
2425import org .elasticsearch .cluster .metadata .IndexNameExpressionResolver ;
2526import org .elasticsearch .cluster .service .ClusterService ;
27+ import org .elasticsearch .core .Nullable ;
2628import org .elasticsearch .common .inject .Inject ;
2729import org .elasticsearch .common .settings .Settings ;
28- import org .elasticsearch .core .CheckedConsumer ;
29- import org .elasticsearch .core .Nullable ;
3030import org .elasticsearch .persistent .PersistentTasksCustomMetadata ;
3131import org .elasticsearch .persistent .PersistentTasksService ;
3232import org .elasticsearch .tasks .Task ;
4646import org .elasticsearch .xpack .core .ml .utils .ExceptionsHelper ;
4747import org .elasticsearch .xpack .ml .MlConfigMigrationEligibilityCheck ;
4848import org .elasticsearch .xpack .ml .datafeed .persistence .DatafeedConfigProvider ;
49+ import org .elasticsearch .xpack .ml .job .JobManager ;
4950import org .elasticsearch .xpack .ml .job .persistence .JobConfigProvider ;
50- import org .elasticsearch .xpack .ml .job .persistence .JobDataDeleter ;
51- import org .elasticsearch .xpack .ml .job .persistence .JobResultsProvider ;
5251import org .elasticsearch .xpack .ml .notifications .AnomalyDetectionAuditor ;
5352import org .elasticsearch .xpack .ml .process .MlMemoryTracker ;
5453
@@ -68,8 +67,8 @@ public class TransportDeleteJobAction extends AcknowledgedTransportMasterNodeAct
6867 private final Client client ;
6968 private final PersistentTasksService persistentTasksService ;
7069 private final AnomalyDetectionAuditor auditor ;
71- private final JobResultsProvider jobResultsProvider ;
7270 private final JobConfigProvider jobConfigProvider ;
71+ private final JobManager jobManager ;
7372 private final DatafeedConfigProvider datafeedConfigProvider ;
7473 private final MlMemoryTracker memoryTracker ;
7574 private final MlConfigMigrationEligibilityCheck migrationEligibilityCheck ;
@@ -86,20 +85,20 @@ public class TransportDeleteJobAction extends AcknowledgedTransportMasterNodeAct
8685 public TransportDeleteJobAction (Settings settings , TransportService transportService , ClusterService clusterService ,
8786 ThreadPool threadPool , ActionFilters actionFilters ,
8887 IndexNameExpressionResolver indexNameExpressionResolver , PersistentTasksService persistentTasksService ,
89- Client client , AnomalyDetectionAuditor auditor , JobResultsProvider jobResultsProvider ,
88+ Client client , AnomalyDetectionAuditor auditor ,
9089 JobConfigProvider jobConfigProvider , DatafeedConfigProvider datafeedConfigProvider ,
91- MlMemoryTracker memoryTracker ) {
90+ MlMemoryTracker memoryTracker , JobManager jobManager ) {
9291 super (DeleteJobAction .NAME , transportService , clusterService , threadPool , actionFilters ,
9392 DeleteJobAction .Request ::new , indexNameExpressionResolver , ThreadPool .Names .SAME );
9493 this .client = client ;
9594 this .persistentTasksService = persistentTasksService ;
9695 this .auditor = auditor ;
97- this .jobResultsProvider = jobResultsProvider ;
9896 this .jobConfigProvider = jobConfigProvider ;
9997 this .datafeedConfigProvider = datafeedConfigProvider ;
10098 this .memoryTracker = memoryTracker ;
10199 this .migrationEligibilityCheck = new MlConfigMigrationEligibilityCheck (settings , clusterService );
102100 this .listenersByJobId = new HashMap <>();
101+ this .jobManager = jobManager ;
103102 }
104103
105104 @ Override
@@ -116,7 +115,7 @@ protected void masterOperation(Task task, DeleteJobAction.Request request, Clust
116115 return ;
117116 }
118117
119- logger .debug ("Deleting job '{}' " , request .getJobId ());
118+ logger .debug (() -> new ParameterizedMessage ( "[{}] deleting job " , request .getJobId () ));
120119
121120 if (request .isForce () == false ) {
122121 checkJobIsNotOpen (request .getJobId (), state );
@@ -128,8 +127,11 @@ protected void masterOperation(Task task, DeleteJobAction.Request request, Clust
128127 // Check if there is a deletion task for this job already and if yes wait for it to complete
129128 synchronized (listenersByJobId ) {
130129 if (listenersByJobId .containsKey (request .getJobId ())) {
131- logger .debug ("[{}] Deletion task [{}] will wait for existing deletion task to complete" ,
132- request .getJobId (), task .getId ());
130+ logger .debug (() -> new ParameterizedMessage (
131+ "[{}] Deletion task [{}] will wait for existing deletion task to complete" ,
132+ request .getJobId (),
133+ task .getId ()
134+ ));
133135 listenersByJobId .get (request .getJobId ()).add (listener );
134136 return ;
135137 } else {
@@ -153,9 +155,9 @@ protected void masterOperation(Task task, DeleteJobAction.Request request, Clust
153155 ActionListener <PutJobAction .Response > markAsDeletingListener = ActionListener .wrap (
154156 response -> {
155157 if (request .isForce ()) {
156- forceDeleteJob (parentTaskClient , request , finalListener );
158+ forceDeleteJob (parentTaskClient , request , state , finalListener );
157159 } else {
158- normalDeleteJob (parentTaskClient , request , finalListener );
160+ normalDeleteJob (parentTaskClient , request , state , finalListener );
159161 }
160162 },
161163 finalListener ::onFailure );
@@ -171,7 +173,7 @@ protected void masterOperation(Task task, DeleteJobAction.Request request, Clust
171173 logger .info (
172174 "[{}] config is missing but task exists. Attempting to delete tasks and stop process" ,
173175 request .getJobId ());
174- forceDeleteJob (parentTaskClient , request , finalListener );
176+ forceDeleteJob (parentTaskClient , request , state , finalListener );
175177 } else {
176178 finalListener .onFailure (e );
177179 }
@@ -199,64 +201,41 @@ private void notifyListeners(String jobId, @Nullable AcknowledgedResponse ack, @
199201 }
200202 }
201203
202- private void normalDeleteJob (ParentTaskAssigningClient parentTaskClient , DeleteJobAction .Request request ,
204+ private void normalDeleteJob (ParentTaskAssigningClient parentTaskClient ,
205+ DeleteJobAction .Request request ,
206+ ClusterState state ,
203207 ActionListener <AcknowledgedResponse > listener ) {
204208 String jobId = request .getJobId ();
205209
206210 // We clean up the memory tracker on delete rather than close as close is not a master node action
207211 memoryTracker .removeAnomalyDetectorJob (jobId );
208212
209- // Step 4. When the job has been removed from the cluster state, return a response
210- // -------
211- CheckedConsumer <Boolean , Exception > apiResponseHandler = jobDeleted -> {
212- if (jobDeleted ) {
213- logger .info ("Job [" + jobId + "] deleted" );
214- auditor .info (jobId , Messages .getMessage (Messages .JOB_AUDIT_DELETED ));
215- listener .onResponse (AcknowledgedResponse .TRUE );
216- } else {
217- listener .onResponse (AcknowledgedResponse .FALSE );
218- }
219- };
220-
221- // Step 3. When the physical storage has been deleted, delete the job config document
222- // -------
223- // Don't report an error if the document has already been deleted
224- CheckedConsumer <Boolean , Exception > deleteJobStateHandler = response -> jobConfigProvider .deleteJob (jobId , false ,
225- ActionListener .wrap (
226- deleteResponse -> apiResponseHandler .accept (Boolean .TRUE ),
227- listener ::onFailure
228- )
229- );
230-
231- // Step 2. Remove the job from any calendars
232- CheckedConsumer <Boolean , Exception > removeFromCalendarsHandler = response -> jobResultsProvider .removeJobFromCalendars (jobId ,
233- ActionListener .wrap (deleteJobStateHandler ::accept , listener ::onFailure ));
234-
235-
236- // Step 1. Delete the physical storage
237- new JobDataDeleter (parentTaskClient , jobId ).deleteJobDocuments (
238- jobConfigProvider , indexNameExpressionResolver , clusterService .state (), removeFromCalendarsHandler , listener ::onFailure );
213+ jobManager .deleteJob (request , parentTaskClient , state , listener );
239214 }
240215
241- private void forceDeleteJob (ParentTaskAssigningClient parentTaskClient , DeleteJobAction .Request request ,
242- ActionListener <AcknowledgedResponse > listener ) {
243-
244- logger .debug ("Force deleting job [{}]" , request .getJobId ());
216+ private void forceDeleteJob (
217+ ParentTaskAssigningClient parentTaskClient ,
218+ DeleteJobAction .Request request ,
219+ ClusterState state ,
220+ ActionListener <AcknowledgedResponse > listener
221+ ) {
245222
246- final ClusterState state = clusterService .state ();
247223 final String jobId = request .getJobId ();
224+ logger .debug (() -> new ParameterizedMessage ("[{}] force deleting job" , jobId ));
248225
249226 // 3. Delete the job
250227 ActionListener <Boolean > removeTaskListener = new ActionListener <Boolean >() {
251228 @ Override
252229 public void onResponse (Boolean response ) {
253- normalDeleteJob (parentTaskClient , request , listener );
230+ // use clusterService.state() here so that the updated state without the task is available
231+ normalDeleteJob (parentTaskClient , request , clusterService .state (), listener );
254232 }
255233
256234 @ Override
257235 public void onFailure (Exception e ) {
258236 if (ExceptionsHelper .unwrapCause (e ) instanceof ResourceNotFoundException ) {
259- normalDeleteJob (parentTaskClient , request , listener );
237+ // use clusterService.state() here so that the updated state without the task is available
238+ normalDeleteJob (parentTaskClient , request , clusterService .state (), listener );
260239 } else {
261240 listener .onFailure (e );
262241 }
@@ -266,12 +245,12 @@ public void onFailure(Exception e) {
266245 // 2. Cancel the persistent task. This closes the process gracefully so
267246 // the process should be killed first.
268247 ActionListener <KillProcessAction .Response > killJobListener = ActionListener .wrap (
269- response -> removePersistentTask (request . getJobId () , state , removeTaskListener ),
248+ response -> removePersistentTask (jobId , state , removeTaskListener ),
270249 e -> {
271250 if (ExceptionsHelper .unwrapCause (e ) instanceof ElasticsearchStatusException ) {
272251 // Killing the process marks the task as completed so it
273252 // may have disappeared when we get here
274- removePersistentTask (request . getJobId () , state , removeTaskListener );
253+ removePersistentTask (jobId , state , removeTaskListener );
275254 } else {
276255 listener .onFailure (e );
277256 }
0 commit comments