Skip to content

Commit 8a7e5b0

Browse files
committed
Move ES_TMPDIR substitution into jvm options parser (#47189)
This commit moves the ES_TMPDIR substitution that we do for JVM options into the JVM options parser itself. This solves a problem where the fact that the we do not make the substitution before ergonomics parsing can lead to the JVM that we start for computing the ergonomic values failing to start. Additionally, moving this substitution here enables us to simplify the shell scripts since we do not need to implement this there, and twice for Bash and Windows.
1 parent d966e5a commit 8a7e5b0

File tree

5 files changed

+35
-9
lines changed

5 files changed

+35
-9
lines changed

distribution/src/bin/elasticsearch

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ if [ -z "$ES_TMPDIR" ]; then
2121
fi
2222

2323
ES_JVM_OPTIONS="$ES_PATH_CONF"/jvm.options
24-
JVM_OPTIONS=`"$JAVA" -cp "$ES_CLASSPATH" org.elasticsearch.tools.launchers.JvmOptionsParser "$ES_JVM_OPTIONS"`
25-
ES_JAVA_OPTS="${JVM_OPTIONS//\$\{ES_TMPDIR\}/$ES_TMPDIR}"
24+
ES_JAVA_OPTS=`export ES_TMPDIR; "$JAVA" -cp "$ES_CLASSPATH" org.elasticsearch.tools.launchers.JvmOptionsParser "$ES_JVM_OPTIONS"`
2625

2726
# manual parsing to find out, if process should be detached
2827
if ! echo $* | grep -E '(^-d |-d$| -d |--daemonize$|--daemonize )' > /dev/null; then

distribution/src/bin/elasticsearch-service.bat

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,8 @@ set ES_JVM_OPTIONS=%ES_PATH_CONF%\jvm.options
115115
if not "%ES_JAVA_OPTS%" == "" set ES_JAVA_OPTS=%ES_JAVA_OPTS: =;%
116116

117117
@setlocal
118-
for /F "usebackq delims=" %%a in (`"%JAVA% -cp "!ES_CLASSPATH!" "org.elasticsearch.tools.launchers.JvmOptionsParser" "!ES_JVM_OPTIONS!" || echo jvm_options_parser_failed"`) do set JVM_OPTIONS=%%a
119-
@endlocal & set "MAYBE_JVM_OPTIONS_PARSER_FAILED=%JVM_OPTIONS%" & set ES_JAVA_OPTS=%JVM_OPTIONS:${ES_TMPDIR}=!ES_TMPDIR!%
118+
for /F "usebackq delims=" %%a in (`"%JAVA% -cp "!ES_CLASSPATH!" "org.elasticsearch.tools.launchers.JvmOptionsParser" "!ES_JVM_OPTIONS!" || echo jvm_options_parser_failed"`) do set ES_JAVA_OPTS=%%a
119+
@endlocal & set "MAYBE_JVM_OPTIONS_PARSER_FAILED=%ES_JAVA_OPTS%" & set ES_JAVA_OPTS=%ES_JAVA_OPTS%
120120

121121
if "%MAYBE_JVM_OPTIONS_PARSER_FAILED%" == "jvm_options_parser_failed" (
122122
exit /b 1

distribution/src/bin/elasticsearch.bat

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ if not defined ES_TMPDIR (
4747

4848
set ES_JVM_OPTIONS=%ES_PATH_CONF%\jvm.options
4949
@setlocal
50-
for /F "usebackq delims=" %%a in (`CALL %JAVA% -cp "!ES_CLASSPATH!" "org.elasticsearch.tools.launchers.JvmOptionsParser" "!ES_JVM_OPTIONS!" ^|^| echo jvm_options_parser_failed`) do set JVM_OPTIONS=%%a
51-
@endlocal & set "MAYBE_JVM_OPTIONS_PARSER_FAILED=%JVM_OPTIONS%" & set ES_JAVA_OPTS=%JVM_OPTIONS:${ES_TMPDIR}=!ES_TMPDIR!%
50+
for /F "usebackq delims=" %%a in (`CALL %JAVA% -cp "!ES_CLASSPATH!" "org.elasticsearch.tools.launchers.JvmOptionsParser" "!ES_JVM_OPTIONS!" ^|^| echo jvm_options_parser_failed`) do set ES_JAVA_OPTS=%%a
51+
@endlocal & set "MAYBE_JVM_OPTIONS_PARSER_FAILED=%ES_JAVA_OPTS%" & set ES_JAVA_OPTS=%ES_JAVA_OPTS%
5252

5353
if "%MAYBE_JVM_OPTIONS_PARSER_FAILED%" == "jvm_options_parser_failed" (
5454
exit /b 1

distribution/tools/launchers/src/main/java/org/elasticsearch/tools/launchers/JvmOptionsParser.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,11 @@ public void accept(final int lineNumber, final String line) {
8686
.filter(s -> s.trim().isEmpty() == false)
8787
.collect(Collectors.toList()));
8888
}
89-
final List<String> ergonomicJvmOptions = JvmErgonomics.choose(jvmOptions);
90-
jvmOptions.addAll(ergonomicJvmOptions);
91-
final String spaceDelimitedJvmOptions = spaceDelimitJvmOptions(jvmOptions);
89+
final List<String> substitutedJvmOptions =
90+
substitutePlaceholders(jvmOptions, Map.of("ES_TMPDIR", System.getenv("ES_TMPDIR")));
91+
final List<String> ergonomicJvmOptions = JvmErgonomics.choose(substitutedJvmOptions);
92+
substitutedJvmOptions.addAll(ergonomicJvmOptions);
93+
final String spaceDelimitedJvmOptions = spaceDelimitJvmOptions(substitutedJvmOptions);
9294
Launchers.outPrintln(spaceDelimitedJvmOptions);
9395
Launchers.exit(0);
9496
} else {
@@ -114,6 +116,24 @@ public void accept(final int lineNumber, final String line) {
114116
}
115117
}
116118

119+
static List<String> substitutePlaceholders(final List<String> jvmOptions, final Map<String, String> substitutions) {
120+
final Map<String, String> placeholderSubstitutions =
121+
substitutions.entrySet().stream().collect(Collectors.toMap(e -> "${" + e.getKey() + "}", Map.Entry::getValue));
122+
return jvmOptions.stream()
123+
.map(
124+
jvmOption -> {
125+
String actualJvmOption = jvmOption;
126+
int start = jvmOption.indexOf("${");
127+
if (start >= 0 && jvmOption.indexOf('}', start) > 0) {
128+
for (final Map.Entry<String, String> placeholderSubstitution : placeholderSubstitutions.entrySet()) {
129+
actualJvmOption = actualJvmOption.replace(placeholderSubstitution.getKey(), placeholderSubstitution.getValue());
130+
}
131+
}
132+
return actualJvmOption;
133+
})
134+
.collect(Collectors.toList());
135+
}
136+
117137
/**
118138
* Callback for valid JVM options.
119139
*/

distribution/tools/launchers/src/test/java/org/elasticsearch/tools/launchers/JvmOptionsParserTests.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.util.Map;
3131
import java.util.concurrent.atomic.AtomicBoolean;
3232

33+
import static org.hamcrest.Matchers.contains;
3334
import static org.hamcrest.Matchers.equalTo;
3435
import static org.junit.Assert.assertFalse;
3536
import static org.junit.Assert.assertNull;
@@ -39,6 +40,12 @@
3940

4041
public class JvmOptionsParserTests extends LaunchersTestCase {
4142

43+
public void testSubstitution() {
44+
final List<String> jvmOptions =
45+
JvmOptionsParser.substitutePlaceholders(List.of("-Djava.io.tmpdir=${ES_TMPDIR}"), Map.of("ES_TMPDIR", "/tmp/elasticsearch"));
46+
assertThat(jvmOptions, contains("-Djava.io.tmpdir=/tmp/elasticsearch"));
47+
}
48+
4249
public void testUnversionedOptions() throws IOException {
4350
try (StringReader sr = new StringReader("-Xms1g\n-Xmx1g");
4451
BufferedReader br = new BufferedReader(sr)) {

0 commit comments

Comments
 (0)