Skip to content

Commit d9e42b5

Browse files
committed
updated changelog
Signed-off-by: Rajiv Kumar Vaidyanathan <rajivkv@amazon.com>
1 parent e3b7570 commit d9e42b5

File tree

7 files changed

+80
-17
lines changed

7 files changed

+80
-17
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
121121
- Introduce a new setting `index.check_pending_flush.enabled` to expose the ability to disable the check for pending flushes by write threads ([#12710](https://github.com/opensearch-project/OpenSearch/pull/12710))
122122
- Built-in secure transports support ([#12435](https://github.com/opensearch-project/OpenSearch/pull/12435))
123123
- Lightweight Transport action to verify local term before fetching cluster-state from remote ([#12252](https://github.com/opensearch-project/OpenSearch/pull/12252/))
124+
- Integrate with admission controller for cluster-manager Read API. ([#12496](https://github.com/opensearch-project/OpenSearch/pull/12496))
124125

125126
### Dependencies
126127
- Bump `peter-evans/find-comment` from 2 to 3 ([#12288](https://github.com/opensearch-project/OpenSearch/pull/12288))

server/src/internalClusterTest/java/org/opensearch/ratelimitting/admissioncontrol/AdmissionForClusterManagerIT.java

+31-5
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.opensearch.node.IoUsageStats;
2121
import org.opensearch.node.ResourceUsageCollectorService;
2222
import org.opensearch.node.resource.tracker.ResourceTrackerSettings;
23+
import org.opensearch.ratelimitting.admissioncontrol.controllers.CpuBasedAdmissionController;
2324
import org.opensearch.ratelimitting.admissioncontrol.enums.AdmissionControlActionType;
2425
import org.opensearch.ratelimitting.admissioncontrol.enums.AdmissionControlMode;
2526
import org.opensearch.ratelimitting.admissioncontrol.stats.AdmissionControllerStats;
@@ -30,6 +31,8 @@
3031
import org.opensearch.test.rest.FakeRestRequest;
3132
import org.junit.Before;
3233

34+
import java.util.HashMap;
35+
import java.util.Map;
3336
import java.util.concurrent.CountDownLatch;
3437
import java.util.concurrent.atomic.AtomicReference;
3538

@@ -50,7 +53,7 @@ public class AdmissionForClusterManagerIT extends OpenSearchIntegTestCase {
5053
private ResourceUsageCollectorService cMResourceCollector;
5154

5255
private static final Settings DISABLE_ADMISSION_CONTROL = Settings.builder()
53-
.put(ADMISSION_CONTROL_TRANSPORT_LAYER_MODE.getKey(), AdmissionControlMode.DISABLED)
56+
.put(ADMISSION_CONTROL_TRANSPORT_LAYER_MODE.getKey(), AdmissionControlMode.DISABLED.getMode())
5457
.build();
5558

5659
private static final Settings ENFORCE_ADMISSION_CONTROL = Settings.builder()
@@ -92,16 +95,21 @@ public void testAdmissionControlEnforced() throws Exception {
9295
fail("expected failure");
9396
} catch (Exception e) {
9497
assertTrue(e instanceof OpenSearchRejectedExecutionException);
98+
assertTrue(e.getMessage().contains("CPU usage admission controller rejected the request"));
99+
assertTrue(e.getMessage().contains("[indices:admin/aliases/get]"));
100+
assertTrue(e.getMessage().contains("action-type [CLUSTER_ADMIN]"));
95101
}
96102

97103
client().admin().cluster().prepareUpdateSettings().setTransientSettings(DISABLE_ADMISSION_CONTROL).execute().actionGet();
98104
GetAliasesResponse getAliasesResponse = dataNodeClient().admin().indices().getAliases(aliasesRequest).actionGet();
99105
assertThat(getAliasesResponse.getAliases().get("test").size(), equalTo(1));
100106

101-
AdmissionControlService admissionControlServicePrimary = internalCluster().getClusterManagerNodeInstance(
102-
AdmissionControlService.class
107+
AdmissionControlService admissionControlServiceCM = internalCluster().getClusterManagerNodeInstance(AdmissionControlService.class);
108+
109+
AdmissionControllerStats admissionStats = getAdmissionControlStats(admissionControlServiceCM).get(
110+
CpuBasedAdmissionController.CPU_BASED_ADMISSION_CONTROLLER
103111
);
104-
AdmissionControllerStats admissionStats = admissionControlServicePrimary.stats().getAdmissionControllerStatsList().get(0);
112+
105113
assertEquals(admissionStats.rejectionCount.get(AdmissionControlActionType.CLUSTER_ADMIN.getType()).longValue(), 1);
106114
assertNull(admissionStats.rejectionCount.get(AdmissionControlActionType.SEARCH.getType()));
107115
assertNull(admissionStats.rejectionCount.get(AdmissionControlActionType.INDEXING.getType()));
@@ -121,8 +129,18 @@ public void testAdmissionControlEnabledOnNoBreach() throws InterruptedException
121129
assertThat(getAliasesResponse.getAliases().get("test").size(), equalTo(1));
122130
}
123131

132+
public void testAdmissionControlMonitorOnBreach() throws InterruptedException {
133+
admissionControlDisabledOnBreach(
134+
Settings.builder().put(ADMISSION_CONTROL_TRANSPORT_LAYER_MODE.getKey(), AdmissionControlMode.MONITOR.getMode()).build()
135+
);
136+
}
137+
124138
public void testAdmissionControlDisabledOnBreach() throws InterruptedException {
125-
client().admin().cluster().prepareUpdateSettings().setTransientSettings(DISABLE_ADMISSION_CONTROL).execute().actionGet();
139+
admissionControlDisabledOnBreach(DISABLE_ADMISSION_CONTROL);
140+
}
141+
142+
public void admissionControlDisabledOnBreach(Settings admission) throws InterruptedException {
143+
client().admin().cluster().prepareUpdateSettings().setTransientSettings(admission).execute().actionGet();
126144

127145
cMResourceCollector.collectNodeResourceUsageStats(clusterManagerNodeId, System.currentTimeMillis(), 97, 97, new IoUsageStats(98));
128146

@@ -169,4 +187,12 @@ public void tearDown() throws Exception {
169187
client().admin().cluster().prepareUpdateSettings().setTransientSettings(DISABLE_ADMISSION_CONTROL).execute().actionGet();
170188
super.tearDown();
171189
}
190+
191+
Map<String, AdmissionControllerStats> getAdmissionControlStats(AdmissionControlService admissionControlService) {
192+
Map<String, AdmissionControllerStats> acStats = new HashMap<>();
193+
for (AdmissionControllerStats admissionControllerStats : admissionControlService.stats().getAdmissionControllerStatsList()) {
194+
acStats.put(admissionControllerStats.getAdmissionControllerName(), admissionControllerStats);
195+
}
196+
return acStats;
197+
}
172198
}

server/src/main/java/org/opensearch/common/settings/ClusterSettings.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -709,21 +709,17 @@ public void apply(Settings value, Settings current, Settings previous) {
709709
IndicesService.CLUSTER_REMOTE_TRANSLOG_BUFFER_INTERVAL_SETTING,
710710
IndicesService.CLUSTER_REMOTE_INDEX_RESTRICT_ASYNC_DURABILITY_SETTING,
711711
IndicesService.CLUSTER_INDEX_RESTRICT_REPLICATION_TYPE_SETTING,
712+
IndicesService.CLUSTER_REMOTE_STORE_PATH_PREFIX_TYPE_SETTING,
712713

713714
// Admission Control Settings
714715
AdmissionControlSettings.ADMISSION_CONTROL_TRANSPORT_LAYER_MODE,
715716
CpuBasedAdmissionControllerSettings.CPU_BASED_ADMISSION_CONTROLLER_TRANSPORT_LAYER_MODE,
716717
CpuBasedAdmissionControllerSettings.INDEXING_CPU_USAGE_LIMIT,
717718
CpuBasedAdmissionControllerSettings.SEARCH_CPU_USAGE_LIMIT,
718-
CpuBasedAdmissionControllerSettings.CLUSTER_INFO_CPU_USAGE_LIMIT,
719719
CpuBasedAdmissionControllerSettings.CLUSTER_ADMIN_CPU_USAGE_LIMIT,
720-
721720
IoBasedAdmissionControllerSettings.IO_BASED_ADMISSION_CONTROLLER_TRANSPORT_LAYER_MODE,
722721
IoBasedAdmissionControllerSettings.SEARCH_IO_USAGE_LIMIT,
723722
IoBasedAdmissionControllerSettings.INDEXING_IO_USAGE_LIMIT,
724-
IndicesService.CLUSTER_INDEX_RESTRICT_REPLICATION_TYPE_SETTING,
725-
IndicesService.CLUSTER_REMOTE_STORE_PATH_PREFIX_TYPE_SETTING,
726-
IndicesService.CLUSTER_INDEX_RESTRICT_REPLICATION_TYPE_SETTING,
727723

728724
// Concurrent segment search settings
729725
SearchService.CLUSTER_CONCURRENT_SEGMENT_SEARCH_SETTING,

server/src/main/java/org/opensearch/ratelimitting/admissioncontrol/controllers/IoBasedAdmissionController.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ private void applyForTransportLayer(String actionName, AdmissionControlActionTyp
6868
throw new OpenSearchRejectedExecutionException(
6969
String.format(
7070
Locale.ROOT,
71-
"Io usage admission controller rejected the request for action [%s] as IO limit reached",
71+
"IO usage admission controller rejected the request for action [%s] as IO limit reached for action-type [%s]",
72+
actionName,
7273
admissionControlActionType.name()
7374
)
7475
);
@@ -113,6 +114,8 @@ private long getIoRejectionThreshold(AdmissionControlActionType admissionControl
113114
return this.settings.getSearchIOUsageLimit();
114115
case INDEXING:
115116
return this.settings.getIndexingIOUsageLimit();
117+
case CLUSTER_ADMIN:
118+
return this.settings.getClusterAdminIOUsageLimit();
116119
default:
117120
throw new IllegalArgumentException(
118121
String.format(

server/src/main/java/org/opensearch/ratelimitting/admissioncontrol/enums/AdmissionControlActionType.java

+9-6
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,15 @@ public String getType() {
3434

3535
public static AdmissionControlActionType fromName(String name) {
3636
name = name.toLowerCase(Locale.ROOT);
37-
38-
for (AdmissionControlActionType type : AdmissionControlActionType.values()) {
39-
if (type.getType().equals(name)) {
40-
return type;
41-
}
37+
switch (name) {
38+
case "indexing":
39+
return INDEXING;
40+
case "search":
41+
return SEARCH;
42+
case "cluster_admin":
43+
return CLUSTER_ADMIN;
44+
default:
45+
throw new IllegalArgumentException("Not Supported TransportAction Type: " + name);
4246
}
43-
throw new IllegalArgumentException("Not Supported TransportAction Type: " + name);
4447
}
4548
}

server/src/main/java/org/opensearch/ratelimitting/admissioncontrol/settings/IoBasedAdmissionControllerSettings.java

+18
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,14 @@ public class IoBasedAdmissionControllerSettings {
2525
*/
2626
public static class Defaults {
2727
public static final long IO_USAGE_LIMIT = 95;
28+
public static final long CLUSTER_ADMIN_IO_USAGE_LIMIT = 100;
29+
2830
}
2931

3032
private AdmissionControlMode transportLayerMode;
3133
private Long searchIOUsageLimit;
3234
private Long indexingIOUsageLimit;
35+
private Long clusterAdminIOUsageLimit;
3336

3437
/**
3538
* Feature level setting to operate in shadow-mode or in enforced-mode. If enforced field is set
@@ -63,11 +66,22 @@ public static class Defaults {
6366
Setting.Property.NodeScope
6467
);
6568

69+
/**
70+
* This setting used to set the limits for cluster admin requests by default it will use default cluster_admin IO usage limit
71+
*/
72+
public static final Setting<Long> CLUSTER_ADMIN_IO_USAGE_LIMIT = Setting.longSetting(
73+
"admission_control.cluster_admin.io_usage.limit",
74+
Defaults.CLUSTER_ADMIN_IO_USAGE_LIMIT,
75+
Setting.Property.Final,
76+
Setting.Property.NodeScope
77+
);
78+
6679
public IoBasedAdmissionControllerSettings(ClusterSettings clusterSettings, Settings settings) {
6780
this.transportLayerMode = IO_BASED_ADMISSION_CONTROLLER_TRANSPORT_LAYER_MODE.get(settings);
6881
clusterSettings.addSettingsUpdateConsumer(IO_BASED_ADMISSION_CONTROLLER_TRANSPORT_LAYER_MODE, this::setTransportLayerMode);
6982
this.searchIOUsageLimit = SEARCH_IO_USAGE_LIMIT.get(settings);
7083
this.indexingIOUsageLimit = INDEXING_IO_USAGE_LIMIT.get(settings);
84+
this.clusterAdminIOUsageLimit = CLUSTER_ADMIN_IO_USAGE_LIMIT.get(settings);
7185
clusterSettings.addSettingsUpdateConsumer(INDEXING_IO_USAGE_LIMIT, this::setIndexingIOUsageLimit);
7286
clusterSettings.addSettingsUpdateConsumer(SEARCH_IO_USAGE_LIMIT, this::setSearchIOUsageLimit);
7387
}
@@ -95,4 +109,8 @@ public Long getIndexingIOUsageLimit() {
95109
public Long getSearchIOUsageLimit() {
96110
return searchIOUsageLimit;
97111
}
112+
113+
public Long getClusterAdminIOUsageLimit() {
114+
return clusterAdminIOUsageLimit;
115+
}
98116
}

server/src/test/java/org/opensearch/ratelimitting/admissioncontrol/settings/IoBasedAdmissionControllerSettingsTests.java

+16
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ public void testDefaultSettings() {
7272
assertEquals(ioBasedAdmissionControllerSettings.getTransportLayerAdmissionControllerMode(), AdmissionControlMode.DISABLED);
7373
assertEquals(ioBasedAdmissionControllerSettings.getIndexingIOUsageLimit().longValue(), percent);
7474
assertEquals(ioBasedAdmissionControllerSettings.getSearchIOUsageLimit().longValue(), percent);
75+
assertEquals(
76+
ioBasedAdmissionControllerSettings.getClusterAdminIOUsageLimit().longValue(),
77+
IoBasedAdmissionControllerSettings.Defaults.CLUSTER_ADMIN_IO_USAGE_LIMIT
78+
);
7579
}
7680

7781
public void testGetConfiguredSettings() {
@@ -134,6 +138,10 @@ public void testUpdateAfterGetConfiguredSettings() {
134138
assertEquals(ioBasedAdmissionControllerSettings.getTransportLayerAdmissionControllerMode(), AdmissionControlMode.ENFORCED);
135139
assertEquals(ioBasedAdmissionControllerSettings.getSearchIOUsageLimit().longValue(), searchPercent);
136140
assertEquals(ioBasedAdmissionControllerSettings.getIndexingIOUsageLimit().longValue(), percent);
141+
assertEquals(
142+
ioBasedAdmissionControllerSettings.getClusterAdminIOUsageLimit().longValue(),
143+
IoBasedAdmissionControllerSettings.Defaults.CLUSTER_ADMIN_IO_USAGE_LIMIT
144+
);
137145

138146
Settings updatedSettings = Settings.builder()
139147
.put(
@@ -146,6 +154,10 @@ public void testUpdateAfterGetConfiguredSettings() {
146154
assertEquals(ioBasedAdmissionControllerSettings.getTransportLayerAdmissionControllerMode(), AdmissionControlMode.MONITOR);
147155
assertEquals(ioBasedAdmissionControllerSettings.getSearchIOUsageLimit().longValue(), searchPercent);
148156
assertEquals(ioBasedAdmissionControllerSettings.getIndexingIOUsageLimit().longValue(), indexingPercent);
157+
assertEquals(
158+
ioBasedAdmissionControllerSettings.getClusterAdminIOUsageLimit().longValue(),
159+
IoBasedAdmissionControllerSettings.Defaults.CLUSTER_ADMIN_IO_USAGE_LIMIT
160+
);
149161

150162
searchPercent = 70;
151163
updatedSettings = Settings.builder()
@@ -156,5 +168,9 @@ public void testUpdateAfterGetConfiguredSettings() {
156168
clusterService.getClusterSettings().applySettings(updatedSettings);
157169
assertEquals(ioBasedAdmissionControllerSettings.getSearchIOUsageLimit().longValue(), searchPercent);
158170
assertEquals(ioBasedAdmissionControllerSettings.getIndexingIOUsageLimit().longValue(), indexingPercent);
171+
assertEquals(
172+
ioBasedAdmissionControllerSettings.getClusterAdminIOUsageLimit().longValue(),
173+
IoBasedAdmissionControllerSettings.Defaults.CLUSTER_ADMIN_IO_USAGE_LIMIT
174+
);
159175
}
160176
}

0 commit comments

Comments
 (0)