From eed6f3e4d0170993334ddf285b3527753a0f23a4 Mon Sep 17 00:00:00 2001 From: Jordan West Date: Sun, 14 Apr 2024 13:05:26 -0700 Subject: [PATCH] Add Priam.jvm.options.inject upsert uses commas as the delimiter between options which doesn't work for a few C* options that use commas in the value. Inject works by takign the string and adding it to the end of the jvm-server.options file verbatim. While the comments in that file say it expects one option per line there is nothign that actually enforces that rule. The line only needs to start with a '-' Code that parses the options file: JVM_OPTS_FILE=$CASSANDRA_CONF/jvm${jvmoptions_variant:--clients}.options if [ $JAVA_VERSION -ge 11 ] ; then JVM_DEP_OPTS_FILE=$CASSANDRA_CONF/jvm11${jvmoptions_variant:--clients}.options else JVM_DEP_OPTS_FILE=$CASSANDRA_CONF/jvm8${jvmoptions_variant:--clients}.options fi for opt in `grep "^-" $JVM_OPTS_FILE` `grep "^-" $JVM_DEP_OPTS_FILE` do JVM_OPTS="$JVM_OPTS $opt" done --- .../netflix/priam/config/IConfiguration.java | 4 ++ .../priam/config/PriamConfiguration.java | 5 ++ .../netflix/priam/tuner/JVMOptionsTuner.java | 3 + .../priam/tuner/JVMOptionTunerTest.java | 60 ++++++++++++++++++- 4 files changed, 70 insertions(+), 2 deletions(-) diff --git a/priam/src/main/java/com/netflix/priam/config/IConfiguration.java b/priam/src/main/java/com/netflix/priam/config/IConfiguration.java index a217fc3a1..6fc656caa 100644 --- a/priam/src/main/java/com/netflix/priam/config/IConfiguration.java +++ b/priam/src/main/java/com/netflix/priam/config/IConfiguration.java @@ -74,6 +74,10 @@ default String getJVMUpsertSet() { return StringUtils.EMPTY; } + default String getJVMInjectSet() { + return StringUtils.EMPTY; + } + /** @return Path to Cassandra startup script */ default String getCassStartupScript() { return "/etc/init.d/cassandra start"; diff --git a/priam/src/main/java/com/netflix/priam/config/PriamConfiguration.java b/priam/src/main/java/com/netflix/priam/config/PriamConfiguration.java index e708e56b1..15fb15c69 100644 --- a/priam/src/main/java/com/netflix/priam/config/PriamConfiguration.java +++ b/priam/src/main/java/com/netflix/priam/config/PriamConfiguration.java @@ -223,6 +223,11 @@ public String getJVMUpsertSet() { return config.get(PRIAM_PRE + ".jvm.options.upsert"); } + @Override + public String getJVMInjectSet() { + return config.get(PRIAM_PRE + ".jvm.options.inject"); + } + @Override public String getFlushCronExpression() { return config.get(PRIAM_PRE + ".flush.cron", "-1"); diff --git a/priam/src/main/java/com/netflix/priam/tuner/JVMOptionsTuner.java b/priam/src/main/java/com/netflix/priam/tuner/JVMOptionsTuner.java index 91efc1de5..3d5e390e5 100644 --- a/priam/src/main/java/com/netflix/priam/tuner/JVMOptionsTuner.java +++ b/priam/src/main/java/com/netflix/priam/tuner/JVMOptionsTuner.java @@ -153,6 +153,9 @@ protected Map> updateJVMOptions() throws Exception { .collect(Collectors.toList())); } + final String injectSet = config.getJVMInjectSet(); + if (injectSet != null && !injectSet.trim().isEmpty()) configuredOptions.add(injectSet); + HashMap> options = new HashMap>() {}; options.put("configuredJVMOptions", configuredOptions); options.put("configuredJVMVersionOptions", configuredVersionOptions); diff --git a/priam/src/test/java/com/netflix/priam/tuner/JVMOptionTunerTest.java b/priam/src/test/java/com/netflix/priam/tuner/JVMOptionTunerTest.java index 4a53bea1a..e4bc4f493 100644 --- a/priam/src/test/java/com/netflix/priam/tuner/JVMOptionTunerTest.java +++ b/priam/src/test/java/com/netflix/priam/tuner/JVMOptionTunerTest.java @@ -17,8 +17,7 @@ package com.netflix.priam.tuner; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; import com.netflix.priam.config.FakeConfiguration; import com.netflix.priam.config.IConfiguration; @@ -189,6 +188,39 @@ public void testG1GCUpsertExclude() throws Exception { assertTrue(allJVMOptions.contains(youngHeap)); } + @Test + public void testInject() throws Exception { + JVMOption youngHeap = new JVMOption("-Xmn", "3G", true, true); + JVMOption maxHeap = new JVMOption("-Xmx", "12G", false, true); + + JVMOption option1 = new JVMOption("-Dsample"); + JVMOption option2 = new JVMOption("-Dsample2", "10", false, false); + StringBuffer upsert = + new StringBuffer(option1.toJVMOptionString() + "," + option2.toJVMOptionString()); + + String upsertString = + "-Dcassandra.schema_delay_ms=60000 -Dcassandra.skip_schema_check_for_versions=ver1,ver2"; + config = new GCConfiguration(GCType.G1GC, "", upsert.toString(), "3G", "12G", upsertString); + + JVMOptionsTuner tuner = new JVMOptionsTuner(config); + List configuredJVMOptions = tuner.updateJVMOptions().get("configuredJVMOptions"); + + for (String s : + new String[] { + option1.toJVMOptionString(), option2.toJVMOptionString(), upsertString + }) { + boolean found = false; + for (String f : configuredJVMOptions) { + if (f.equalsIgnoreCase(s)) { + found = true; + break; + } + } + + assertTrue("could not find " + s + " in jvm options", found); + } + } + private List getConfiguredJVMOptions(IConfiguration config) throws Exception { return getConfiguredJVMOptions(config, true); } @@ -241,17 +273,36 @@ private class GCConfiguration extends FakeConfiguration { private String configuredHeapNewSize; private String configuredHeapSize; + private String configuredJVMInject; + GCConfiguration( GCType gcType, String configuredJVMExclude, String configuredJVMUpsert, String configuredHeapNewSize, String configuredHeapSize) { + this( + gcType, + configuredJVMExclude, + configuredJVMUpsert, + configuredHeapNewSize, + configuredHeapSize, + ""); + } + + GCConfiguration( + GCType gcType, + String configuredJVMExclude, + String configuredJVMUpsert, + String configuredHeapNewSize, + String configuredHeapSize, + String configuredJVMInject) { this.gcType = gcType; this.configuredJVMExclude = configuredJVMExclude; this.configuredJVMUpsert = configuredJVMUpsert; this.configuredHeapNewSize = configuredHeapNewSize; this.configuredHeapSize = configuredHeapSize; + this.configuredJVMInject = configuredJVMInject; } @Override @@ -278,5 +329,10 @@ public String getHeapNewSize() { public String getJVMUpsertSet() { return configuredJVMUpsert; } + + @Override + public String getJVMInjectSet() { + return configuredJVMInject; + } } }