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..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 @@ -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() { @@ -101,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()); @@ -149,6 +156,27 @@ 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 (!isLinuxArm64()) { + 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 boolean isLinuxArm64() { + return OperatingSystem.isLinux() && OperatingSystem.architecture().isArm64(); + } + 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; }