1414import org .elasticsearch .action .admin .indices .readonly .AddIndexBlockRequest ;
1515import org .elasticsearch .action .admin .indices .readonly .AddIndexBlockResponse ;
1616import org .elasticsearch .action .admin .indices .readonly .TransportAddIndexBlockAction ;
17+ import org .elasticsearch .action .admin .indices .settings .put .UpdateSettingsRequest ;
1718import org .elasticsearch .action .support .ActionFilters ;
1819import org .elasticsearch .action .support .HandledTransportAction ;
1920import org .elasticsearch .action .support .IndicesOptions ;
2526import org .elasticsearch .cluster .service .ClusterService ;
2627import org .elasticsearch .common .settings .Settings ;
2728import org .elasticsearch .core .TimeValue ;
29+ import org .elasticsearch .index .IndexSettings ;
2830import org .elasticsearch .index .reindex .BulkByScrollResponse ;
2931import org .elasticsearch .index .reindex .ReindexAction ;
3032import org .elasticsearch .index .reindex .ReindexRequest ;
@@ -95,6 +97,7 @@ protected void doExecute(
9597 .<AcknowledgedResponse >andThen (l -> deleteDestIfExists (destIndexName , l , taskId ))
9698 .<AcknowledgedResponse >andThen (l -> createIndex (sourceIndex , destIndexName , l , taskId ))
9799 .<BulkByScrollResponse >andThen (l -> reindex (sourceIndexName , destIndexName , l , taskId ))
100+ .<AcknowledgedResponse >andThen (l -> copyOldSourceSettingsToDest (settingsBefore , destIndexName , l , taskId ))
98101 .<AddIndexBlockResponse >andThen (l -> addBlockIfFromSource (WRITE , settingsBefore , destIndexName , l , taskId ))
99102 .<AddIndexBlockResponse >andThen (l -> addBlockIfFromSource (READ_ONLY , settingsBefore , destIndexName , l , taskId ))
100103 .andThenApply (ignored -> new ReindexDataStreamIndexAction .Response (destIndexName ))
@@ -147,6 +150,8 @@ private void createIndex(
147150 var removeReadOnlyOverride = Settings .builder ()
148151 .putNull (IndexMetadata .SETTING_READ_ONLY )
149152 .putNull (IndexMetadata .SETTING_BLOCKS_WRITE )
153+ .put (IndexMetadata .SETTING_NUMBER_OF_REPLICAS , 0 )
154+ .put (IndexSettings .INDEX_REFRESH_INTERVAL_SETTING .getKey (), -1 )
150155 .build ();
151156
152157 var request = new CreateIndexFromSourceAction .Request (
@@ -168,6 +173,7 @@ private void reindex(String sourceIndexName, String destIndexName, ActionListene
168173 reindexRequest .getSearchRequest ().source ().fetchSource (true );
169174 reindexRequest .setDestIndex (destIndexName );
170175 reindexRequest .setParentTask (parentTaskId );
176+ reindexRequest .setSlices (0 ); // equivalent to slices=auto in rest api
171177 client .execute (ReindexAction .INSTANCE , reindexRequest , listener );
172178 }
173179
@@ -186,6 +192,35 @@ private void addBlockIfFromSource(
186192 }
187193 }
188194
195+ private void copyOldSourceSettingsToDest (
196+ Settings settingsBefore ,
197+ String destIndexName ,
198+ ActionListener <AcknowledgedResponse > listener ,
199+ TaskId parentTaskId
200+ ) {
201+ logger .debug ("Updating settings on destination index after reindex completes" );
202+
203+ var settings = Settings .builder ();
204+ copySettingOrUnset (settingsBefore , settings , IndexMetadata .SETTING_NUMBER_OF_REPLICAS );
205+ copySettingOrUnset (settingsBefore , settings , IndexSettings .INDEX_REFRESH_INTERVAL_SETTING .getKey ());
206+
207+ var updateSettingsRequest = new UpdateSettingsRequest (settings .build (), destIndexName );
208+ updateSettingsRequest .setParentTask (parentTaskId );
209+ var errorMessage = String .format (Locale .ROOT , "Could not update settings on index [%s]" , destIndexName );
210+ client .admin ().indices ().updateSettings (updateSettingsRequest , failIfNotAcknowledged (listener , errorMessage ));
211+ }
212+
213+ private static void copySettingOrUnset (Settings settingsBefore , Settings .Builder builder , String setting ) {
214+ // if setting was explicitly added to the source index
215+ if (settingsBefore .get (setting ) != null ) {
216+ // copy it back to the dest index
217+ builder .copy (setting , settingsBefore );
218+ } else {
219+ // otherwise, delete from dest index so that it loads from the settings default
220+ builder .putNull (setting );
221+ }
222+ }
223+
189224 public static String generateDestIndexName (String sourceIndex ) {
190225 return "migrated-" + sourceIndex ;
191226 }
0 commit comments