Skip to content

Commit 9134bb3

Browse files
dimitris-athanasioukcm
authored andcommitted
[ML] Refactor job deletion logic into the transport action (#33891)
The job deletion logic was scattered around a few places: the transport action, the job manager and the deletion task. Overloading the task with deletion logic also meant extra dependencies in the core package which should be unnecessary. This commit consolidates all this logic into the transport action and replaces the deletion task with a plain one that needs not be aware of deletion logic.
1 parent 605cb34 commit 9134bb3

File tree

17 files changed

+375
-404
lines changed

17 files changed

+375
-404
lines changed

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/action/DeleteJobAction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import org.elasticsearch.tasks.Task;
1717
import org.elasticsearch.tasks.TaskId;
1818
import org.elasticsearch.xpack.core.ml.job.config.Job;
19-
import org.elasticsearch.xpack.core.ml.job.persistence.JobStorageDeletionTask;
19+
import org.elasticsearch.xpack.core.ml.job.persistence.JobDeletionTask;
2020
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
2121

2222
import java.io.IOException;
@@ -71,7 +71,7 @@ public ActionRequestValidationException validate() {
7171

7272
@Override
7373
public Task createTask(long id, String type, String action, TaskId parentTaskId, Map<String, String> headers) {
74-
return new JobStorageDeletionTask(id, type, action, "delete-job-" + jobId, parentTaskId, headers);
74+
return new JobDeletionTask(id, type, action, "delete-job-" + jobId, parentTaskId, headers);
7575
}
7676

7777
@Override
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
package org.elasticsearch.xpack.core.ml.job.persistence;
7+
8+
import org.elasticsearch.tasks.Task;
9+
import org.elasticsearch.tasks.TaskId;
10+
11+
import java.util.Map;
12+
13+
public class JobDeletionTask extends Task {
14+
15+
public JobDeletionTask(long id, String type, String action, String description, TaskId parentTask, Map<String, String> headers) {
16+
super(id, type, action, description, parentTask, headers);
17+
}
18+
}

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/job/persistence/JobStorageDeletionTask.java

Lines changed: 0 additions & 301 deletions
This file was deleted.

x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/job/config/JobTests.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
package org.elasticsearch.xpack.core.ml.job.config;
77

88
import com.carrotsearch.randomizedtesting.generators.CodepointSetGenerator;
9-
109
import org.elasticsearch.ElasticsearchStatusException;
1110
import org.elasticsearch.Version;
1211
import org.elasticsearch.common.bytes.BytesReference;

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportDeleteJobAction.java

Lines changed: 342 additions & 25 deletions
Large diffs are not rendered by default.

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportDeleteModelSnapshotAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import org.elasticsearch.xpack.core.ml.action.DeleteModelSnapshotAction;
2121
import org.elasticsearch.xpack.core.ml.job.config.Job;
2222
import org.elasticsearch.xpack.core.ml.job.messages.Messages;
23-
import org.elasticsearch.xpack.core.ml.job.persistence.JobDataDeleter;
23+
import org.elasticsearch.xpack.ml.job.persistence.JobDataDeleter;
2424
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.ModelSnapshot;
2525
import org.elasticsearch.xpack.ml.job.JobManager;
2626
import org.elasticsearch.xpack.ml.job.persistence.JobResultsProvider;

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportGetFiltersAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import org.elasticsearch.xpack.core.ml.action.util.PageParams;
3434
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
3535
import org.elasticsearch.xpack.core.ml.job.config.MlFilter;
36-
import org.elasticsearch.xpack.core.ml.utils.MlIndicesUtils;
36+
import org.elasticsearch.xpack.ml.utils.MlIndicesUtils;
3737

3838
import java.io.IOException;
3939
import java.io.InputStream;

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportGetOverallBucketsAction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,19 @@
2929
import org.elasticsearch.xpack.core.ml.action.util.QueryPage;
3030
import org.elasticsearch.xpack.core.ml.job.config.Job;
3131
import org.elasticsearch.xpack.core.ml.job.persistence.AnomalyDetectorsIndex;
32-
import org.elasticsearch.xpack.ml.job.persistence.BucketsQueryBuilder;
3332
import org.elasticsearch.xpack.core.ml.job.results.Bucket;
3433
import org.elasticsearch.xpack.core.ml.job.results.OverallBucket;
3534
import org.elasticsearch.xpack.core.ml.job.results.Result;
3635
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
3736
import org.elasticsearch.xpack.core.ml.utils.Intervals;
38-
import org.elasticsearch.xpack.core.ml.utils.MlIndicesUtils;
3937
import org.elasticsearch.xpack.ml.MachineLearning;
4038
import org.elasticsearch.xpack.ml.job.JobManager;
39+
import org.elasticsearch.xpack.ml.job.persistence.BucketsQueryBuilder;
4140
import org.elasticsearch.xpack.ml.job.persistence.overallbuckets.OverallBucketsAggregator;
4241
import org.elasticsearch.xpack.ml.job.persistence.overallbuckets.OverallBucketsCollector;
4342
import org.elasticsearch.xpack.ml.job.persistence.overallbuckets.OverallBucketsProcessor;
4443
import org.elasticsearch.xpack.ml.job.persistence.overallbuckets.OverallBucketsProvider;
44+
import org.elasticsearch.xpack.ml.utils.MlIndicesUtils;
4545

4646
import java.util.HashSet;
4747
import java.util.List;

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportRevertModelSnapshotAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import org.elasticsearch.xpack.core.ml.job.config.Job;
2626
import org.elasticsearch.xpack.core.ml.job.config.JobState;
2727
import org.elasticsearch.xpack.core.ml.job.messages.Messages;
28-
import org.elasticsearch.xpack.core.ml.job.persistence.JobDataDeleter;
28+
import org.elasticsearch.xpack.ml.job.persistence.JobDataDeleter;
2929
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.ModelSnapshot;
3030
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
3131
import org.elasticsearch.xpack.ml.job.JobManager;

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/JobManager.java

Lines changed: 0 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import org.elasticsearch.action.ActionListener;
1010
import org.elasticsearch.action.index.IndexResponse;
1111
import org.elasticsearch.action.support.WriteRequest;
12-
import org.elasticsearch.action.support.master.AcknowledgedResponse;
1312
import org.elasticsearch.client.Client;
1413
import org.elasticsearch.cluster.AckedClusterStateUpdateTask;
1514
import org.elasticsearch.cluster.ClusterState;
@@ -34,7 +33,6 @@
3433
import org.elasticsearch.xpack.core.ml.MachineLearningField;
3534
import org.elasticsearch.xpack.core.ml.MlMetadata;
3635
import org.elasticsearch.xpack.core.ml.MlTasks;
37-
import org.elasticsearch.xpack.core.ml.action.DeleteJobAction;
3836
import org.elasticsearch.xpack.core.ml.action.PutJobAction;
3937
import org.elasticsearch.xpack.core.ml.action.RevertModelSnapshotAction;
4038
import org.elasticsearch.xpack.core.ml.action.UpdateJobAction;
@@ -47,7 +45,6 @@
4745
import org.elasticsearch.xpack.core.ml.job.config.JobUpdate;
4846
import org.elasticsearch.xpack.core.ml.job.config.MlFilter;
4947
import org.elasticsearch.xpack.core.ml.job.messages.Messages;
50-
import org.elasticsearch.xpack.core.ml.job.persistence.JobStorageDeletionTask;
5148
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.ModelSizeStats;
5249
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.ModelSnapshot;
5350
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
@@ -489,64 +486,6 @@ public void updateProcessOnCalendarChanged(List<String> calendarJobIds) {
489486
}
490487
}
491488

492-
public void deleteJob(DeleteJobAction.Request request, JobStorageDeletionTask task,
493-
ActionListener<AcknowledgedResponse> actionListener) {
494-
495-
String jobId = request.getJobId();
496-
logger.debug("Deleting job '" + jobId + "'");
497-
498-
// Step 4. When the job has been removed from the cluster state, return a response
499-
// -------
500-
CheckedConsumer<Boolean, Exception> apiResponseHandler = jobDeleted -> {
501-
if (jobDeleted) {
502-
logger.info("Job [" + jobId + "] deleted");
503-
auditor.info(jobId, Messages.getMessage(Messages.JOB_AUDIT_DELETED));
504-
actionListener.onResponse(new AcknowledgedResponse(true));
505-
} else {
506-
actionListener.onResponse(new AcknowledgedResponse(false));
507-
}
508-
};
509-
510-
// Step 3. When the physical storage has been deleted, remove from Cluster State
511-
// -------
512-
CheckedConsumer<Boolean, Exception> deleteJobStateHandler = response -> clusterService.submitStateUpdateTask("delete-job-" + jobId,
513-
new AckedClusterStateUpdateTask<Boolean>(request, ActionListener.wrap(apiResponseHandler, actionListener::onFailure)) {
514-
515-
@Override
516-
protected Boolean newResponse(boolean acknowledged) {
517-
return acknowledged && response;
518-
}
519-
520-
@Override
521-
public ClusterState execute(ClusterState currentState) {
522-
MlMetadata currentMlMetadata = MlMetadata.getMlMetadata(currentState);
523-
if (currentMlMetadata.getJobs().containsKey(jobId) == false) {
524-
// We wouldn't have got here if the job never existed so
525-
// the Job must have been deleted by another action.
526-
// Don't error in this case
527-
return currentState;
528-
}
529-
530-
MlMetadata.Builder builder = new MlMetadata.Builder(currentMlMetadata);
531-
builder.deleteJob(jobId, currentState.getMetaData().custom(PersistentTasksCustomMetaData.TYPE));
532-
return buildNewClusterState(currentState, builder);
533-
}
534-
});
535-
536-
537-
// Step 2. Remove the job from any calendars
538-
CheckedConsumer<Boolean, Exception> removeFromCalendarsHandler = response -> {
539-
jobResultsProvider.removeJobFromCalendars(jobId, ActionListener.<Boolean>wrap(deleteJobStateHandler::accept,
540-
actionListener::onFailure ));
541-
};
542-
543-
544-
// Step 1. Delete the physical storage
545-
546-
// This task manages the physical deletion of the job state and results
547-
task.delete(jobId, client, clusterService.state(), removeFromCalendarsHandler, actionListener::onFailure);
548-
}
549-
550489
public void revertSnapshot(RevertModelSnapshotAction.Request request, ActionListener<RevertModelSnapshotAction.Response> actionListener,
551490
ModelSnapshot modelSnapshot) {
552491

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/persistence/BatchedDocumentsIterator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import org.elasticsearch.search.builder.SearchSourceBuilder;
1717
import org.elasticsearch.search.sort.SortBuilders;
1818
import org.elasticsearch.xpack.core.ml.job.persistence.ElasticsearchMappings;
19-
import org.elasticsearch.xpack.core.ml.utils.MlIndicesUtils;
19+
import org.elasticsearch.xpack.ml.utils.MlIndicesUtils;
2020

2121
import java.util.ArrayDeque;
2222
import java.util.Collections;
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* or more contributor license agreements. Licensed under the Elastic License;
44
* you may not use this file except in compliance with the Elastic License.
55
*/
6-
package org.elasticsearch.xpack.core.ml.job.persistence;
6+
package org.elasticsearch.xpack.ml.job.persistence;
77

88
import org.apache.logging.log4j.Logger;
99
import org.elasticsearch.action.ActionListener;
@@ -21,6 +21,8 @@
2121
import org.elasticsearch.index.query.QueryBuilders;
2222
import org.elasticsearch.index.reindex.DeleteByQueryAction;
2323
import org.elasticsearch.index.reindex.DeleteByQueryRequest;
24+
import org.elasticsearch.xpack.core.ml.job.persistence.AnomalyDetectorsIndex;
25+
import org.elasticsearch.xpack.core.ml.job.persistence.ElasticsearchMappings;
2426
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.ModelSnapshot;
2527
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.ModelState;
2628
import org.elasticsearch.xpack.core.ml.job.results.Result;

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/persistence/JobResultsPersister.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.elasticsearch.common.xcontent.XContentBuilder;
2626
import org.elasticsearch.xpack.core.ml.job.persistence.AnomalyDetectorsIndex;
2727
import org.elasticsearch.xpack.core.ml.job.persistence.ElasticsearchMappings;
28-
import org.elasticsearch.xpack.core.ml.job.persistence.JobDataDeleter;
2928
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.ModelSizeStats;
3029
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.ModelSnapshot;
3130
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.Quantiles;

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/persistence/JobResultsProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@
6464
import org.elasticsearch.search.aggregations.AggregationBuilders;
6565
import org.elasticsearch.search.aggregations.Aggregations;
6666
import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
67-
import org.elasticsearch.search.aggregations.metrics.Stats;
6867
import org.elasticsearch.search.aggregations.metrics.ExtendedStats;
68+
import org.elasticsearch.search.aggregations.metrics.Stats;
6969
import org.elasticsearch.search.builder.SearchSourceBuilder;
7070
import org.elasticsearch.search.sort.FieldSortBuilder;
7171
import org.elasticsearch.search.sort.SortBuilders;
@@ -99,11 +99,11 @@
9999
import org.elasticsearch.xpack.core.ml.stats.ForecastStats;
100100
import org.elasticsearch.xpack.core.ml.stats.StatsAccumulator;
101101
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
102-
import org.elasticsearch.xpack.core.ml.utils.MlIndicesUtils;
103102
import org.elasticsearch.xpack.core.security.support.Exceptions;
104103
import org.elasticsearch.xpack.ml.job.categorization.GrokPatternCreator;
105104
import org.elasticsearch.xpack.ml.job.persistence.InfluencersQueryBuilder.InfluencersQuery;
106105
import org.elasticsearch.xpack.ml.job.process.autodetect.params.AutodetectParams;
106+
import org.elasticsearch.xpack.ml.utils.MlIndicesUtils;
107107

108108
import java.io.IOException;
109109
import java.io.InputStream;

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/utils/MlIndicesUtils.java renamed to x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/utils/MlIndicesUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* or more contributor license agreements. Licensed under the Elastic License;
44
* you may not use this file except in compliance with the Elastic License.
55
*/
6-
package org.elasticsearch.xpack.core.ml.utils;
6+
package org.elasticsearch.xpack.ml.utils;
77

88
import org.elasticsearch.action.support.IndicesOptions;
99

x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/results/ReservedFieldNamesTests.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,10 @@
1111

1212
public class ReservedFieldNamesTests extends ESTestCase {
1313

14-
public void testIsValidFieldName() throws Exception {
14+
public void testIsValidFieldName() {
1515
assertTrue(ReservedFieldNames.isValidFieldName("host"));
1616
assertTrue(ReservedFieldNames.isValidFieldName("host.actual"));
1717
assertFalse(ReservedFieldNames.isValidFieldName("actual.host"));
1818
assertFalse(ReservedFieldNames.isValidFieldName(AnomalyRecord.BUCKET_SPAN.getPreferredName()));
1919
}
20-
2120
}

x-pack/plugin/src/test/java/org/elasticsearch/xpack/test/rest/XPackRestIT.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
package org.elasticsearch.xpack.test.rest;
77

88
import com.carrotsearch.randomizedtesting.annotations.ParametersFactory;
9-
109
import org.apache.http.HttpStatus;
1110
import org.elasticsearch.ElasticsearchException;
1211
import org.elasticsearch.client.Request;

0 commit comments

Comments
 (0)