|
@@ -16,12 +16,14 @@ import org.elasticsearch.client.OriginSettingClient;
|
|
|
import org.elasticsearch.cluster.service.ClusterService;
|
|
|
import org.elasticsearch.common.Strings;
|
|
|
import org.elasticsearch.common.inject.Inject;
|
|
|
+import org.elasticsearch.common.unit.TimeValue;
|
|
|
import org.elasticsearch.index.reindex.AbstractBulkByScrollRequest;
|
|
|
import org.elasticsearch.tasks.Task;
|
|
|
import org.elasticsearch.tasks.TaskId;
|
|
|
import org.elasticsearch.threadpool.ThreadPool;
|
|
|
import org.elasticsearch.transport.TransportService;
|
|
|
import org.elasticsearch.xpack.core.ClientHelper;
|
|
|
+import org.elasticsearch.xpack.core.common.notifications.AbstractAuditor;
|
|
|
import org.elasticsearch.xpack.core.ml.action.DeleteExpiredDataAction;
|
|
|
import org.elasticsearch.xpack.core.ml.job.config.Job;
|
|
|
import org.elasticsearch.xpack.ml.MachineLearning;
|
|
@@ -53,8 +55,6 @@ public class TransportDeleteExpiredDataAction extends HandledTransportAction<Del
|
|
|
|
|
|
private static final Logger logger = LogManager.getLogger(TransportDeleteExpiredDataAction.class);
|
|
|
|
|
|
- static final Duration DEFAULT_MAX_DURATION = Duration.ofHours(8);
|
|
|
-
|
|
|
private final ThreadPool threadPool;
|
|
|
private final String executor;
|
|
|
private final OriginSettingClient client;
|
|
@@ -62,18 +62,21 @@ public class TransportDeleteExpiredDataAction extends HandledTransportAction<Del
|
|
|
private final Clock clock;
|
|
|
private final JobConfigProvider jobConfigProvider;
|
|
|
private final JobResultsProvider jobResultsProvider;
|
|
|
+ private final AnomalyDetectionAuditor auditor;
|
|
|
|
|
|
@Inject
|
|
|
public TransportDeleteExpiredDataAction(ThreadPool threadPool, TransportService transportService,
|
|
|
ActionFilters actionFilters, Client client, ClusterService clusterService,
|
|
|
- JobConfigProvider jobConfigProvider, JobResultsProvider jobResultsProvider) {
|
|
|
+ JobConfigProvider jobConfigProvider, JobResultsProvider jobResultsProvider,
|
|
|
+ AnomalyDetectionAuditor auditor) {
|
|
|
this(threadPool, MachineLearning.UTILITY_THREAD_POOL_NAME, transportService, actionFilters, client, clusterService,
|
|
|
- jobConfigProvider, jobResultsProvider, Clock.systemUTC());
|
|
|
+ jobConfigProvider, jobResultsProvider, auditor, Clock.systemUTC());
|
|
|
}
|
|
|
|
|
|
TransportDeleteExpiredDataAction(ThreadPool threadPool, String executor, TransportService transportService,
|
|
|
ActionFilters actionFilters, Client client, ClusterService clusterService,
|
|
|
- JobConfigProvider jobConfigProvider, JobResultsProvider jobResultsProvider, Clock clock) {
|
|
|
+ JobConfigProvider jobConfigProvider, JobResultsProvider jobResultsProvider,
|
|
|
+ AnomalyDetectionAuditor auditor, Clock clock) {
|
|
|
super(DeleteExpiredDataAction.NAME, transportService, actionFilters, DeleteExpiredDataAction.Request::new, executor);
|
|
|
this.threadPool = threadPool;
|
|
|
this.executor = executor;
|
|
@@ -82,6 +85,7 @@ public class TransportDeleteExpiredDataAction extends HandledTransportAction<Del
|
|
|
this.clock = clock;
|
|
|
this.jobConfigProvider = jobConfigProvider;
|
|
|
this.jobResultsProvider = jobResultsProvider;
|
|
|
+ this.auditor = auditor;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -89,7 +93,8 @@ public class TransportDeleteExpiredDataAction extends HandledTransportAction<Del
|
|
|
ActionListener<DeleteExpiredDataAction.Response> listener) {
|
|
|
logger.info("Deleting expired data");
|
|
|
Instant timeoutTime = Instant.now(clock).plus(
|
|
|
- request.getTimeout() == null ? DEFAULT_MAX_DURATION : Duration.ofMillis(request.getTimeout().millis())
|
|
|
+ request.getTimeout() == null ? Duration.ofMillis(MlDataRemover.DEFAULT_MAX_DURATION.getMillis()) :
|
|
|
+ Duration.ofMillis(request.getTimeout().millis())
|
|
|
);
|
|
|
|
|
|
TaskId taskId = new TaskId(clusterService.localNode().getId(), task.getId());
|
|
@@ -97,7 +102,7 @@ public class TransportDeleteExpiredDataAction extends HandledTransportAction<Del
|
|
|
Supplier<Boolean> isTimedOutSupplier = () -> Instant.now(clock).isAfter(timeoutTime);
|
|
|
AnomalyDetectionAuditor auditor = new AnomalyDetectionAuditor(client, clusterService);
|
|
|
|
|
|
- if (Strings.isNullOrEmpty(request.getJobId()) || Strings.isAllOrWildcard(new String[]{request.getJobId()})) {
|
|
|
+ if (Strings.isNullOrEmpty(request.getJobId()) || Strings.isAllOrWildcard(request.getJobId())) {
|
|
|
List<MlDataRemover> dataRemovers = createDataRemovers(client, taskId, auditor);
|
|
|
threadPool.executor(MachineLearning.UTILITY_THREAD_POOL_NAME).execute(
|
|
|
() -> deleteExpiredData(request, dataRemovers, listener, isTimedOutSupplier)
|
|
@@ -107,6 +112,8 @@ public class TransportDeleteExpiredDataAction extends HandledTransportAction<Del
|
|
|
jobBuilders -> {
|
|
|
threadPool.executor(MachineLearning.UTILITY_THREAD_POOL_NAME).execute(() -> {
|
|
|
List<Job> jobs = jobBuilders.stream().map(Job.Builder::build).collect(Collectors.toList());
|
|
|
+ String [] jobIds = jobs.stream().map(Job::getId).toArray(String[]::new);
|
|
|
+ request.setExpandedJobIds(jobIds);
|
|
|
List<MlDataRemover> dataRemovers = createDataRemovers(jobs, taskId, auditor);
|
|
|
deleteExpiredData(request, dataRemovers, listener, isTimedOutSupplier);
|
|
|
}
|
|
@@ -133,10 +140,11 @@ public class TransportDeleteExpiredDataAction extends HandledTransportAction<Del
|
|
|
(float) (AbstractBulkByScrollRequest.DEFAULT_SCROLL_SIZE / 5) * numberOfDatanodes :
|
|
|
Float.POSITIVE_INFINITY;
|
|
|
}
|
|
|
- deleteExpiredData(dataRemoversIterator, requestsPerSec, listener, isTimedOutSupplier, true);
|
|
|
+ deleteExpiredData(request, dataRemoversIterator, requestsPerSec, listener, isTimedOutSupplier, true);
|
|
|
}
|
|
|
|
|
|
- void deleteExpiredData(Iterator<MlDataRemover> mlDataRemoversIterator,
|
|
|
+ void deleteExpiredData(DeleteExpiredDataAction.Request request,
|
|
|
+ Iterator<MlDataRemover> mlDataRemoversIterator,
|
|
|
float requestsPerSecond,
|
|
|
ActionListener<DeleteExpiredDataAction.Response> listener,
|
|
|
Supplier<Boolean> isTimedOutSupplier,
|
|
@@ -146,6 +154,7 @@ public class TransportDeleteExpiredDataAction extends HandledTransportAction<Del
|
|
|
ActionListener<Boolean> nextListener = ActionListener.wrap(
|
|
|
booleanResponse ->
|
|
|
deleteExpiredData(
|
|
|
+ request,
|
|
|
mlDataRemoversIterator,
|
|
|
requestsPerSecond,
|
|
|
listener,
|
|
@@ -164,7 +173,26 @@ public class TransportDeleteExpiredDataAction extends HandledTransportAction<Del
|
|
|
if (haveAllPreviousDeletionsCompleted) {
|
|
|
logger.info("Completed deletion of expired ML data");
|
|
|
} else {
|
|
|
- logger.info("Halted deletion of expired ML data until next invocation");
|
|
|
+ if (isTimedOutSupplier.get()) {
|
|
|
+ TimeValue timeoutPeriod = request.getTimeout() == null ? MlDataRemover.DEFAULT_MAX_DURATION :
|
|
|
+ request.getTimeout();
|
|
|
+ String msg = "Deleting expired ML data was cancelled after the timeout period of [" +
|
|
|
+ timeoutPeriod + "] was exceeded. The setting [xpack.ml.nightly_maintenance_requests_per_second] " +
|
|
|
+ "controls the deletion rate, consider increasing the value to assist in pruning old data";
|
|
|
+ logger.warn(msg);
|
|
|
+
|
|
|
+ if (Strings.isNullOrEmpty(request.getJobId())
|
|
|
+ || Strings.isAllOrWildcard(request.getJobId())
|
|
|
+ || request.getExpandedJobIds() == null) {
|
|
|
+ auditor.warning(AbstractAuditor.All_RESOURCES_ID, msg);
|
|
|
+ } else {
|
|
|
+ for (String jobId : request.getExpandedJobIds()) {
|
|
|
+ auditor.warning(jobId, msg);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ logger.info("Halted deletion of expired ML data until next invocation");
|
|
|
+ }
|
|
|
}
|
|
|
listener.onResponse(new DeleteExpiredDataAction.Response(haveAllPreviousDeletionsCompleted));
|
|
|
}
|