diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmErgonomics.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmErgonomics.java index 46e3da3ced90b..b8409adacd57a 100644 --- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmErgonomics.java +++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmErgonomics.java @@ -66,13 +66,17 @@ static boolean tuneG1GCForSmallHeap(final long heapSize) { static boolean tuneG1GCHeapRegion(final Map finalJvmOptions, final boolean tuneG1GCForSmallHeap) { JvmOption g1GCHeapRegion = finalJvmOptions.get("G1HeapRegionSize"); JvmOption g1GC = finalJvmOptions.get("UseG1GC"); - return (tuneG1GCForSmallHeap && g1GC.getMandatoryValue().equals("true") && g1GCHeapRegion.isCommandLineOrigin() == false); + return (tuneG1GCForSmallHeap + && g1GC != null + && g1GC.getMandatoryValue().equals("true") + && g1GCHeapRegion != null + && g1GCHeapRegion.isCommandLineOrigin() == false); } static int tuneG1GCReservePercent(final Map finalJvmOptions, final boolean tuneG1GCForSmallHeap) { JvmOption g1GC = finalJvmOptions.get("UseG1GC"); JvmOption g1GCReservePercent = finalJvmOptions.get("G1ReservePercent"); - if (g1GC.getMandatoryValue().equals("true")) { + if (g1GC != null && g1GC.getMandatoryValue().equals("true") && g1GCReservePercent != null) { if (g1GCReservePercent.isCommandLineOrigin() == false && tuneG1GCForSmallHeap) { return 15; } else if (g1GCReservePercent.isCommandLineOrigin() == false && tuneG1GCForSmallHeap == false) { @@ -85,7 +89,10 @@ static int tuneG1GCReservePercent(final Map finalJvmOptions, static boolean tuneG1GCInitiatingHeapOccupancyPercent(final Map finalJvmOptions) { JvmOption g1GC = finalJvmOptions.get("UseG1GC"); JvmOption g1GCInitiatingHeapOccupancyPercent = finalJvmOptions.get("InitiatingHeapOccupancyPercent"); - return g1GCInitiatingHeapOccupancyPercent.isCommandLineOrigin() == false && g1GC.getMandatoryValue().equals("true"); + return g1GCInitiatingHeapOccupancyPercent != null + && g1GCInitiatingHeapOccupancyPercent.isCommandLineOrigin() == false + && g1GC != null + && g1GC.getMandatoryValue().equals("true"); } private static final Pattern SYSTEM_PROPERTY = Pattern.compile("^-D(?[\\w+].*?)=(?.*)$"); diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmOption.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmOption.java index 39bf2e54dade0..021eba2d3c24c 100644 --- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmOption.java +++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmOption.java @@ -42,7 +42,7 @@ public String getMandatoryValue() { } public boolean isCommandLineOrigin() { - return this.origin.contains("command line"); + return this.origin != null && this.origin.contains("command line"); } private static final Pattern OPTION = Pattern.compile( diff --git a/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/JvmErgonomicsTests.java b/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/JvmErgonomicsTests.java index f68a51de85c2a..fe48513a765c2 100644 --- a/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/JvmErgonomicsTests.java +++ b/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/JvmErgonomicsTests.java @@ -179,4 +179,19 @@ public void testMaxDirectMemorySizeChoiceWhenSet() throws Exception { ); } + public void testTuneG1GCHeapRegionWithEmptyFinalJvmOptionsReturnsFalse() { + Map finalJvmOptions = new HashMap<>(); + assertFalse(JvmErgonomics.tuneG1GCHeapRegion(finalJvmOptions, true)); + } + + public void testTuneG1GCReservePercentWithEmptyFinalJvmOptionsReturnsZero() { + Map finalJvmOptions = new HashMap<>(); + assertEquals(JvmErgonomics.tuneG1GCReservePercent(finalJvmOptions, true), 0); + } + + public void testTuneG1GCInitiatingHeapOccupancyPercentWithEmptyFinalJvmOptionsReturnsFalse() { + Map finalJvmOptions = new HashMap<>(); + assertFalse(JvmErgonomics.tuneG1GCInitiatingHeapOccupancyPercent(finalJvmOptions)); + } + } diff --git a/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/JvmOptionsParserTests.java b/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/JvmOptionsParserTests.java index 5d63f29ac584e..1ce46ab40e87f 100644 --- a/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/JvmOptionsParserTests.java +++ b/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/JvmOptionsParserTests.java @@ -344,4 +344,9 @@ public void accept(final int lineNumber, final String line) { assertThat(seenInvalidLines, equalTo(invalidLines)); } + public void testIsCommandLineOriginWithNullOriginReturnsFalse() { + JvmOption jvmOption = new JvmOption("value", null); + assertFalse(jvmOption.isCommandLineOrigin()); + } + } diff --git a/docs/changelog/93197.yaml b/docs/changelog/93197.yaml new file mode 100644 index 0000000000000..3d9f6a8971292 --- /dev/null +++ b/docs/changelog/93197.yaml @@ -0,0 +1,6 @@ +pr: 93197 +summary: Add null check for G1 related options and origin field. This change avoids NPE when starting Elasticsearch on the Azul Platform Prime JDK. +area: Infra/Settings +type: bug +issues: + - 91577