Skip to content

Commit 17deb6e

Browse files
committed
[Bug]: gradle check failing with java heap OutOfMemoryError (opensearch-project#4328)
* [Bug]: gradle check failing with java heap OutOfMemoryError Signed-off-by: Andriy Redko <[email protected]> * Fork JavaCompile task Signed-off-by: Andriy Redko <[email protected]> Signed-off-by: Andriy Redko <[email protected]> (cherry picked from commit ccf575a) Signed-off-by: Andriy Redko <[email protected]>
1 parent 39d03ef commit 17deb6e

File tree

3 files changed

+42
-10
lines changed

3 files changed

+42
-10
lines changed

build.gradle

+10
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,12 @@ tasks.register("branchConsistency") {
264264
allprojects {
265265
// configure compiler options
266266
tasks.withType(JavaCompile).configureEach { JavaCompile compile ->
267+
options.fork = true
268+
269+
configure(options.forkOptions) {
270+
memoryMaximumSize = project.property('options.forkOptions.memoryMaximumSize')
271+
}
272+
267273
// See please https://bugs.openjdk.java.net/browse/JDK-8209058
268274
if (BuildParams.runtimeJavaVersion > JavaVersion.VERSION_11) {
269275
compile.options.compilerArgs << '-Werror'
@@ -389,6 +395,10 @@ allprojects {
389395
// the dependency is added.
390396
gradle.projectsEvaluated {
391397
allprojects {
398+
project.tasks.withType(JavaForkOptions) {
399+
maxHeapSize project.property('options.forkOptions.memoryMaximumSize')
400+
}
401+
392402
if (project.path == ':test:framework') {
393403
// :test:framework:test cannot run before and after :server:test
394404
return

server/src/main/java/org/opensearch/indices/breaker/HierarchyCircuitBreakerService.java

+13-2
Original file line numberDiff line numberDiff line change
@@ -559,8 +559,19 @@ static long fallbackRegionSize(JvmInfo jvmInfo) {
559559
// https://hg.openjdk.java.net/jdk/jdk/file/e7d0ec2d06e8/src/hotspot/share/gc/g1/heapRegion.cpp#l67
560560
// based on this JDK "bug":
561561
// https://bugs.openjdk.java.net/browse/JDK-8241670
562-
long averageHeapSize = (jvmInfo.getMem().getHeapMax().getBytes() + JvmInfo.jvmInfo().getMem().getHeapMax().getBytes()) / 2;
563-
long regionSize = Long.highestOneBit(averageHeapSize / 2048);
562+
// JDK-17 updates:
563+
// https://github.com/openjdk/jdk17u/blob/master/src/hotspot/share/gc/g1/heapRegionBounds.hpp
564+
// https://github.com/openjdk/jdk17u/blob/master/src/hotspot/share/gc/g1/heapRegion.cpp#L67
565+
long regionSizeUnrounded = Math.min(
566+
Math.max(JvmInfo.jvmInfo().getMem().getHeapMax().getBytes() / 2048, ByteSizeUnit.MB.toBytes(1)),
567+
ByteSizeUnit.MB.toBytes(32)
568+
);
569+
570+
long regionSize = Long.highestOneBit(regionSizeUnrounded);
571+
if (regionSize != regionSizeUnrounded) {
572+
regionSize <<= 1; /* next power of 2 */
573+
}
574+
564575
if (regionSize < ByteSizeUnit.MB.toBytes(1)) {
565576
regionSize = ByteSizeUnit.MB.toBytes(1);
566577
} else if (regionSize > ByteSizeUnit.MB.toBytes(32)) {

server/src/test/java/org/opensearch/common/settings/MemorySizeSettingsTests.java

+19-8
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
package org.opensearch.common.settings;
3434

3535
import org.opensearch.common.settings.Setting.Property;
36-
import org.opensearch.common.unit.ByteSizeUnit;
3736
import org.opensearch.common.unit.ByteSizeValue;
3837
import org.opensearch.common.util.PageCacheRecycler;
3938
import org.opensearch.indices.IndexingMemoryController;
@@ -83,32 +82,40 @@ public void testIndicesRequestCacheSetting() {
8382
}
8483

8584
public void testCircuitBreakerSettings() {
86-
// default is chosen based on actual heap size
85+
final Settings settings = Settings.builder()
86+
.put(HierarchyCircuitBreakerService.USE_REAL_MEMORY_USAGE_SETTING.getKey(), randomBoolean())
87+
.build();
88+
89+
// default is chosen based on USE_REAL_MEMORY_USAGE_SETTING setting
8790
double defaultTotalPercentage;
88-
if (JvmInfo.jvmInfo().getMem().getHeapMax().getBytes() < new ByteSizeValue(1, ByteSizeUnit.GB).getBytes()) {
91+
if (HierarchyCircuitBreakerService.USE_REAL_MEMORY_USAGE_SETTING.get(settings)) {
8992
defaultTotalPercentage = 0.95d;
9093
} else {
9194
defaultTotalPercentage = 0.7d;
9295
}
9396
assertMemorySizeSetting(
9497
HierarchyCircuitBreakerService.TOTAL_CIRCUIT_BREAKER_LIMIT_SETTING,
9598
"indices.breaker.total.limit",
96-
new ByteSizeValue((long) (JvmInfo.jvmInfo().getMem().getHeapMax().getBytes() * defaultTotalPercentage))
99+
new ByteSizeValue((long) (JvmInfo.jvmInfo().getMem().getHeapMax().getBytes() * defaultTotalPercentage)),
100+
settings
97101
);
98102
assertMemorySizeSetting(
99103
HierarchyCircuitBreakerService.FIELDDATA_CIRCUIT_BREAKER_LIMIT_SETTING,
100104
"indices.breaker.fielddata.limit",
101-
new ByteSizeValue((long) (JvmInfo.jvmInfo().getMem().getHeapMax().getBytes() * 0.4))
105+
new ByteSizeValue((long) (JvmInfo.jvmInfo().getMem().getHeapMax().getBytes() * 0.4)),
106+
settings
102107
);
103108
assertMemorySizeSetting(
104109
HierarchyCircuitBreakerService.REQUEST_CIRCUIT_BREAKER_LIMIT_SETTING,
105110
"indices.breaker.request.limit",
106-
new ByteSizeValue((long) (JvmInfo.jvmInfo().getMem().getHeapMax().getBytes() * 0.6))
111+
new ByteSizeValue((long) (JvmInfo.jvmInfo().getMem().getHeapMax().getBytes() * 0.6)),
112+
settings
107113
);
108114
assertMemorySizeSetting(
109115
HierarchyCircuitBreakerService.IN_FLIGHT_REQUESTS_CIRCUIT_BREAKER_LIMIT_SETTING,
110116
"network.breaker.inflight_requests.limit",
111-
new ByteSizeValue((JvmInfo.jvmInfo().getMem().getHeapMax().getBytes()))
117+
new ByteSizeValue((JvmInfo.jvmInfo().getMem().getHeapMax().getBytes())),
118+
settings
112119
);
113120
}
114121

@@ -121,10 +128,14 @@ public void testIndicesFieldDataCacheSetting() {
121128
}
122129

123130
private void assertMemorySizeSetting(Setting<ByteSizeValue> setting, String settingKey, ByteSizeValue defaultValue) {
131+
assertMemorySizeSetting(setting, settingKey, defaultValue, Settings.EMPTY);
132+
}
133+
134+
private void assertMemorySizeSetting(Setting<ByteSizeValue> setting, String settingKey, ByteSizeValue defaultValue, Settings settings) {
124135
assertThat(setting, notNullValue());
125136
assertThat(setting.getKey(), equalTo(settingKey));
126137
assertThat(setting.getProperties(), hasItem(Property.NodeScope));
127-
assertThat(setting.getDefault(Settings.EMPTY), equalTo(defaultValue));
138+
assertThat(setting.getDefault(settings), equalTo(defaultValue));
128139
Settings settingWithPercentage = Settings.builder().put(settingKey, "25%").build();
129140
assertThat(
130141
setting.get(settingWithPercentage),

0 commit comments

Comments
 (0)