diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportOpenJobAction.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportOpenJobAction.java index 745aa6a8ce152..5dfa1af529776 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportOpenJobAction.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportOpenJobAction.java @@ -55,6 +55,7 @@ import org.elasticsearch.xpack.core.ml.job.config.JobTaskState; import org.elasticsearch.xpack.core.ml.job.config.JobUpdate; import org.elasticsearch.xpack.core.ml.job.persistence.AnomalyDetectorsIndex; +import org.elasticsearch.xpack.core.ml.job.persistence.ElasticsearchMappings; import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper; import org.elasticsearch.xpack.ml.MachineLearning; import org.elasticsearch.xpack.ml.MlConfigMigrationEligibilityCheck; @@ -97,13 +98,14 @@ public class TransportOpenJobAction extends TransportMasterNodeAction clearJobFinishTime = ActionListener.wrap( response -> { if (response.isAcknowledged()) { - clearJobFinishedTime(response, jobParams.getJobId(), listener); + clearJobFinishedTime(response, state, jobParams.getJobId(), listener); } else { listener.onResponse(response); } @@ -309,17 +312,33 @@ public void onTimeout(TimeValue timeout) { }); } - private void clearJobFinishedTime(NodeAcknowledgedResponse response, String jobId, ActionListener listener) { - JobUpdate update = new JobUpdate.Builder(jobId).setClearFinishTime(true).build(); - - jobConfigProvider.updateJob(jobId, update, null, ActionListener.wrap( - job -> listener.onResponse(response), - e -> { - logger.error("[" + jobId + "] Failed to clear finished_time", e); - // Not a critical error so continue - listener.onResponse(response); - } - )); + private void clearJobFinishedTime(NodeAcknowledgedResponse response, + ClusterState clusterState, + String jobId, + ActionListener listener) { + final JobUpdate update = new JobUpdate.Builder(jobId).setClearFinishTime(true).build(); + ActionListener clearedTimeListener = ActionListener.wrap( + job -> listener.onResponse(response), + e -> { + logger.error(new ParameterizedMessage("[{}] Failed to clear finished_time", jobId), e); + // Not a critical error so continue + listener.onResponse(response); + } + ); + ActionListener mappingsUpdatedListener = ActionListener.wrap( + mappingUpdateResponse -> jobConfigProvider.updateJob(jobId, update, null, clearedTimeListener), + e -> { + logger.error(new ParameterizedMessage("[{}] Failed to update mapping; not clearing finished_time", jobId), e); + // Not a critical error so continue without attempting to clear finish time + listener.onResponse(response); + } + ); + ElasticsearchMappings.addDocMappingIfMissing( + MlConfigIndex.indexName(), + MlConfigIndex::mapping, + client, + clusterState, + mappingsUpdatedListener); } private void cancelJobStart(PersistentTasksCustomMetadata.PersistentTask persistentTask, Exception exception,