21
21
import org .elasticsearch .common .inject .Inject ;
22
22
import org .elasticsearch .common .unit .TimeValue ;
23
23
import org .elasticsearch .discovery .MasterNotDiscoveredException ;
24
+ import org .elasticsearch .persistent .PersistentTasksCustomMetaData ;
24
25
import org .elasticsearch .persistent .PersistentTasksService ;
25
26
import org .elasticsearch .rest .RestStatus ;
26
27
import org .elasticsearch .tasks .Task ;
27
28
import org .elasticsearch .threadpool .ThreadPool ;
28
29
import org .elasticsearch .transport .TransportService ;
29
30
import org .elasticsearch .xpack .core .action .util .PageParams ;
31
+ import org .elasticsearch .xpack .core .dataframe .DataFrameMessages ;
30
32
import org .elasticsearch .xpack .core .dataframe .action .StopDataFrameTransformAction ;
33
+ import org .elasticsearch .xpack .core .dataframe .transforms .DataFrameTransformState ;
31
34
import org .elasticsearch .xpack .core .dataframe .transforms .DataFrameTransformTaskState ;
32
35
import org .elasticsearch .xpack .dataframe .persistence .DataFrameInternalIndex ;
33
36
import org .elasticsearch .xpack .dataframe .persistence .DataFrameTransformsConfigManager ;
34
37
import org .elasticsearch .xpack .dataframe .transforms .DataFrameTransformTask ;
35
38
39
+ import java .util .ArrayList ;
36
40
import java .util .Collection ;
37
41
import java .util .HashSet ;
38
42
import java .util .List ;
39
43
import java .util .Set ;
40
44
45
+ import static org .elasticsearch .xpack .core .dataframe .DataFrameMessages .DATA_FRAME_CANNOT_STOP_FAILED_TRANSFORM ;
46
+
41
47
public class TransportStopDataFrameTransformAction extends
42
48
TransportTasksAction <DataFrameTransformTask , StopDataFrameTransformAction .Request ,
43
49
StopDataFrameTransformAction .Response , StopDataFrameTransformAction .Response > {
@@ -63,6 +69,32 @@ public TransportStopDataFrameTransformAction(TransportService transportService,
63
69
this .client = client ;
64
70
}
65
71
72
+ static void validateTaskState (ClusterState state , List <String > transformIds , boolean isForce ) {
73
+ PersistentTasksCustomMetaData tasks = state .metaData ().custom (PersistentTasksCustomMetaData .TYPE );
74
+ if (isForce == false && tasks != null ) {
75
+ List <String > failedTasks = new ArrayList <>();
76
+ List <String > failedReasons = new ArrayList <>();
77
+ for (String transformId : transformIds ) {
78
+ PersistentTasksCustomMetaData .PersistentTask <?> dfTask = tasks .getTask (transformId );
79
+ if (dfTask != null
80
+ && dfTask .getState () instanceof DataFrameTransformState
81
+ && ((DataFrameTransformState ) dfTask .getState ()).getTaskState () == DataFrameTransformTaskState .FAILED ) {
82
+ failedTasks .add (transformId );
83
+ failedReasons .add (((DataFrameTransformState ) dfTask .getState ()).getReason ());
84
+ }
85
+ }
86
+ if (failedTasks .isEmpty () == false ) {
87
+ String msg = failedTasks .size () == 1 ?
88
+ DataFrameMessages .getMessage (DATA_FRAME_CANNOT_STOP_FAILED_TRANSFORM ,
89
+ failedTasks .get (0 ),
90
+ failedReasons .get (0 )) :
91
+ "Unable to stop data frame transforms. The following transforms are in a failed state " +
92
+ failedTasks + " with reasons " + failedReasons + ". Use force stop to stop the data frame transforms." ;
93
+ throw new ElasticsearchStatusException (msg , RestStatus .CONFLICT );
94
+ }
95
+ }
96
+ }
97
+
66
98
@ Override
67
99
protected void doExecute (Task task , StopDataFrameTransformAction .Request request ,
68
100
ActionListener <StopDataFrameTransformAction .Response > listener ) {
@@ -88,8 +120,9 @@ protected void doExecute(Task task, StopDataFrameTransformAction.Request request
88
120
new PageParams (0 , 10_000 ),
89
121
request .isAllowNoMatch (),
90
122
ActionListener .wrap (hitsAndIds -> {
123
+ validateTaskState (state , hitsAndIds .v2 (), request .isForce ());
91
124
request .setExpandedIds (new HashSet <>(hitsAndIds .v2 ()));
92
- request .setNodes (DataFrameNodes .dataFrameTaskNodes (hitsAndIds .v2 (), clusterService . state () ));
125
+ request .setNodes (DataFrameNodes .dataFrameTaskNodes (hitsAndIds .v2 (), state ));
93
126
super .doExecute (task , request , finalListener );
94
127
},
95
128
listener ::onFailure
@@ -108,11 +141,14 @@ protected void taskOperation(StopDataFrameTransformAction.Request request, DataF
108
141
}
109
142
110
143
if (ids .contains (transformTask .getTransformId ())) {
144
+ // This should not occur as we validate that none of the tasks are in a failed state earlier
145
+ // Keep this check in here for insurance.
111
146
if (transformTask .getState ().getTaskState () == DataFrameTransformTaskState .FAILED && request .isForce () == false ) {
112
147
listener .onFailure (
113
- new ElasticsearchStatusException ("Unable to stop data frame transform [" + request .getId ()
114
- + "] as it is in a failed state with reason: [" + transformTask .getState ().getReason () +
115
- "]. Use force stop to stop the data frame transform." ,
148
+ new ElasticsearchStatusException (
149
+ DataFrameMessages .getMessage (DATA_FRAME_CANNOT_STOP_FAILED_TRANSFORM ,
150
+ request .getId (),
151
+ transformTask .getState ().getReason ()),
116
152
RestStatus .CONFLICT ));
117
153
return ;
118
154
}
0 commit comments