|
55 | 55 | import org.elasticsearch.xpack.core.ml.job.config.JobTaskState; |
56 | 56 | import org.elasticsearch.xpack.core.ml.job.config.JobUpdate; |
57 | 57 | import org.elasticsearch.xpack.core.ml.job.persistence.AnomalyDetectorsIndex; |
| 58 | +import org.elasticsearch.xpack.core.ml.job.persistence.ElasticsearchMappings; |
58 | 59 | import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper; |
59 | 60 | import org.elasticsearch.xpack.ml.MachineLearning; |
60 | 61 | import org.elasticsearch.xpack.ml.MlConfigMigrationEligibilityCheck; |
@@ -97,20 +98,22 @@ public class TransportOpenJobAction extends TransportMasterNodeAction<OpenJobAct |
97 | 98 | private final JobConfigProvider jobConfigProvider; |
98 | 99 | private final MlMemoryTracker memoryTracker; |
99 | 100 | private final MlConfigMigrationEligibilityCheck migrationEligibilityCheck; |
| 101 | + private final Client client; |
100 | 102 |
|
101 | 103 | @Inject |
102 | 104 | public TransportOpenJobAction(Settings settings, TransportService transportService, ThreadPool threadPool, |
103 | 105 | XPackLicenseState licenseState, ClusterService clusterService, |
104 | 106 | PersistentTasksService persistentTasksService, ActionFilters actionFilters, |
105 | 107 | IndexNameExpressionResolver indexNameExpressionResolver, |
106 | | - JobConfigProvider jobConfigProvider, MlMemoryTracker memoryTracker) { |
| 108 | + JobConfigProvider jobConfigProvider, MlMemoryTracker memoryTracker, Client client) { |
107 | 109 | super(OpenJobAction.NAME, transportService, clusterService, threadPool, actionFilters,OpenJobAction.Request::new, |
108 | 110 | indexNameExpressionResolver); |
109 | 111 | this.licenseState = licenseState; |
110 | 112 | this.persistentTasksService = persistentTasksService; |
111 | 113 | this.jobConfigProvider = jobConfigProvider; |
112 | 114 | this.memoryTracker = memoryTracker; |
113 | 115 | this.migrationEligibilityCheck = new MlConfigMigrationEligibilityCheck(settings, clusterService); |
| 116 | + this.client = client; |
114 | 117 | } |
115 | 118 |
|
116 | 119 | /** |
@@ -224,7 +227,7 @@ protected void masterOperation(Task task, OpenJobAction.Request request, Cluster |
224 | 227 | ActionListener<NodeAcknowledgedResponse> clearJobFinishTime = ActionListener.wrap( |
225 | 228 | response -> { |
226 | 229 | if (response.isAcknowledged()) { |
227 | | - clearJobFinishedTime(response, jobParams.getJobId(), listener); |
| 230 | + clearJobFinishedTime(response, state, jobParams.getJobId(), listener); |
228 | 231 | } else { |
229 | 232 | listener.onResponse(response); |
230 | 233 | } |
@@ -309,17 +312,33 @@ public void onTimeout(TimeValue timeout) { |
309 | 312 | }); |
310 | 313 | } |
311 | 314 |
|
312 | | - private void clearJobFinishedTime(NodeAcknowledgedResponse response, String jobId, ActionListener<NodeAcknowledgedResponse> listener) { |
313 | | - JobUpdate update = new JobUpdate.Builder(jobId).setClearFinishTime(true).build(); |
314 | | - |
315 | | - jobConfigProvider.updateJob(jobId, update, null, ActionListener.wrap( |
316 | | - job -> listener.onResponse(response), |
317 | | - e -> { |
318 | | - logger.error("[" + jobId + "] Failed to clear finished_time", e); |
319 | | - // Not a critical error so continue |
320 | | - listener.onResponse(response); |
321 | | - } |
322 | | - )); |
| 315 | + private void clearJobFinishedTime(NodeAcknowledgedResponse response, |
| 316 | + ClusterState clusterState, |
| 317 | + String jobId, |
| 318 | + ActionListener<NodeAcknowledgedResponse> listener) { |
| 319 | + final JobUpdate update = new JobUpdate.Builder(jobId).setClearFinishTime(true).build(); |
| 320 | + ActionListener<Job> clearedTimeListener = ActionListener.wrap( |
| 321 | + job -> listener.onResponse(response), |
| 322 | + e -> { |
| 323 | + logger.error(new ParameterizedMessage("[{}] Failed to clear finished_time", jobId), e); |
| 324 | + // Not a critical error so continue |
| 325 | + listener.onResponse(response); |
| 326 | + } |
| 327 | + ); |
| 328 | + ActionListener<Boolean> mappingsUpdatedListener = ActionListener.wrap( |
| 329 | + mappingUpdateResponse -> jobConfigProvider.updateJob(jobId, update, null, clearedTimeListener), |
| 330 | + e -> { |
| 331 | + logger.error(new ParameterizedMessage("[{}] Failed to update mapping; not clearing finished_time", jobId), e); |
| 332 | + // Not a critical error so continue without attempting to clear finish time |
| 333 | + listener.onResponse(response); |
| 334 | + } |
| 335 | + ); |
| 336 | + ElasticsearchMappings.addDocMappingIfMissing( |
| 337 | + MlConfigIndex.indexName(), |
| 338 | + MlConfigIndex::mapping, |
| 339 | + client, |
| 340 | + clusterState, |
| 341 | + mappingsUpdatedListener); |
323 | 342 | } |
324 | 343 |
|
325 | 344 | private void cancelJobStart(PersistentTasksCustomMetadata.PersistentTask<OpenJobAction.JobParams> persistentTask, Exception exception, |
|
0 commit comments