diff --git a/docs/changelog/126077.yaml b/docs/changelog/126077.yaml new file mode 100644 index 0000000000000..ffb98d71ba630 --- /dev/null +++ b/docs/changelog/126077.yaml @@ -0,0 +1,6 @@ +pr: 126077 +summary: Preventing `ConcurrentModificationException` when updating settings for more + than one index +area: Indices APIs +type: bug +issues: [] diff --git a/server/src/internalClusterTest/java/org/elasticsearch/cluster/metadata/MetadataUpdateSettingsServiceIT.java b/server/src/internalClusterTest/java/org/elasticsearch/cluster/metadata/MetadataUpdateSettingsServiceIT.java index 1d95f3061abde..4f4dfda343cae 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/cluster/metadata/MetadataUpdateSettingsServiceIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/cluster/metadata/MetadataUpdateSettingsServiceIT.java @@ -39,7 +39,8 @@ public void testThatNonDynamicSettingChangesTakeEffect() throws Exception { * This test makes sure that when non-dynamic settings are updated that they actually take effect (as opposed to just being set * in the cluster state). */ - createIndex("test", Settings.EMPTY); + createIndex("test-1", Settings.EMPTY); + createIndex("test-2", Settings.EMPTY); MetadataUpdateSettingsService metadataUpdateSettingsService = internalCluster().getCurrentMasterNodeInstance( MetadataUpdateSettingsService.class ); diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataUpdateSettingsService.java b/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataUpdateSettingsService.java index 8a2ae77c761dc..db6f6b0139bc1 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataUpdateSettingsService.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataUpdateSettingsService.java @@ -219,7 +219,7 @@ ClusterState execute(ClusterState currentState) { // We have non-dynamic settings and open indices. We will unassign all of the shards in these indices so that the new // changed settings are applied when the shards are re-assigned. routingTableBuilder = RoutingTable.builder(allocationService.getShardRoutingRoleStrategy(), currentRoutingTable); - for (Index index : openIndices) { + for (Index index : new HashSet<>(openIndices)) { // We only want to take on the expense of reopening all shards for an index if the setting is really changing Settings existingSettings = currentProject.index(index).getSettings(); boolean needToReopenIndex = false;