2222import org .elasticsearch .common .util .concurrent .AbstractRunnable ;
2323import org .elasticsearch .common .util .concurrent .AtomicArray ;
2424import org .elasticsearch .discovery .MasterNotDiscoveredException ;
25+ import org .elasticsearch .persistent .PersistentTasksCustomMetaData ;
26+ import org .elasticsearch .persistent .PersistentTasksService ;
2527import org .elasticsearch .tasks .Task ;
2628import org .elasticsearch .threadpool .ThreadPool ;
2729import org .elasticsearch .transport .TransportService ;
28- import org .elasticsearch .xpack .core .ml .MlMetadata ;
2930import org .elasticsearch .xpack .core .ml .MlTasks ;
3031import org .elasticsearch .xpack .core .ml .action .StopDatafeedAction ;
31- import org .elasticsearch .xpack .core .ml .datafeed .DatafeedConfig ;
3232import org .elasticsearch .xpack .core .ml .datafeed .DatafeedState ;
33- import org .elasticsearch .xpack .core .ml .job .messages .Messages ;
3433import org .elasticsearch .xpack .core .ml .utils .ExceptionsHelper ;
35- import org .elasticsearch .persistent .PersistentTasksCustomMetaData ;
36- import org .elasticsearch .persistent .PersistentTasksService ;
3734import org .elasticsearch .xpack .ml .MachineLearning ;
35+ import org .elasticsearch .xpack .ml .datafeed .persistence .DatafeedConfigProvider ;
3836
3937import java .io .IOException ;
4038import java .util .ArrayList ;
@@ -50,35 +48,35 @@ public class TransportStopDatafeedAction extends TransportTasksAction<TransportS
5048
5149 private final ThreadPool threadPool ;
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 , ClusterService clusterService ,
57- PersistentTasksService persistentTasksService ) {
56+ PersistentTasksService persistentTasksService , DatafeedConfigProvider datafeedConfigProvider ) {
5857 super (settings , StopDatafeedAction .NAME , clusterService , transportService , actionFilters ,
5958 StopDatafeedAction .Request ::new , StopDatafeedAction .Response ::new , MachineLearning .UTILITY_THREAD_POOL_NAME );
6059 this .threadPool = threadPool ;
6160 this .persistentTasksService = persistentTasksService ;
61+ this .datafeedConfigProvider = datafeedConfigProvider ;
62+
6263 }
6364
6465 /**
65- * Resolve the requested datafeeds and add their IDs to one of the list
66- * arguments depending on datafeed state.
66+ * Sort the datafeed IDs the their task state and add to one
67+ * of the list arguments depending on the state.
6768 *
68- * @param request The stop datafeed request
69- * @param mlMetadata ML Metadata
69+ * @param expandedDatafeedIds The expanded set of IDs
7070 * @param tasks Persistent task meta data
7171 * @param startedDatafeedIds Started datafeed ids are added to this list
7272 * @param stoppingDatafeedIds Stopping datafeed ids are added to this list
7373 */
74- static void resolveDataFeedIds ( StopDatafeedAction . Request request , MlMetadata mlMetadata ,
75- PersistentTasksCustomMetaData tasks ,
76- List <String > startedDatafeedIds ,
77- List <String > stoppingDatafeedIds ) {
74+ static void sortDatafeedIdsByTaskState ( Set < String > expandedDatafeedIds ,
75+ PersistentTasksCustomMetaData tasks ,
76+ List <String > startedDatafeedIds ,
77+ List <String > stoppingDatafeedIds ) {
7878
79- Set <String > expandedDatafeedIds = mlMetadata .expandDatafeedIds (request .getDatafeedId (), request .allowNoDatafeeds ());
8079 for (String expandedDatafeedId : expandedDatafeedIds ) {
81- validateDatafeedTask (expandedDatafeedId , mlMetadata );
8280 addDatafeedTaskIdAccordingToState (expandedDatafeedId , MlTasks .getDatafeedState (expandedDatafeedId , tasks ),
8381 startedDatafeedIds , stoppingDatafeedIds );
8482 }
@@ -102,20 +100,6 @@ private static void addDatafeedTaskIdAccordingToState(String datafeedId,
102100 }
103101 }
104102
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-
119103 @ Override
120104 protected void doExecute (Task task , StopDatafeedAction .Request request , ActionListener <StopDatafeedAction .Response > listener ) {
121105 final ClusterState state = clusterService .state ();
@@ -130,23 +114,27 @@ protected void doExecute(Task task, StopDatafeedAction.Request request, ActionLi
130114 new ActionListenerResponseHandler <>(listener , StopDatafeedAction .Response ::new ));
131115 }
132116 } else {
133- MlMetadata mlMetadata = MlMetadata .getMlMetadata (state );
134- PersistentTasksCustomMetaData tasks = state .getMetaData ().custom (PersistentTasksCustomMetaData .TYPE );
117+ datafeedConfigProvider .expandDatafeedIds (request .getDatafeedId (), request .allowNoDatafeeds (), ActionListener .wrap (
118+ expandedIds -> {
119+ PersistentTasksCustomMetaData tasks = state .getMetaData ().custom (PersistentTasksCustomMetaData .TYPE );
135120
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 ()]));
121+ List <String > startedDatafeeds = new ArrayList <>();
122+ List <String > stoppingDatafeeds = new ArrayList <>();
123+ sortDatafeedIdsByTaskState ( expandedIds , tasks , startedDatafeeds , stoppingDatafeeds );
124+ if (startedDatafeeds .isEmpty () && stoppingDatafeeds .isEmpty ()) {
125+ listener .onResponse (new StopDatafeedAction .Response (true ));
126+ return ;
127+ }
128+ request .setResolvedStartedDatafeedIds (startedDatafeeds .toArray (new String [startedDatafeeds .size ()]));
144129
145- if (request .isForce ()) {
146- forceStopDatafeed (request , listener , tasks , startedDatafeeds );
147- } else {
148- normalStopDatafeed (task , request , listener , tasks , startedDatafeeds , stoppingDatafeeds );
149- }
130+ if (request .isForce ()) {
131+ forceStopDatafeed (request , listener , tasks , startedDatafeeds );
132+ } else {
133+ normalStopDatafeed (task , request , listener , tasks , startedDatafeeds , stoppingDatafeeds );
134+ }
135+ },
136+ listener ::onFailure
137+ ));
150138 }
151139 }
152140
0 commit comments