From 1570e0fe544d4598959e0bf3008257878b551aba Mon Sep 17 00:00:00 2001 From: zack-rma Date: Fri, 5 Jun 2026 15:49:47 -0700 Subject: [PATCH] Initial memory parser for global and test-local memory overrides --- .../comparison/utils/ComputeTestUtils.java | 11 +- .../engine/core/components/ControlData.java | 2 + .../engine/core/solver/InitialXASolver.java | 7 +- .../engine/core/tools/MemoryParamParser.java | 112 ++++++++++++++++++ .../core/tools/MemoryParamParserTest.java | 63 ++++++++++ 5 files changed, 192 insertions(+), 3 deletions(-) create mode 100644 wrims-core/src/main/java/gov/ca/water/wrims/engine/core/tools/MemoryParamParser.java create mode 100644 wrims-core/src/test/java/gov/ca/water/wrims/engine/core/tools/MemoryParamParserTest.java diff --git a/wrims-comparison-test/src/test/java/gov/ca/water/wrims/comparison/utils/ComputeTestUtils.java b/wrims-comparison-test/src/test/java/gov/ca/water/wrims/comparison/utils/ComputeTestUtils.java index 87b98b1e..b5b42e5b 100644 --- a/wrims-comparison-test/src/test/java/gov/ca/water/wrims/comparison/utils/ComputeTestUtils.java +++ b/wrims-comparison-test/src/test/java/gov/ca/water/wrims/comparison/utils/ComputeTestUtils.java @@ -13,13 +13,20 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; +import gov.ca.water.wrims.engine.core.tools.MemoryParamParser; public class ComputeTestUtils { private static final Logger LOGGER = Logger.getLogger(ComputeTestUtils.class.getName()); - public static final String XMX_PARAM = "-Xmx4096m"; - public static final String XSS_PARAM = "-Xss1024K"; + private static final String XMX_DEFAULT = "4096m"; + private static final String XSS_DEFAULT = "1024K"; + + public static final String XMX_PARAM_KEY = "gov.ca.water.wrims.comparison.compute.memory.max"; + public static final String XSS_PARAM_KEY = "gov.ca.water.wrims.comparison.compute.stack.size"; + + public static final String XMX_PARAM = MemoryParamParser.getMaxMemory(XMX_PARAM_KEY, XMX_DEFAULT); + public static final String XSS_PARAM = MemoryParamParser.getStackMemory(XSS_PARAM_KEY, XSS_DEFAULT); // Run the System Summary Report tool similarly to the Gradle testReport task // Overload with defaults: workingDir = build/testProjects, inputFile = build/(inputFilePath or testProjects/callite_version_check_dss6_6.inp) diff --git a/wrims-core/src/main/java/gov/ca/water/wrims/engine/core/components/ControlData.java b/wrims-core/src/main/java/gov/ca/water/wrims/engine/core/components/ControlData.java index d1c6c5b9..dcfcdc1f 100644 --- a/wrims-core/src/main/java/gov/ca/water/wrims/engine/core/components/ControlData.java +++ b/wrims-core/src/main/java/gov/ca/water/wrims/engine/core/components/ControlData.java @@ -25,6 +25,8 @@ import com.sunsetsoft.xa.Optimizer; public class ControlData { + public static final String XMX_GLOBAL_PARAM_KEY = "gov.ca.water.wrims.comparison.compute.memory.max"; + public static final String XSS_GLOBAL_PARAM_KEY = "gov.ca.water.wrims.comparison.compute.stack.size"; public static ArrayList currTimeStep; public static StudyDataSet currStudyDataSet=new StudyDataSet(); public static ModelDataSet currModelDataSet=new ModelDataSet(); diff --git a/wrims-core/src/main/java/gov/ca/water/wrims/engine/core/solver/InitialXASolver.java b/wrims-core/src/main/java/gov/ca/water/wrims/engine/core/solver/InitialXASolver.java index e9b4fa32..b2d98fc1 100644 --- a/wrims-core/src/main/java/gov/ca/water/wrims/engine/core/solver/InitialXASolver.java +++ b/wrims-core/src/main/java/gov/ca/water/wrims/engine/core/solver/InitialXASolver.java @@ -6,10 +6,15 @@ import com.sunsetsoft.xa.XAException; import gov.ca.water.wrims.engine.core.components.Error; +import gov.ca.water.wrims.engine.core.tools.MemoryParamParser; public class InitialXASolver { + public static final String XA_MAX_MEMORY_PARAM_KEY = "gov.ca.water.wrims.engine.core.solver.xa.memory.max"; + private static final long MEMORY_DEFAULT = 25000L; + public InitialXASolver(){ - ControlData.xasolver=new Optimizer(25000); + Long initialMemory = MemoryParamParser.getMaxMemoryInBytes(XA_MAX_MEMORY_PARAM_KEY, MEMORY_DEFAULT); + ControlData.xasolver=new Optimizer(initialMemory.intValue()); ControlData.xasolver.setActivationCodes( 234416483 , 19834525 ) ; ControlData.xasolver.setXAMessageWindowOff(); try{ diff --git a/wrims-core/src/main/java/gov/ca/water/wrims/engine/core/tools/MemoryParamParser.java b/wrims-core/src/main/java/gov/ca/water/wrims/engine/core/tools/MemoryParamParser.java new file mode 100644 index 00000000..6b67c43f --- /dev/null +++ b/wrims-core/src/main/java/gov/ca/water/wrims/engine/core/tools/MemoryParamParser.java @@ -0,0 +1,112 @@ +package gov.ca.water.wrims.engine.core.tools; + +import gov.ca.water.wrims.engine.core.components.ControlData; + +public final class MemoryParamParser { + public static final String MEMORY_DECISION_KEY = "gov.ca.water.wrims.engine.core.memory.decision"; + private static final boolean USE_MIN_MEMORY = Boolean.parseBoolean(System.getProperty(MEMORY_DECISION_KEY, "true")); + private static final String XMX_GLOBAL = System.getProperty(ControlData.XMX_GLOBAL_PARAM_KEY); + private static final String XSS_GLOBAL = System.getProperty(ControlData.XSS_GLOBAL_PARAM_KEY); + + private MemoryParamParser() { + throw new IllegalStateException("Utility class"); + } + + public static String getMaxMemory(String localMemoryKey, String defaultValue) { + String xmxLocal = null; + if (localMemoryKey != null && defaultValue != null) { + xmxLocal = System.getProperty(localMemoryKey, defaultValue); + } else if (localMemoryKey == null) { + xmxLocal = defaultValue; + } + return buildMaxParam(compareMemValues(XMX_GLOBAL, xmxLocal)); + } + + public static Long getMaxMemoryInBytes(String localMemoryKey, Long defaultValue) { + String xmxLocal = null; + if (localMemoryKey != null && defaultValue != null) { + xmxLocal = System.getProperty(localMemoryKey, defaultValue.toString()); + } else if (localMemoryKey == null) { + xmxLocal = defaultValue.toString(); + } + return parseParam(compareMemValues(XMX_GLOBAL, xmxLocal)); + } + + public static String getStackMemory(String localMemoryKey, String defaultValue) { + String xssLocal = null; + if (localMemoryKey != null && defaultValue != null) { + xssLocal = System.getProperty(localMemoryKey, defaultValue); + } else if (localMemoryKey == null) { + xssLocal = defaultValue; + } + return buildStackParam(compareMemValues(XSS_GLOBAL, xssLocal)); + } + + public static long getStackMemoryInBytes(String localMemoryKey, String defaultValue) { + String xssLocal = null; + if (localMemoryKey != null && defaultValue != null) { + xssLocal = System.getProperty(localMemoryKey, defaultValue); + } else if (localMemoryKey == null) { + xssLocal = defaultValue; + } + return parseParam(compareMemValues(XSS_GLOBAL, xssLocal)); + } + + private static String compareMemValues(String left, String right) { + long leftValue = parseParam(left); + long rightValue = parseParam(right); + + if (USE_MIN_MEMORY) { + return (leftValue < rightValue) ? left : right; + } else { + return (leftValue > rightValue) ? left : right; + } + } + + private static long parseParam(String value) { + long retVal; + + if (value == null || value.isEmpty()) { + if (USE_MIN_MEMORY) { + return Long.MAX_VALUE; + } else { + return 0L; + } + } + + if (value.startsWith("-")) { + value = value.substring(3); + } + if (value.endsWith("k") || value.endsWith("K")) { + value = value.substring(0, value.length() - 1); + retVal = Long.parseLong(value) * 1024L; + } else if (value.endsWith("m") || value.endsWith("M")) { + value = value.substring(0, value.length() - 1); + retVal = Long.parseLong(value) * 1024L * 1024L; + } else if (value.endsWith("g") || value.endsWith("G")) { + value = value.substring(0, value.length() - 1); + retVal = Long.parseLong(value) * 1024L * 1024L * 1024L; + } else { + retVal = Long.parseLong(value); + } + return retVal; + } + + private static String buildMaxParam(String value) { + if (value == null || value.isEmpty()) { + return ""; + } else if (value.startsWith("-")) { + return value; + } + return String.format("-Xmx%s", value); + } + + private static String buildStackParam(String value) { + if (value == null || value.isEmpty()) { + return ""; + } else if (value.startsWith("-")) { + return value; + } + return String.format("-Xss%s", value); + } +} diff --git a/wrims-core/src/test/java/gov/ca/water/wrims/engine/core/tools/MemoryParamParserTest.java b/wrims-core/src/test/java/gov/ca/water/wrims/engine/core/tools/MemoryParamParserTest.java new file mode 100644 index 00000000..4096218b --- /dev/null +++ b/wrims-core/src/test/java/gov/ca/water/wrims/engine/core/tools/MemoryParamParserTest.java @@ -0,0 +1,63 @@ +package gov.ca.water.wrims.engine.core.tools; + +import gov.ca.water.wrims.engine.core.components.ControlData; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + + +final class MemoryParamParserTest { + + @BeforeAll + static void setup() { + System.setProperty(ControlData.XSS_GLOBAL_PARAM_KEY, "512k"); + System.setProperty(ControlData.XMX_GLOBAL_PARAM_KEY, "8192M"); + } + + @AfterAll + static void teardown() { + System.clearProperty(ControlData.XSS_GLOBAL_PARAM_KEY); + System.clearProperty(ControlData.XMX_GLOBAL_PARAM_KEY); + } + + @Test + void testStackMemParse() + { + String xssLocal = "gov.ca.water.wrims.engine.core.tools.memory.minStackMem"; + System.setProperty(xssLocal, "128k"); + + String memory = MemoryParamParser.getStackMemory(xssLocal, "128k"); + + assertEquals("-Xss128k", memory); + + System.clearProperty(xssLocal); + } + + @Test + void testMaxMemParse() { + String xmxLocal = "gov.ca.water.wrims.engine.core.tools.memory.maxMem"; + System.setProperty(xmxLocal, "1024M"); + + String memory = MemoryParamParser.getMaxMemory(xmxLocal, "128k"); + + assertEquals("-Xmx1024M", memory); + + System.clearProperty(xmxLocal); + } + + @Test + void testStackMemParseGlobal() { + String memory = MemoryParamParser.getStackMemory(null, null); + + assertEquals("-Xss512k", memory); + } + + @Test + void testMaxMemParseGlobal() { + String memory = MemoryParamParser.getMaxMemory(null, null); + + assertEquals("-Xmx8192M", memory); + } +}