2323import org .elasticsearch .common .util .concurrent .AbstractRunnable ;
2424import org .elasticsearch .common .util .concurrent .AtomicArray ;
2525import org .elasticsearch .discovery .MasterNotDiscoveredException ;
26+ import org .elasticsearch .persistent .PersistentTasksCustomMetaData ;
27+ import org .elasticsearch .persistent .PersistentTasksService ;
2628import org .elasticsearch .tasks .Task ;
2729import org .elasticsearch .threadpool .ThreadPool ;
2830import org .elasticsearch .transport .TransportService ;
29- import org .elasticsearch .xpack .core .ml .MlMetadata ;
3031import org .elasticsearch .xpack .core .ml .MlTasks ;
3132import org .elasticsearch .xpack .core .ml .action .StopDatafeedAction ;
32- import org .elasticsearch .xpack .core .ml .datafeed .DatafeedConfig ;
3333import org .elasticsearch .xpack .core .ml .datafeed .DatafeedState ;
34- import org .elasticsearch .xpack .core .ml .job .messages .Messages ;
3534import org .elasticsearch .xpack .core .ml .utils .ExceptionsHelper ;
36- import org .elasticsearch .persistent .PersistentTasksCustomMetaData ;
37- import org .elasticsearch .persistent .PersistentTasksService ;
3835import org .elasticsearch .xpack .ml .MachineLearning ;
36+ import org .elasticsearch .xpack .ml .datafeed .persistence .DatafeedConfigProvider ;
3937
4038import java .io .IOException ;
4139import java .util .ArrayList ;
@@ -50,35 +48,36 @@ public class TransportStopDatafeedAction extends TransportTasksAction<TransportS
5048 StopDatafeedAction .Response , StopDatafeedAction .Response > {
5149
5250 private final PersistentTasksService persistentTasksService ;
51+ private final DatafeedConfigProvider datafeedConfigProvider ;
5352
5453 @ Inject
5554 public TransportStopDatafeedAction (Settings settings , TransportService transportService , ThreadPool threadPool ,
5655 ActionFilters actionFilters , IndexNameExpressionResolver indexNameExpressionResolver ,
57- ClusterService clusterService , PersistentTasksService persistentTasksService ) {
56+ ClusterService clusterService , PersistentTasksService persistentTasksService ,
57+ DatafeedConfigProvider datafeedConfigProvider ) {
5858 super (settings , StopDatafeedAction .NAME , threadPool , clusterService , transportService , actionFilters ,
5959 indexNameExpressionResolver , StopDatafeedAction .Request ::new , StopDatafeedAction .Response ::new ,
6060 MachineLearning .UTILITY_THREAD_POOL_NAME );
6161 this .persistentTasksService = persistentTasksService ;
62+ this .datafeedConfigProvider = datafeedConfigProvider ;
63+
6264 }
6365
6466 /**
65- * Resolve the requested datafeeds and add their IDs to one of the list
66- * arguments depending on datafeed state.
67+ * Sort the datafeed IDs the their task state and add to one
68+ * of the list arguments depending on the state.
6769 *
68- * @param request The stop datafeed request
69- * @param mlMetadata ML Metadata
70+ * @param expandedDatafeedIds The expanded set of IDs
7071 * @param tasks Persistent task meta data
7172 * @param startedDatafeedIds Started datafeed ids are added to this list
7273 * @param stoppingDatafeedIds Stopping datafeed ids are added to this list
7374 */
74- static void resolveDataFeedIds ( StopDatafeedAction . Request request , MlMetadata mlMetadata ,
75- PersistentTasksCustomMetaData tasks ,
76- List <String > startedDatafeedIds ,
77- List <String > stoppingDatafeedIds ) {
75+ static void sortDatafeedIdsByTaskState ( Set < String > expandedDatafeedIds ,
76+ PersistentTasksCustomMetaData tasks ,
77+ List <String > startedDatafeedIds ,
78+ List <String > stoppingDatafeedIds ) {
7879
79- Set <String > expandedDatafeedIds = mlMetadata .expandDatafeedIds (request .getDatafeedId (), request .allowNoDatafeeds ());
8080 for (String expandedDatafeedId : expandedDatafeedIds ) {
81- validateDatafeedTask (expandedDatafeedId , mlMetadata );
8281 addDatafeedTaskIdAccordingToState (expandedDatafeedId , MlTasks .getDatafeedState (expandedDatafeedId , tasks ),
8382 startedDatafeedIds , stoppingDatafeedIds );
8483 }
@@ -102,20 +101,6 @@ private static void addDatafeedTaskIdAccordingToState(String datafeedId,
102101 }
103102 }
104103
105- /**
106- * Validate the stop request.
107- * Throws an {@code ResourceNotFoundException} if there is no datafeed
108- * with id {@code datafeedId}
109- * @param datafeedId The datafeed Id
110- * @param mlMetadata ML meta data
111- */
112- static void validateDatafeedTask (String datafeedId , MlMetadata mlMetadata ) {
113- DatafeedConfig datafeed = mlMetadata .getDatafeed (datafeedId );
114- if (datafeed == null ) {
115- throw new ResourceNotFoundException (Messages .getMessage (Messages .DATAFEED_NOT_FOUND , datafeedId ));
116- }
117- }
118-
119104 @ Override
120105 protected void doExecute (Task task , StopDatafeedAction .Request request , ActionListener <StopDatafeedAction .Response > listener ) {
121106 final ClusterState state = clusterService .state ();
@@ -130,23 +115,27 @@ protected void doExecute(Task task, StopDatafeedAction.Request request, ActionLi
130115 new ActionListenerResponseHandler <>(listener , StopDatafeedAction .Response ::new ));
131116 }
132117 } else {
133- MlMetadata mlMetadata = MlMetadata .getMlMetadata (state );
134- PersistentTasksCustomMetaData tasks = state .getMetaData ().custom (PersistentTasksCustomMetaData .TYPE );
118+ datafeedConfigProvider .expandDatafeedIds (request .getDatafeedId (), request .allowNoDatafeeds (), ActionListener .wrap (
119+ expandedIds -> {
120+ PersistentTasksCustomMetaData tasks = state .getMetaData ().custom (PersistentTasksCustomMetaData .TYPE );
135121
136- List <String > startedDatafeeds = new ArrayList <>();
137- List <String > stoppingDatafeeds = new ArrayList <>();
138- resolveDataFeedIds ( request , mlMetadata , tasks , startedDatafeeds , stoppingDatafeeds );
139- if (startedDatafeeds .isEmpty () && stoppingDatafeeds .isEmpty ()) {
140- listener .onResponse (new StopDatafeedAction .Response (true ));
141- return ;
142- }
143- request .setResolvedStartedDatafeedIds (startedDatafeeds .toArray (new String [startedDatafeeds .size ()]));
122+ List <String > startedDatafeeds = new ArrayList <>();
123+ List <String > stoppingDatafeeds = new ArrayList <>();
124+ sortDatafeedIdsByTaskState ( expandedIds , tasks , startedDatafeeds , stoppingDatafeeds );
125+ if (startedDatafeeds .isEmpty () && stoppingDatafeeds .isEmpty ()) {
126+ listener .onResponse (new StopDatafeedAction .Response (true ));
127+ return ;
128+ }
129+ request .setResolvedStartedDatafeedIds (startedDatafeeds .toArray (new String [startedDatafeeds .size ()]));
144130
145- if (request .isForce ()) {
146- forceStopDatafeed (request , listener , tasks , startedDatafeeds );
147- } else {
148- normalStopDatafeed (task , request , listener , tasks , startedDatafeeds , stoppingDatafeeds );
149- }
131+ if (request .isForce ()) {
132+ forceStopDatafeed (request , listener , tasks , startedDatafeeds );
133+ } else {
134+ normalStopDatafeed (task , request , listener , tasks , startedDatafeeds , stoppingDatafeeds );
135+ }
136+ },
137+ listener ::onFailure
138+ ));
150139 }
151140 }
152141
0 commit comments