1919import org .elasticsearch .cluster .metadata .DataStream ;
2020import org .elasticsearch .cluster .metadata .DataStreamAction ;
2121import org .elasticsearch .cluster .service .ClusterService ;
22+ import org .elasticsearch .core .Nullable ;
2223import org .elasticsearch .core .TimeValue ;
2324import org .elasticsearch .index .Index ;
2425import org .elasticsearch .persistent .AllocatedPersistentTask ;
@@ -61,6 +62,7 @@ protected ReindexDataStreamTask createTask(
6162 ) {
6263 ReindexDataStreamTaskParams params = taskInProgress .getParams ();
6364 return new ReindexDataStreamTask (
65+ clusterService ,
6466 params .startTime (),
6567 params .totalIndices (),
6668 params .totalIndicesToBeUpgraded (),
@@ -74,7 +76,12 @@ protected ReindexDataStreamTask createTask(
7476 }
7577
7678 @ Override
77- protected void nodeOperation (AllocatedPersistentTask task , ReindexDataStreamTaskParams params , PersistentTaskState state ) {
79+ protected void nodeOperation (
80+ AllocatedPersistentTask task ,
81+ ReindexDataStreamTaskParams params ,
82+ PersistentTaskState persistentTaskState
83+ ) {
84+ ReindexDataStreamPersistentTaskState state = (ReindexDataStreamPersistentTaskState ) persistentTaskState ;
7885 String sourceDataStream = params .getSourceDataStream ();
7986 TaskId taskId = new TaskId (clusterService .localNode ().getId (), task .getId ());
8087 GetDataStreamAction .Request request = new GetDataStreamAction .Request (TimeValue .MAX_VALUE , new String [] { sourceDataStream });
@@ -93,33 +100,71 @@ protected void nodeOperation(AllocatedPersistentTask task, ReindexDataStreamTask
93100 RolloverAction .INSTANCE ,
94101 rolloverRequest ,
95102 ActionListener .wrap (
96- rolloverResponse -> reindexIndices (dataStream , reindexDataStreamTask , reindexClient , sourceDataStream , taskId ),
97- e -> completeFailedPersistentTask (reindexDataStreamTask , e )
103+ rolloverResponse -> reindexIndices (
104+ dataStream ,
105+ dataStream .getIndices ().size () + 1 ,
106+ reindexDataStreamTask ,
107+ params ,
108+ state ,
109+ reindexClient ,
110+ sourceDataStream ,
111+ taskId
112+ ),
113+ e -> completeFailedPersistentTask (reindexDataStreamTask , state , e )
98114 )
99115 );
100116 } else {
101- reindexIndices (dataStream , reindexDataStreamTask , reindexClient , sourceDataStream , taskId );
117+ reindexIndices (
118+ dataStream ,
119+ dataStream .getIndices ().size (),
120+ reindexDataStreamTask ,
121+ params ,
122+ state ,
123+ reindexClient ,
124+ sourceDataStream ,
125+ taskId
126+ );
102127 }
103128 } else {
104- completeFailedPersistentTask (reindexDataStreamTask , new ElasticsearchException ("data stream does not exist" ));
129+ completeFailedPersistentTask (reindexDataStreamTask , state , new ElasticsearchException ("data stream does not exist" ));
105130 }
106- }, exception -> completeFailedPersistentTask (reindexDataStreamTask , exception )));
131+ }, exception -> completeFailedPersistentTask (reindexDataStreamTask , state , exception )));
107132 }
108133
109134 private void reindexIndices (
110135 DataStream dataStream ,
136+ int totalIndicesInDataStream ,
111137 ReindexDataStreamTask reindexDataStreamTask ,
138+ ReindexDataStreamTaskParams params ,
139+ ReindexDataStreamPersistentTaskState state ,
112140 ExecuteWithHeadersClient reindexClient ,
113141 String sourceDataStream ,
114142 TaskId parentTaskId
115143 ) {
116144 List <Index > indices = dataStream .getIndices ();
117145 List <Index > indicesToBeReindexed = indices .stream ().filter (getReindexRequiredPredicate (clusterService .state ().metadata ())).toList ();
146+ final ReindexDataStreamPersistentTaskState updatedState ;
147+ if (params .totalIndices () != totalIndicesInDataStream
148+ || params .totalIndicesToBeUpgraded () != indicesToBeReindexed .size ()
149+ || (state != null
150+ && (state .totalIndices () != null
151+ && state .totalIndicesToBeUpgraded () != null
152+ && (state .totalIndices () != totalIndicesInDataStream
153+ || state .totalIndicesToBeUpgraded () != indicesToBeReindexed .size ())))) {
154+ updatedState = new ReindexDataStreamPersistentTaskState (
155+ totalIndicesInDataStream ,
156+ indicesToBeReindexed .size (),
157+ state == null ? null : state .completionTime ()
158+ );
159+ reindexDataStreamTask .updatePersistentTaskState (updatedState , ActionListener .noop ());
160+ } else {
161+ updatedState = state ;
162+ }
118163 reindexDataStreamTask .setPendingIndicesCount (indicesToBeReindexed .size ());
119164 // The CountDownActionListener is 1 more than the number of indices so that the count is not 0 if we have no indices
120165 CountDownActionListener listener = new CountDownActionListener (indicesToBeReindexed .size () + 1 , ActionListener .wrap (response1 -> {
121- completeSuccessfulPersistentTask (reindexDataStreamTask );
122- }, exception -> { completeFailedPersistentTask (reindexDataStreamTask , exception ); }));
166+ completeSuccessfulPersistentTask (reindexDataStreamTask , updatedState );
167+ }, exception -> { completeFailedPersistentTask (reindexDataStreamTask , updatedState , exception ); }));
123168 List <Index > indicesRemaining = Collections .synchronizedList (new ArrayList <>(indicesToBeReindexed ));
124169 final int maxConcurrentIndices = 1 ;
125170 for (int i = 0 ; i < maxConcurrentIndices ; i ++) {
@@ -191,15 +236,25 @@ public void onFailure(Exception e) {
191236 });
192237 }
193238
194- private void completeSuccessfulPersistentTask (ReindexDataStreamTask persistentTask ) {
195- persistentTask .allReindexesCompleted (threadPool , getTimeToLive (persistentTask ));
239+ private void completeSuccessfulPersistentTask (
240+ ReindexDataStreamTask persistentTask ,
241+ @ Nullable ReindexDataStreamPersistentTaskState state
242+ ) {
243+ persistentTask .allReindexesCompleted (threadPool , updateCompletionTimeAndGetTimeToLive (persistentTask , state ));
196244 }
197245
198- private void completeFailedPersistentTask (ReindexDataStreamTask persistentTask , Exception e ) {
199- persistentTask .taskFailed (threadPool , getTimeToLive (persistentTask ), e );
246+ private void completeFailedPersistentTask (
247+ ReindexDataStreamTask persistentTask ,
248+ @ Nullable ReindexDataStreamPersistentTaskState state ,
249+ Exception e
250+ ) {
251+ persistentTask .taskFailed (threadPool , updateCompletionTimeAndGetTimeToLive (persistentTask , state ), e );
200252 }
201253
202- private TimeValue getTimeToLive (ReindexDataStreamTask reindexDataStreamTask ) {
254+ private TimeValue updateCompletionTimeAndGetTimeToLive (
255+ ReindexDataStreamTask reindexDataStreamTask ,
256+ @ Nullable ReindexDataStreamPersistentTaskState state
257+ ) {
203258 PersistentTasksCustomMetadata persistentTasksCustomMetadata = clusterService .state ()
204259 .getMetadata ()
205260 .custom (PersistentTasksCustomMetadata .TYPE );
@@ -209,16 +264,23 @@ private TimeValue getTimeToLive(ReindexDataStreamTask reindexDataStreamTask) {
209264 if (persistentTask == null ) {
210265 return TimeValue .timeValueMillis (0 );
211266 }
212- PersistentTaskState state = persistentTask .getState ();
213267 final long completionTime ;
214268 if (state == null ) {
215269 completionTime = threadPool .absoluteTimeInMillis ();
216270 reindexDataStreamTask .updatePersistentTaskState (
217- new ReindexDataStreamPersistentTaskState (completionTime ),
271+ new ReindexDataStreamPersistentTaskState (null , null , completionTime ),
218272 ActionListener .noop ()
219273 );
220274 } else {
221- completionTime = ((ReindexDataStreamPersistentTaskState ) state ).completionTime ();
275+ if (state .completionTime () == null ) {
276+ completionTime = threadPool .absoluteTimeInMillis ();
277+ reindexDataStreamTask .updatePersistentTaskState (
278+ new ReindexDataStreamPersistentTaskState (state .totalIndices (), state .totalIndicesToBeUpgraded (), completionTime ),
279+ ActionListener .noop ()
280+ );
281+ } else {
282+ completionTime = state .completionTime ();
283+ }
222284 }
223285 return TimeValue .timeValueMillis (TASK_KEEP_ALIVE_TIME .millis () - (threadPool .absoluteTimeInMillis () - completionTime ));
224286 }
0 commit comments