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 ;
@@ -60,6 +61,7 @@ protected ReindexDataStreamTask createTask(
6061 ) {
6162 ReindexDataStreamTaskParams params = taskInProgress .getParams ();
6263 return new ReindexDataStreamTask (
64+ clusterService ,
6365 params .startTime (),
6466 params .totalIndices (),
6567 params .totalIndicesToBeUpgraded (),
@@ -73,7 +75,12 @@ protected ReindexDataStreamTask createTask(
7375 }
7476
7577 @ Override
76- protected void nodeOperation (AllocatedPersistentTask task , ReindexDataStreamTaskParams params , PersistentTaskState state ) {
78+ protected void nodeOperation (
79+ AllocatedPersistentTask task ,
80+ ReindexDataStreamTaskParams params ,
81+ PersistentTaskState persistentTaskState
82+ ) {
83+ ReindexDataStreamPersistentTaskState state = (ReindexDataStreamPersistentTaskState ) persistentTaskState ;
7784 String sourceDataStream = params .getSourceDataStream ();
7885 TaskId taskId = new TaskId (clusterService .localNode ().getId (), task .getId ());
7986 GetDataStreamAction .Request request = new GetDataStreamAction .Request (TimeValue .MAX_VALUE , new String [] { sourceDataStream });
@@ -92,33 +99,71 @@ protected void nodeOperation(AllocatedPersistentTask task, ReindexDataStreamTask
9299 RolloverAction .INSTANCE ,
93100 rolloverRequest ,
94101 ActionListener .wrap (
95- rolloverResponse -> reindexIndices (dataStream , reindexDataStreamTask , reindexClient , sourceDataStream , taskId ),
96- e -> completeFailedPersistentTask (reindexDataStreamTask , e )
102+ rolloverResponse -> reindexIndices (
103+ dataStream ,
104+ dataStream .getIndices ().size () + 1 ,
105+ reindexDataStreamTask ,
106+ params ,
107+ state ,
108+ reindexClient ,
109+ sourceDataStream ,
110+ taskId
111+ ),
112+ e -> completeFailedPersistentTask (reindexDataStreamTask , state , e )
97113 )
98114 );
99115 } else {
100- reindexIndices (dataStream , reindexDataStreamTask , reindexClient , sourceDataStream , taskId );
116+ reindexIndices (
117+ dataStream ,
118+ dataStream .getIndices ().size (),
119+ reindexDataStreamTask ,
120+ params ,
121+ state ,
122+ reindexClient ,
123+ sourceDataStream ,
124+ taskId
125+ );
101126 }
102127 } else {
103- completeFailedPersistentTask (reindexDataStreamTask , new ElasticsearchException ("data stream does not exist" ));
128+ completeFailedPersistentTask (reindexDataStreamTask , state , new ElasticsearchException ("data stream does not exist" ));
104129 }
105- }, exception -> completeFailedPersistentTask (reindexDataStreamTask , exception )));
130+ }, exception -> completeFailedPersistentTask (reindexDataStreamTask , state , exception )));
106131 }
107132
108133 private void reindexIndices (
109134 DataStream dataStream ,
135+ int totalIndicesInDataStream ,
110136 ReindexDataStreamTask reindexDataStreamTask ,
137+ ReindexDataStreamTaskParams params ,
138+ ReindexDataStreamPersistentTaskState state ,
111139 ExecuteWithHeadersClient reindexClient ,
112140 String sourceDataStream ,
113141 TaskId parentTaskId
114142 ) {
115143 List <Index > indices = dataStream .getIndices ();
116144 List <Index > indicesToBeReindexed = indices .stream ().filter (getReindexRequiredPredicate (clusterService .state ().metadata ())).toList ();
145+ final ReindexDataStreamPersistentTaskState updatedState ;
146+ if (params .totalIndices () != totalIndicesInDataStream
147+ || params .totalIndicesToBeUpgraded () != indicesToBeReindexed .size ()
148+ || (state != null
149+ && (state .totalIndices () != null
150+ && state .totalIndicesToBeUpgraded () != null
151+ && (state .totalIndices () != totalIndicesInDataStream
152+ || state .totalIndicesToBeUpgraded () != indicesToBeReindexed .size ())))) {
153+ updatedState = new ReindexDataStreamPersistentTaskState (
154+ totalIndicesInDataStream ,
155+ indicesToBeReindexed .size (),
156+ state == null ? null : state .completionTime ()
157+ );
158+ reindexDataStreamTask .updatePersistentTaskState (updatedState , ActionListener .noop ());
159+ } else {
160+ updatedState = state ;
161+ }
117162 reindexDataStreamTask .setPendingIndicesCount (indicesToBeReindexed .size ());
118163 // The CountDownActionListener is 1 more than the number of indices so that the count is not 0 if we have no indices
119164 CountDownActionListener listener = new CountDownActionListener (indicesToBeReindexed .size () + 1 , ActionListener .wrap (response1 -> {
120- completeSuccessfulPersistentTask (reindexDataStreamTask );
121- }, exception -> { completeFailedPersistentTask (reindexDataStreamTask , exception ); }));
165+ completeSuccessfulPersistentTask (reindexDataStreamTask , updatedState );
166+ }, exception -> { completeFailedPersistentTask (reindexDataStreamTask , updatedState , exception ); }));
122167 List <Index > indicesRemaining = Collections .synchronizedList (new ArrayList <>(indicesToBeReindexed ));
123168 final int maxConcurrentIndices = 1 ;
124169 for (int i = 0 ; i < maxConcurrentIndices ; i ++) {
@@ -190,15 +235,25 @@ public void onFailure(Exception e) {
190235 });
191236 }
192237
193- private void completeSuccessfulPersistentTask (ReindexDataStreamTask persistentTask ) {
194- persistentTask .allReindexesCompleted (threadPool , getTimeToLive (persistentTask ));
238+ private void completeSuccessfulPersistentTask (
239+ ReindexDataStreamTask persistentTask ,
240+ @ Nullable ReindexDataStreamPersistentTaskState state
241+ ) {
242+ persistentTask .allReindexesCompleted (threadPool , updateCompletionTimeAndGetTimeToLive (persistentTask , state ));
195243 }
196244
197- private void completeFailedPersistentTask (ReindexDataStreamTask persistentTask , Exception e ) {
198- persistentTask .taskFailed (threadPool , getTimeToLive (persistentTask ), e );
245+ private void completeFailedPersistentTask (
246+ ReindexDataStreamTask persistentTask ,
247+ @ Nullable ReindexDataStreamPersistentTaskState state ,
248+ Exception e
249+ ) {
250+ persistentTask .taskFailed (threadPool , updateCompletionTimeAndGetTimeToLive (persistentTask , state ), e );
199251 }
200252
201- private TimeValue getTimeToLive (ReindexDataStreamTask reindexDataStreamTask ) {
253+ private TimeValue updateCompletionTimeAndGetTimeToLive (
254+ ReindexDataStreamTask reindexDataStreamTask ,
255+ @ Nullable ReindexDataStreamPersistentTaskState state
256+ ) {
202257 PersistentTasksCustomMetadata persistentTasksCustomMetadata = clusterService .state ()
203258 .getMetadata ()
204259 .custom (PersistentTasksCustomMetadata .TYPE );
@@ -208,16 +263,23 @@ private TimeValue getTimeToLive(ReindexDataStreamTask reindexDataStreamTask) {
208263 if (persistentTask == null ) {
209264 return TimeValue .timeValueMillis (0 );
210265 }
211- PersistentTaskState state = persistentTask .getState ();
212266 final long completionTime ;
213267 if (state == null ) {
214268 completionTime = threadPool .absoluteTimeInMillis ();
215269 reindexDataStreamTask .updatePersistentTaskState (
216- new ReindexDataStreamPersistentTaskState (completionTime ),
270+ new ReindexDataStreamPersistentTaskState (null , null , completionTime ),
217271 ActionListener .noop ()
218272 );
219273 } else {
220- completionTime = ((ReindexDataStreamPersistentTaskState ) state ).completionTime ();
274+ if (state .completionTime () == null ) {
275+ completionTime = threadPool .absoluteTimeInMillis ();
276+ reindexDataStreamTask .updatePersistentTaskState (
277+ new ReindexDataStreamPersistentTaskState (state .totalIndices (), state .totalIndicesToBeUpgraded (), completionTime ),
278+ ActionListener .noop ()
279+ );
280+ } else {
281+ completionTime = state .completionTime ();
282+ }
221283 }
222284 return TimeValue .timeValueMillis (TASK_KEEP_ALIVE_TIME .millis () - (threadPool .absoluteTimeInMillis () - completionTime ));
223285 }
0 commit comments