From 326d588d5e3e635eaade5f3a9c02e6c369d89129 Mon Sep 17 00:00:00 2001 From: Daniel Mohedano Date: Fri, 16 Oct 2026 10:38:34 +0200 Subject: [PATCH 1/2] test(ci-visibility): disable CDS in nested smoke test JVMs on Linux arm64 --- .../civisibility/CiVisibilitySmokeTest.java | 21 +++++++++++++++++++ .../smoketest/GradleDaemonSmokeTest.java | 1 + .../smoketest/GradleLauncherSmokeTest.java | 3 +++ .../datadog/smoketest/MavenSmokeTest.java | 1 + 4 files changed, 26 insertions(+) diff --git a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/java/datadog/trace/civisibility/CiVisibilitySmokeTest.java b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/java/datadog/trace/civisibility/CiVisibilitySmokeTest.java index 859f95c917c..02ca44bb4f4 100644 --- a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/java/datadog/trace/civisibility/CiVisibilitySmokeTest.java +++ b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/java/datadog/trace/civisibility/CiVisibilitySmokeTest.java @@ -6,6 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import datadog.environment.OperatingSystem; import datadog.trace.api.Config; import datadog.trace.api.civisibility.config.TestFQN; import datadog.trace.api.config.CiVisibilityConfig; @@ -40,6 +41,9 @@ public abstract class CiVisibilitySmokeTest { private static final Map DEFAULT_TRACER_CONFIG = defaultJvmArguments(); + private static final String JAVA_TOOL_OPTIONS = "JAVA_TOOL_OPTIONS"; + private static final String DISABLE_CDS = "-Xshare:off"; + @TempDir protected Path prefsDir; protected static String buildJavaHome() { @@ -149,6 +153,23 @@ protected String preventJulPrefsFileLock() { return "-Djava.util.prefs.userRoot=" + resolved.toAbsolutePath(); } + /** + * Disables CDS in every JVM started with {@code environment}, including nested build tool + * processes, to avoid SIGSEGVs on Linux arm64. + */ + protected static void disableCdsOnLinuxArm64(Map environment) { + if (!OperatingSystem.isLinux() || !OperatingSystem.architecture().isArm64()) { + return; + } + String options = environment.get(JAVA_TOOL_OPTIONS); + if (options == null) { + options = System.getenv(JAVA_TOOL_OPTIONS); + } + environment.put( + JAVA_TOOL_OPTIONS, + options == null || options.isEmpty() ? DISABLE_CDS : options + " " + DISABLE_CDS); + } + private static Path tempUserPrefsPath() { String uniqueId = System.currentTimeMillis() + "_" + System.nanoTime() + "_" + Thread.currentThread().getId(); diff --git a/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleDaemonSmokeTest.java b/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleDaemonSmokeTest.java index 22dc76ce8a6..86a54b0488c 100644 --- a/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleDaemonSmokeTest.java +++ b/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleDaemonSmokeTest.java @@ -557,6 +557,7 @@ private BuildResult runGradle( buildEnv.put("MAVEN_REPOSITORY_PROXY", mavenRepositoryProxy); } GradleDistribution.propagateMassReadUrl(buildEnv); + disableCdsOnLinuxArm64(buildEnv); GradleRunner gradleRunner = GradleDistribution.withDistribution( diff --git a/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleLauncherSmokeTest.java b/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleLauncherSmokeTest.java index 199e21bfe70..8f3e776cdb1 100644 --- a/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleLauncherSmokeTest.java +++ b/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleLauncherSmokeTest.java @@ -99,6 +99,7 @@ void stopGradleBuildDaemon() { Map env = new HashMap<>(); env.put("JAVA_HOME", JAVA_HOME); env.put("GRADLE_USER_HOME", gradleUserHome.toString()); + disableCdsOnLinuxArm64(env); env.put("GRADLE_ARGS", ""); env.put("GRADLE_OPTS", ""); ShellCommandExecutor shellCommandExecutor = @@ -115,6 +116,7 @@ private void givenGradleWrapper(String gradleVersion) throws Exception { Map env = new HashMap<>(); env.put("JAVA_HOME", JAVA_HOME); env.put("GRADLE_USER_HOME", gradleUserHome.toString()); + disableCdsOnLinuxArm64(env); // Avoid inheriting CI Gradle launcher settings that might be incompatible with this wrapper. env.put("GRADLE_ARGS", ""); env.put("GRADLE_OPTS", ""); @@ -141,6 +143,7 @@ private String whenRunningGradleLauncherWithJavaTracerInjected(String gradleDaem Map env = new HashMap<>(); env.put("JAVA_HOME", JAVA_HOME); env.put("GRADLE_USER_HOME", gradleUserHome.toString()); + disableCdsOnLinuxArm64(env); env.put("GRADLE_ARGS", ""); env.put("GRADLE_OPTS", "-javaagent:" + AGENT_JAR); env.put("DD_CIVISIBILITY_ENABLED", "true"); diff --git a/dd-smoke-tests/maven/src/test/java/datadog/smoketest/MavenSmokeTest.java b/dd-smoke-tests/maven/src/test/java/datadog/smoketest/MavenSmokeTest.java index 1f8bca1da85..11dfe175af8 100644 --- a/dd-smoke-tests/maven/src/test/java/datadog/smoketest/MavenSmokeTest.java +++ b/dd-smoke-tests/maven/src/test/java/datadog/smoketest/MavenSmokeTest.java @@ -531,6 +531,7 @@ ProcessBuilder createProcessBuilder( if (mavenRepositoryProxy != null) { processBuilder.environment().put("MAVEN_REPOSITORY_PROXY", mavenRepositoryProxy); } + disableCdsOnLinuxArm64(processBuilder.environment()); return processBuilder; } From 86ea008de93f5625edc45eadd83a306b8c4bf315 Mon Sep 17 00:00:00 2001 From: Daniel Mohedano Date: Fri, 16 Oct 2026 13:04:40 +0200 Subject: [PATCH 2/2] test(ci-visibility): disable CDS in smoke test JVMs started with agent arguments on Linux arm64 --- .../trace/civisibility/CiVisibilitySmokeTest.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/java/datadog/trace/civisibility/CiVisibilitySmokeTest.java b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/java/datadog/trace/civisibility/CiVisibilitySmokeTest.java index 02ca44bb4f4..4de14554ca3 100644 --- a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/java/datadog/trace/civisibility/CiVisibilitySmokeTest.java +++ b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/java/datadog/trace/civisibility/CiVisibilitySmokeTest.java @@ -105,6 +105,9 @@ private static Map buildJvmArgMap( protected List buildJvmArguments( String mockBackendIntakeUrl, String serviceName, Map additionalArgs) { List arguments = new ArrayList<>(Arrays.asList("-Xms256m", "-Xmx512m")); + if (isLinuxArm64()) { + arguments.add(DISABLE_CDS); + } arguments.add(preventJulPrefsFileLock()); @@ -158,7 +161,7 @@ protected String preventJulPrefsFileLock() { * processes, to avoid SIGSEGVs on Linux arm64. */ protected static void disableCdsOnLinuxArm64(Map environment) { - if (!OperatingSystem.isLinux() || !OperatingSystem.architecture().isArm64()) { + if (!isLinuxArm64()) { return; } String options = environment.get(JAVA_TOOL_OPTIONS); @@ -170,6 +173,10 @@ protected static void disableCdsOnLinuxArm64(Map environment) { options == null || options.isEmpty() ? DISABLE_CDS : options + " " + DISABLE_CDS); } + private static boolean isLinuxArm64() { + return OperatingSystem.isLinux() && OperatingSystem.architecture().isArm64(); + } + private static Path tempUserPrefsPath() { String uniqueId = System.currentTimeMillis() + "_" + System.nanoTime() + "_" + Thread.currentThread().getId();