1010
1111import org .elasticsearch .action .admin .cluster .settings .ClusterUpdateSettingsRequest ;
1212import org .elasticsearch .cluster .node .DiscoveryNodeRole ;
13- import org .elasticsearch .cluster .routing .allocation .DiskThresholdSettings ;
1413import org .elasticsearch .common .settings .Settings ;
1514import org .elasticsearch .common .unit .ByteSizeValue ;
1615import org .elasticsearch .health .metadata .HealthMetadata ;
2221import java .util .Map ;
2322import java .util .Set ;
2423
24+ import static org .elasticsearch .cluster .routing .allocation .DiskThresholdSettings .CLUSTER_ROUTING_ALLOCATION_DISK_FLOOD_STAGE_FROZEN_MAX_HEADROOM_SETTING ;
25+ import static org .elasticsearch .cluster .routing .allocation .DiskThresholdSettings .CLUSTER_ROUTING_ALLOCATION_DISK_FLOOD_STAGE_FROZEN_WATERMARK_SETTING ;
2526import static org .elasticsearch .cluster .routing .allocation .DiskThresholdSettings .CLUSTER_ROUTING_ALLOCATION_DISK_FLOOD_STAGE_MAX_HEADROOM_SETTING ;
2627import static org .elasticsearch .cluster .routing .allocation .DiskThresholdSettings .CLUSTER_ROUTING_ALLOCATION_DISK_FLOOD_STAGE_WATERMARK_SETTING ;
2728import static org .elasticsearch .cluster .routing .allocation .DiskThresholdSettings .CLUSTER_ROUTING_ALLOCATION_HIGH_DISK_MAX_HEADROOM_SETTING ;
2829import static org .elasticsearch .cluster .routing .allocation .DiskThresholdSettings .CLUSTER_ROUTING_ALLOCATION_HIGH_DISK_WATERMARK_SETTING ;
2930import static org .elasticsearch .cluster .routing .allocation .DiskThresholdSettings .CLUSTER_ROUTING_ALLOCATION_LOW_DISK_MAX_HEADROOM_SETTING ;
3031import static org .elasticsearch .cluster .routing .allocation .DiskThresholdSettings .CLUSTER_ROUTING_ALLOCATION_LOW_DISK_WATERMARK_SETTING ;
32+ import static org .elasticsearch .common .settings .Settings .EMPTY ;
3133import static org .elasticsearch .indices .ShardLimitValidator .SETTING_CLUSTER_MAX_SHARDS_PER_NODE ;
3234import static org .elasticsearch .indices .ShardLimitValidator .SETTING_CLUSTER_MAX_SHARDS_PER_NODE_FROZEN ;
3335import static org .elasticsearch .test .NodeRoles .onlyRoles ;
@@ -52,11 +54,10 @@ public void testEachMasterPublishesTheirThresholds() throws Exception {
5254 for (int i = 0 ; i < numberOfNodes ; i ++) {
5355 ByteSizeValue randomBytes = ByteSizeValue .ofBytes (randomLongBetween (6 , 19 ));
5456 String customWatermark = percentageMode ? randomIntBetween (86 , 94 ) + "%" : randomBytes .toString ();
55- ByteSizeValue customMaxHeadroom = percentageMode ? randomBytes : ByteSizeValue .MINUS_ONE ;
5657 var customShardLimits = new HealthMetadata .ShardLimits (randomIntBetween (1 , 1000 ), randomIntBetween (1001 , 2000 ));
57- String nodeName = startNode (internalCluster , customWatermark , customMaxHeadroom .toString (), customShardLimits );
58+ String nodeName = startNode (internalCluster , customWatermark , randomBytes .toString (), customShardLimits );
5859 watermarkByNode .put (nodeName , customWatermark );
59- maxHeadroomByNode .put (nodeName , customMaxHeadroom );
60+ maxHeadroomByNode .put (nodeName , randomBytes );
6061 shardLimitsPerNode .put (nodeName , customShardLimits );
6162 }
6263 ensureStableCluster (numberOfNodes );
@@ -66,7 +67,16 @@ public void testEachMasterPublishesTheirThresholds() throws Exception {
6667 var healthMetadata = HealthMetadata .getFromClusterState (internalCluster .clusterService ().state ());
6768 var diskMetadata = healthMetadata .getDiskMetadata ();
6869 assertThat (diskMetadata .describeHighWatermark (), equalTo (watermarkByNode .get (electedMaster )));
69- assertThat (diskMetadata .highMaxHeadroom (), equalTo (maxHeadroomByNode .get (electedMaster )));
70+ // The value of the setting `cluster.routing.allocation.disk.watermark.high.max_headroom` depends upon the existence of
71+ // `cluster.routing.allocation.disk.watermark.high`. Check {@link CLUSTER_ROUTING_ALLOCATION_HIGH_DISK_MAX_HEADROOM_SETTING}
72+ assertThat (
73+ diskMetadata .highMaxHeadroom (),
74+ equalTo (
75+ percentageMode
76+ ? maxHeadroomByNode .get (electedMaster )
77+ : CLUSTER_ROUTING_ALLOCATION_HIGH_DISK_MAX_HEADROOM_SETTING .getDefault (EMPTY )
78+ )
79+ );
7080
7181 var shardLimitsMetadata = healthMetadata .getShardLimitsMetadata ();
7282 assertEquals (shardLimitsMetadata , shardLimitsPerNode .get (electedMaster ));
@@ -80,7 +90,18 @@ public void testEachMasterPublishesTheirThresholds() throws Exception {
8090 var healthMetadata = HealthMetadata .getFromClusterState (internalCluster .clusterService ().state ());
8191 var diskMetadata = healthMetadata .getDiskMetadata ();
8292 assertThat (diskMetadata .describeHighWatermark (), equalTo (watermarkByNode .get (electedMaster )));
83- assertThat (diskMetadata .highMaxHeadroom (), equalTo (maxHeadroomByNode .get (electedMaster )));
93+
94+ // The value of the setting `cluster.routing.allocation.disk.watermark.high.max_headroom` depends upon the existence of
95+ // `cluster.routing.allocation.disk.watermark.high`.
96+ // Check {@link DiskThresholdSettings.CLUSTER_ROUTING_ALLOCATION_HIGH_DISK_MAX_HEADROOM_SETTING}
97+ assertThat (
98+ diskMetadata .highMaxHeadroom (),
99+ equalTo (
100+ percentageMode
101+ ? maxHeadroomByNode .get (electedMaster )
102+ : CLUSTER_ROUTING_ALLOCATION_HIGH_DISK_MAX_HEADROOM_SETTING .getDefault (EMPTY )
103+ )
104+ );
84105
85106 var shardLimitsMetadata = healthMetadata .getShardLimitsMetadata ();
86107 assertEquals (shardLimitsMetadata , shardLimitsPerNode .get (electedMaster ));
@@ -93,7 +114,7 @@ public void testWatermarkSettingUpdate() throws Exception {
93114 int numberOfNodes = 3 ;
94115 ByteSizeValue randomBytes = ByteSizeValue .ofBytes (randomLongBetween (6 , 19 ));
95116 String initialWatermark = percentageMode ? randomIntBetween (86 , 94 ) + "%" : randomBytes .toString ();
96- ByteSizeValue initialMaxHeadroom = percentageMode ? randomBytes : ByteSizeValue . MINUS_ONE ;
117+ ByteSizeValue initialMaxHeadroom = randomBytes ;
97118 HealthMetadata .ShardLimits initialShardLimits = new HealthMetadata .ShardLimits (
98119 randomIntBetween (1 , 1000 ),
99120 randomIntBetween (1001 , 2000 )
@@ -107,7 +128,7 @@ public void testWatermarkSettingUpdate() throws Exception {
107128 ByteSizeValue updatedLowMaxHeadroom = percentageMode ? randomBytes : ByteSizeValue .MINUS_ONE ;
108129 randomBytes = ByteSizeValue .ofBytes (randomLongBetween (50 , 100 ));
109130 String updatedHighWatermark = percentageMode ? randomIntBetween (60 , 90 ) + "%" : randomBytes .toString ();
110- ByteSizeValue updatedHighMaxHeadroom = percentageMode ? randomBytes : ByteSizeValue . MINUS_ONE ;
131+ ByteSizeValue updatedHighMaxHeadroom = randomBytes ;
111132 randomBytes = ByteSizeValue .ofBytes (randomLongBetween (5 , 10 ));
112133 String updatedFloodStageWatermark = percentageMode ? randomIntBetween (91 , 95 ) + "%" : randomBytes .toString ();
113134 ByteSizeValue updatedFloodStageMaxHeadroom = percentageMode ? randomBytes : ByteSizeValue .MINUS_ONE ;
@@ -121,7 +142,16 @@ public void testWatermarkSettingUpdate() throws Exception {
121142 var healthMetadata = HealthMetadata .getFromClusterState (internalCluster .clusterService ().state ());
122143 var diskMetadata = healthMetadata .getDiskMetadata ();
123144 assertThat (diskMetadata .describeHighWatermark (), equalTo (initialWatermark ));
124- assertThat (diskMetadata .highMaxHeadroom (), equalTo (initialMaxHeadroom ));
145+
146+ // The value of the setting `cluster.routing.allocation.disk.watermark.high.max_headroom` depends upon the existence of
147+ // `cluster.routing.allocation.disk.watermark.high`.
148+ // Check {@link DiskThresholdSettings.CLUSTER_ROUTING_ALLOCATION_HIGH_DISK_MAX_HEADROOM_SETTING}
149+ assertThat (
150+ diskMetadata .highMaxHeadroom (),
151+ equalTo (
152+ percentageMode ? initialMaxHeadroom : CLUSTER_ROUTING_ALLOCATION_HIGH_DISK_MAX_HEADROOM_SETTING .getDefault (EMPTY )
153+ )
154+ );
125155
126156 var shardLimitsMetadata = healthMetadata .getShardLimitsMetadata ();
127157 assertEquals (shardLimitsMetadata , initialShardLimits );
@@ -147,9 +177,31 @@ public void testWatermarkSettingUpdate() throws Exception {
147177 var healthMetadata = HealthMetadata .getFromClusterState (internalCluster .clusterService ().state ());
148178 var diskMetadata = healthMetadata .getDiskMetadata ();
149179 assertThat (diskMetadata .describeHighWatermark (), equalTo (updatedHighWatermark ));
150- assertThat (diskMetadata .highMaxHeadroom (), equalTo (updatedHighMaxHeadroom ));
180+
181+ // The value of the setting `cluster.routing.allocation.disk.watermark.high.max_headroom` depends upon the existence of
182+ // `cluster.routing.allocation.disk.watermark.high`.
183+ // Check {@link DiskThresholdSettings.CLUSTER_ROUTING_ALLOCATION_HIGH_DISK_MAX_HEADROOM_SETTING}
184+ assertThat (
185+ diskMetadata .highMaxHeadroom (),
186+ equalTo (
187+ percentageMode
188+ ? updatedHighMaxHeadroom
189+ : CLUSTER_ROUTING_ALLOCATION_HIGH_DISK_MAX_HEADROOM_SETTING .getDefault (EMPTY )
190+ )
191+ );
151192 assertThat (diskMetadata .describeFloodStageWatermark (), equalTo (updatedFloodStageWatermark ));
152- assertThat (diskMetadata .floodStageMaxHeadroom (), equalTo (updatedFloodStageMaxHeadroom ));
193+
194+ // The value of the setting `cluster.routing.allocation.disk.watermark.flood_stage.max_headroom` depends upon the existence
195+ // of `cluster.routing.allocation.disk.watermark.flood_stage`.
196+ // Check{@link DiskThresholdSettings.CLUSTER_ROUTING_ALLOCATION_DISK_FLOOD_STAGE_MAX_HEADROOM_SETTING}
197+ assertThat (
198+ diskMetadata .floodStageMaxHeadroom (),
199+ equalTo (
200+ percentageMode
201+ ? updatedFloodStageMaxHeadroom
202+ : CLUSTER_ROUTING_ALLOCATION_DISK_FLOOD_STAGE_MAX_HEADROOM_SETTING .getDefault (EMPTY )
203+ )
204+ );
153205
154206 var shardLimitsMetadata = healthMetadata .getShardLimitsMetadata ();
155207 assertEquals (shardLimitsMetadata , updatedShardLimits );
@@ -175,21 +227,17 @@ private String startNode(
175227
176228 private Settings createWatermarkSettings (String highWatermark , String highMaxHeadroom ) {
177229 // We define both thresholds to avoid inconsistencies over the type of the thresholds
178- Settings . Builder settings = Settings .builder ()
230+ var settings = Settings .builder ()
179231 .put (CLUSTER_ROUTING_ALLOCATION_LOW_DISK_WATERMARK_SETTING .getKey (), percentageMode ? "85%" : "20b" )
180232 .put (CLUSTER_ROUTING_ALLOCATION_HIGH_DISK_WATERMARK_SETTING .getKey (), highWatermark )
181233 .put (CLUSTER_ROUTING_ALLOCATION_DISK_FLOOD_STAGE_WATERMARK_SETTING .getKey (), percentageMode ? "95%" : "1b" )
182- .put (
183- DiskThresholdSettings .CLUSTER_ROUTING_ALLOCATION_DISK_FLOOD_STAGE_FROZEN_WATERMARK_SETTING .getKey (),
184- percentageMode ? "95%" : "5b"
185- );
234+ .put (CLUSTER_ROUTING_ALLOCATION_DISK_FLOOD_STAGE_FROZEN_WATERMARK_SETTING .getKey (), percentageMode ? "95%" : "5b" );
235+
186236 if (percentageMode ) {
187- settings = settings .put (CLUSTER_ROUTING_ALLOCATION_LOW_DISK_MAX_HEADROOM_SETTING .getKey (), "20b" )
237+ settings .put (CLUSTER_ROUTING_ALLOCATION_LOW_DISK_MAX_HEADROOM_SETTING .getKey (), "20b" )
188238 .put (CLUSTER_ROUTING_ALLOCATION_DISK_FLOOD_STAGE_MAX_HEADROOM_SETTING .getKey (), "1b" )
189- .put (DiskThresholdSettings .CLUSTER_ROUTING_ALLOCATION_DISK_FLOOD_STAGE_FROZEN_MAX_HEADROOM_SETTING .getKey (), "5b" );
190- if (highMaxHeadroom .equals ("-1" ) == false ) {
191- settings = settings .put (CLUSTER_ROUTING_ALLOCATION_HIGH_DISK_MAX_HEADROOM_SETTING .getKey (), highMaxHeadroom );
192- }
239+ .put (CLUSTER_ROUTING_ALLOCATION_DISK_FLOOD_STAGE_FROZEN_MAX_HEADROOM_SETTING .getKey (), "5b" )
240+ .put (CLUSTER_ROUTING_ALLOCATION_HIGH_DISK_MAX_HEADROOM_SETTING .getKey (), highMaxHeadroom );
193241 }
194242 return settings .build ();
195243 }
0 commit comments