Skip to content

Commit 257afc6

Browse files
committed
Disable GCedMemoryUsage if no concurrent GC MXBean
Signed-off-by: Lantao Jin <ltjin@amazon.com>
1 parent f2d972d commit 257afc6

2 files changed

Lines changed: 27 additions & 15 deletions

File tree

integ-test/src/test/java/org/opensearch/sql/ppl/ResourceMonitorIT.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55

66
package org.opensearch.sql.ppl;
77

8-
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_DOG;
9-
import static org.opensearch.sql.util.MatcherUtils.columnName;
10-
import static org.opensearch.sql.util.MatcherUtils.verifyColumn;
8+
import static org.opensearch.sql.util.MatcherUtils.verifyNumOfRows;
119

1210
import java.io.IOException;
1311
import org.hamcrest.Matchers;
@@ -21,17 +19,19 @@ public class ResourceMonitorIT extends PPLIntegTestCase {
2119
@Override
2220
public void init() throws Exception {
2321
super.init();
24-
loadIndex(Index.DOG);
22+
loadIndex(Index.CLICK_BENCH);
2523
}
2624

2725
@Test
2826
public void queryExceedResourceLimitShouldFail() throws IOException {
2927
// update plugins.ppl.query.memory_limit to 1%
3028
updateClusterSettings(
3129
new ClusterSetting("persistent", Settings.Key.QUERY_MEMORY_LIMIT.getKeyValue(), "1%"));
32-
String query = String.format("search source=%s age=20", TEST_INDEX_DOG);
30+
// ClickBench Q30 is high memory consumption query.
31+
String query = sanitize(loadFromFile("clickbench/queries/q30.ppl"));
3332

34-
ResponseException exception = expectThrows(ResponseException.class, () -> executeQuery(query));
33+
ResponseException exception =
34+
expectThrows(ResponseException.class, () -> executeQueryMultipleTimes(query));
3535
assertEquals(500, exception.getResponse().getStatusLine().getStatusCode());
3636
assertThat(
3737
exception.getMessage(),
@@ -40,7 +40,14 @@ public void queryExceedResourceLimitShouldFail() throws IOException {
4040
// update plugins.ppl.query.memory_limit to default value 85%
4141
updateClusterSettings(
4242
new ClusterSetting("persistent", Settings.Key.QUERY_MEMORY_LIMIT.getKeyValue(), "85%"));
43-
JSONObject result = executeQuery(String.format("search source=%s", TEST_INDEX_DOG));
44-
verifyColumn(result, columnName("dog_name"), columnName("holdersName"), columnName("age"));
43+
executeQueryMultipleTimes(query);
44+
}
45+
46+
/** Run the same query multiple times in case GC can be triggered in integration test */
47+
private void executeQueryMultipleTimes(String query) throws IOException {
48+
for (int i = 0; i < 10; i++) {
49+
JSONObject result = executeQuery(query);
50+
verifyNumOfRows(result, 1);
51+
}
4552
}
4653
}

opensearch/src/main/java/org/opensearch/sql/opensearch/monitor/GCedMemoryUsage.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,18 @@ public void setUsage(long value) {
5656
}
5757

5858
private void registerGCListener() {
59-
boolean registered = false;
6059
List<GarbageCollectorMXBean> gcBeans = ManagementFactory.getGarbageCollectorMXBeans();
60+
if (gcBeans.stream()
61+
.filter(b -> b instanceof NotificationEmitter)
62+
.noneMatch(b -> containConcurrentGcBean(b.getName()))) {
63+
// Concurrent Garbage Collector MXBean only existed since Java 21.
64+
// fallback to RuntimeMemoryUsage
65+
LOG.info("No Concurrent Garbage Collector MXBean, fallback to RuntimeMemoryUsage");
66+
throw new OpenSearchMemoryHealthy.MemoryUsageException();
67+
}
6168
for (GarbageCollectorMXBean gcBean : gcBeans) {
6269
if (gcBean instanceof NotificationEmitter && isOldGenGc(gcBean.getName())) {
6370
LOG.info("{} listener registered for memory usage monitor.", gcBean.getName());
64-
registered = true;
6571
NotificationEmitter emitter = (NotificationEmitter) gcBean;
6672
emitter.addNotificationListener(
6773
new OldGenGCListener(),
@@ -78,11 +84,10 @@ private void registerGCListener() {
7884
null);
7985
}
8086
}
81-
if (!registered) {
82-
// fallback to RuntimeMemoryUsage
83-
LOG.info("No old gen GC listener registered, fallback to RuntimeMemoryUsage");
84-
throw new OpenSearchMemoryHealthy.MemoryUsageException();
85-
}
87+
}
88+
89+
private boolean containConcurrentGcBean(String beanName) {
90+
return beanName.toLowerCase(Locale.ROOT).contains("concurrent");
8691
}
8792

8893
private boolean isOldGenGc(String gcKeyword) {

0 commit comments

Comments
 (0)