4040import java .util .Locale ;
4141import java .util .Map ;
4242
43- import static org .elasticsearch .cluster .metadata .IndexMetadata .APIBlock .READ_ONLY ;
4443import static org .elasticsearch .cluster .metadata .IndexMetadata .APIBlock .WRITE ;
4544
4645public class ReindexDataStreamIndexTransportAction extends HandledTransportAction <
@@ -93,13 +92,22 @@ protected void doExecute(
9392 );
9493 }
9594
95+ if (settingsBefore .getAsBoolean (IndexMetadata .SETTING_BLOCKS_READ , false )) {
96+ var errorMessage = String .format (Locale .ROOT , "Cannot reindex index [%s] which has a read block." , destIndexName );
97+ listener .onFailure (new ElasticsearchException (errorMessage ));
98+ return ;
99+ }
100+ if (settingsBefore .getAsBoolean (IndexMetadata .SETTING_BLOCKS_METADATA , false )) {
101+ var errorMessage = String .format (Locale .ROOT , "Cannot reindex index [%s] which has a metadata block." , destIndexName );
102+ listener .onFailure (new ElasticsearchException (errorMessage ));
103+ return ;
104+ }
105+
96106 SubscribableListener .<AcknowledgedResponse >newForked (l -> setBlockWrites (sourceIndexName , l , taskId ))
97107 .<AcknowledgedResponse >andThen (l -> deleteDestIfExists (destIndexName , l , taskId ))
98108 .<AcknowledgedResponse >andThen (l -> createIndex (sourceIndex , destIndexName , l , taskId ))
99109 .<BulkByScrollResponse >andThen (l -> reindex (sourceIndexName , destIndexName , l , taskId ))
100110 .<AcknowledgedResponse >andThen (l -> copyOldSourceSettingsToDest (settingsBefore , destIndexName , l , taskId ))
101- .<AddIndexBlockResponse >andThen (l -> addBlockIfFromSource (WRITE , settingsBefore , destIndexName , l , taskId ))
102- .<AddIndexBlockResponse >andThen (l -> addBlockIfFromSource (READ_ONLY , settingsBefore , destIndexName , l , taskId ))
103111 .andThenApply (ignored -> new ReindexDataStreamIndexAction .Response (destIndexName ))
104112 .addListener (listener );
105113 }
@@ -120,7 +128,8 @@ public void onResponse(AddIndexBlockResponse response) {
120128 @ Override
121129 public void onFailure (Exception e ) {
122130 if (e instanceof ClusterBlockException || e .getCause () instanceof ClusterBlockException ) {
123- // It's fine if block-writes is already set
131+ // Could fail with a cluster block exception if read-only or read-only-allow-delete is already set
132+ // In this case, we can proceed
124133 listener .onResponse (null );
125134 } else {
126135 listener .onFailure (e );
@@ -146,10 +155,12 @@ private void createIndex(
146155 ) {
147156 logger .debug ("Creating destination index [{}] for source index [{}]" , destIndexName , sourceIndex .getIndex ().getName ());
148157
149- // override read-only settings if they exist
150158 var removeReadOnlyOverride = Settings .builder ()
159+ // remove read-only settings if they exist
151160 .putNull (IndexMetadata .SETTING_READ_ONLY )
161+ .putNull (IndexMetadata .SETTING_READ_ONLY_ALLOW_DELETE )
152162 .putNull (IndexMetadata .SETTING_BLOCKS_WRITE )
163+ // settings to optimize reindex
153164 .put (IndexMetadata .SETTING_NUMBER_OF_REPLICAS , 0 )
154165 .put (IndexSettings .INDEX_REFRESH_INTERVAL_SETTING .getKey (), -1 )
155166 .build ();
@@ -192,22 +203,29 @@ private void addBlockIfFromSource(
192203 }
193204 }
194205
206+ private void updateSettings (
207+ String index ,
208+ Settings .Builder settings ,
209+ ActionListener <AcknowledgedResponse > listener ,
210+ TaskId parentTaskId
211+ ) {
212+ var updateSettingsRequest = new UpdateSettingsRequest (settings .build (), index );
213+ updateSettingsRequest .setParentTask (parentTaskId );
214+ var errorMessage = String .format (Locale .ROOT , "Could not update settings on index [%s]" , index );
215+ client .admin ().indices ().updateSettings (updateSettingsRequest , failIfNotAcknowledged (listener , errorMessage ));
216+ }
217+
195218 private void copyOldSourceSettingsToDest (
196219 Settings settingsBefore ,
197220 String destIndexName ,
198221 ActionListener <AcknowledgedResponse > listener ,
199222 TaskId parentTaskId
200223 ) {
201224 logger .debug ("Updating settings on destination index after reindex completes" );
202-
203225 var settings = Settings .builder ();
204226 copySettingOrUnset (settingsBefore , settings , IndexMetadata .SETTING_NUMBER_OF_REPLICAS );
205227 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 ));
228+ updateSettings (destIndexName , settings , listener , parentTaskId );
211229 }
212230
213231 private static void copySettingOrUnset (Settings settingsBefore , Settings .Builder builder , String setting ) {
0 commit comments