1919import org .elasticsearch .cluster .metadata .IndexNameExpressionResolver ;
2020import org .elasticsearch .cluster .metadata .MappingMetadata ;
2121import org .elasticsearch .cluster .service .ClusterService ;
22+ import org .elasticsearch .common .settings .Settings ;
2223import org .elasticsearch .index .IndexNotFoundException ;
24+ import org .elasticsearch .threadpool .ThreadPool ;
2325import org .elasticsearch .xpack .core .ClientHelper ;
2426import org .elasticsearch .xpack .core .ml .MlStatsIndex ;
2527import org .elasticsearch .xpack .core .ml .dataframe .DataFrameAnalyticsConfig ;
2628import org .elasticsearch .xpack .core .ml .job .persistence .AnomalyDetectorsIndex ;
2729import org .elasticsearch .xpack .core .ml .job .persistence .ElasticsearchMappings ;
2830import org .elasticsearch .xpack .core .ml .utils .ExceptionsHelper ;
31+ import org .elasticsearch .xpack .ml .dataframe .extractor .ExtractedFieldsDetector ;
32+ import org .elasticsearch .xpack .ml .dataframe .extractor .ExtractedFieldsDetectorFactory ;
33+ import org .elasticsearch .xpack .ml .dataframe .inference .InferenceRunner ;
2934import org .elasticsearch .xpack .ml .dataframe .persistence .DataFrameAnalyticsConfigProvider ;
3035import org .elasticsearch .xpack .ml .dataframe .process .AnalyticsProcessManager ;
3136import org .elasticsearch .xpack .ml .dataframe .steps .AnalysisStep ;
3237import org .elasticsearch .xpack .ml .dataframe .steps .DataFrameAnalyticsStep ;
38+ import org .elasticsearch .xpack .ml .dataframe .steps .FinalStep ;
39+ import org .elasticsearch .xpack .ml .dataframe .steps .InferenceStep ;
3340import org .elasticsearch .xpack .ml .dataframe .steps .ReindexingStep ;
3441import org .elasticsearch .xpack .ml .dataframe .steps .StepResponse ;
42+ import org .elasticsearch .xpack .ml .extractor .ExtractedFields ;
43+ import org .elasticsearch .xpack .ml .inference .loadingservice .ModelLoadingService ;
3544import org .elasticsearch .xpack .ml .notifications .DataFrameAnalyticsAuditor ;
45+ import org .elasticsearch .xpack .ml .utils .persistence .ResultsPersisterService ;
3646
3747import java .util .Objects ;
3848import java .util .concurrent .atomic .AtomicBoolean ;
@@ -43,27 +53,36 @@ public class DataFrameAnalyticsManager {
4353
4454 private static final Logger LOGGER = LogManager .getLogger (DataFrameAnalyticsManager .class );
4555
56+ private final Settings settings ;
4657 /**
4758 * We need a {@link NodeClient} to get the reindexing task and be able to report progress
4859 */
4960 private final NodeClient client ;
61+ private final ThreadPool threadPool ;
5062 private final ClusterService clusterService ;
5163 private final DataFrameAnalyticsConfigProvider configProvider ;
5264 private final AnalyticsProcessManager processManager ;
5365 private final DataFrameAnalyticsAuditor auditor ;
5466 private final IndexNameExpressionResolver expressionResolver ;
67+ private final ResultsPersisterService resultsPersisterService ;
68+ private final ModelLoadingService modelLoadingService ;
5569 /** Indicates whether the node is shutting down. */
5670 private final AtomicBoolean nodeShuttingDown = new AtomicBoolean ();
5771
58- public DataFrameAnalyticsManager (NodeClient client , ClusterService clusterService , DataFrameAnalyticsConfigProvider configProvider ,
59- AnalyticsProcessManager processManager , DataFrameAnalyticsAuditor auditor ,
60- IndexNameExpressionResolver expressionResolver ) {
72+ public DataFrameAnalyticsManager (Settings settings , NodeClient client , ThreadPool threadPool , ClusterService clusterService ,
73+ DataFrameAnalyticsConfigProvider configProvider , AnalyticsProcessManager processManager ,
74+ DataFrameAnalyticsAuditor auditor , IndexNameExpressionResolver expressionResolver ,
75+ ResultsPersisterService resultsPersisterService , ModelLoadingService modelLoadingService ) {
76+ this .settings = Objects .requireNonNull (settings );
6177 this .client = Objects .requireNonNull (client );
78+ this .threadPool = Objects .requireNonNull (threadPool );
6279 this .clusterService = Objects .requireNonNull (clusterService );
6380 this .configProvider = Objects .requireNonNull (configProvider );
6481 this .processManager = Objects .requireNonNull (processManager );
6582 this .auditor = Objects .requireNonNull (auditor );
6683 this .expressionResolver = Objects .requireNonNull (expressionResolver );
84+ this .resultsPersisterService = Objects .requireNonNull (resultsPersisterService );
85+ this .modelLoadingService = Objects .requireNonNull (modelLoadingService );
6786 }
6887
6988 public void execute (DataFrameAnalyticsTask task , ClusterState clusterState ) {
@@ -141,6 +160,12 @@ private void determineProgressAndResume(DataFrameAnalyticsTask task, DataFrameAn
141160 case RESUMING_ANALYZING :
142161 executeStep (task , config , new AnalysisStep (client , task , auditor , config , processManager ));
143162 break ;
163+ case RESUMING_INFERENCE :
164+ buildInferenceStep (task , config , ActionListener .wrap (
165+ inferenceStep -> executeStep (task , config , inferenceStep ),
166+ task ::setFailed
167+ ));
168+ break ;
144169 case FINISHED :
145170 default :
146171 task .setFailed (ExceptionsHelper .serverError ("Unexpected starting state [" + startingState + "]" ));
@@ -162,7 +187,15 @@ private void executeStep(DataFrameAnalyticsTask task, DataFrameAnalyticsConfig c
162187 executeStep (task , config , new AnalysisStep (client , task , auditor , config , processManager ));
163188 break ;
164189 case ANALYSIS :
165- // This is the last step
190+ buildInferenceStep (task , config , ActionListener .wrap (
191+ inferenceStep -> executeStep (task , config , inferenceStep ),
192+ task ::setFailed
193+ ));
194+ break ;
195+ case INFERENCE :
196+ executeStep (task , config , new FinalStep (client , task , auditor , config ));
197+ break ;
198+ case FINAL :
166199 LOGGER .info ("[{}] Marking task completed" , config .getId ());
167200 task .markAsCompleted ();
168201 break ;
@@ -199,6 +232,24 @@ private void executeJobInMiddleOfReindexing(DataFrameAnalyticsTask task, DataFra
199232 ));
200233 }
201234
235+ private void buildInferenceStep (DataFrameAnalyticsTask task , DataFrameAnalyticsConfig config , ActionListener <InferenceStep > listener ) {
236+ ParentTaskAssigningClient parentTaskClient = new ParentTaskAssigningClient (client , task .getParentTaskId ());
237+
238+ ActionListener <ExtractedFieldsDetector > extractedFieldsDetectorListener = ActionListener .wrap (
239+ extractedFieldsDetector -> {
240+ ExtractedFields extractedFields = extractedFieldsDetector .detect ().v1 ();
241+ InferenceRunner inferenceRunner = new InferenceRunner (settings , parentTaskClient , modelLoadingService ,
242+ resultsPersisterService , task .getParentTaskId (), config , extractedFields , task .getStatsHolder ().getProgressTracker (),
243+ task .getStatsHolder ().getDataCountsTracker ());
244+ InferenceStep inferenceStep = new InferenceStep (client , task , auditor , config , threadPool , inferenceRunner );
245+ listener .onResponse (inferenceStep );
246+ },
247+ listener ::onFailure
248+ );
249+
250+ new ExtractedFieldsDetectorFactory (parentTaskClient ).createFromDest (config , extractedFieldsDetectorListener );
251+ }
252+
202253 public boolean isNodeShuttingDown () {
203254 return nodeShuttingDown .get ();
204255 }
0 commit comments