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