From d700646154d336a7bab2b0887b901c8e96a1eced Mon Sep 17 00:00:00 2001 From: Zhengyu Gu Date: Thu, 16 Oct 2025 16:17:47 +0200 Subject: [PATCH 1/3] Race on late initializing crash tracking results JVM to crash --- .../src/main/java/datadog/trace/bootstrap/Agent.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java index 48557510aa7..4ce40f6fa92 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java @@ -63,6 +63,7 @@ import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; +import java.nio.ByteBuffer; import java.security.CodeSource; import java.util.EnumSet; import java.util.concurrent.TimeUnit; @@ -795,6 +796,11 @@ private static void startCrashTracking() { if (forceEarlyStart) { initializeCrashTrackingDefault(); } else { + // To workaround JDK-8345810, we want to initialize nio early, + // which has dependence on libpthread. Creating a small nio ByteBuffer + // to force nio initialization. + ByteBuffer buffer = ByteBuffer.allocate(1); + AgentTaskScheduler.get().execute(Agent::initializeCrashTrackingDefault); } } else { From 51dcb98747fc3e5626ec5ad38bd45e32d4c5c67e Mon Sep 17 00:00:00 2001 From: Zhengyu Gu Date: Fri, 17 Oct 2025 14:09:41 +0200 Subject: [PATCH 2/3] Use FileSystems.getDefault() to force loading nio library --- .../src/main/java/datadog/trace/bootstrap/Agent.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java index 4ce40f6fa92..d1283f7ed2a 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java @@ -63,7 +63,7 @@ import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; -import java.nio.ByteBuffer; +import java.nio.file.FileSystems; import java.security.CodeSource; import java.util.EnumSet; import java.util.concurrent.TimeUnit; @@ -799,8 +799,7 @@ private static void startCrashTracking() { // To workaround JDK-8345810, we want to initialize nio early, // which has dependence on libpthread. Creating a small nio ByteBuffer // to force nio initialization. - ByteBuffer buffer = ByteBuffer.allocate(1); - + FileSystems.getDefault(); AgentTaskScheduler.get().execute(Agent::initializeCrashTrackingDefault); } } else { From c96d5798e25fd0ddc129bda6224d0b36e2f351c3 Mon Sep 17 00:00:00 2001 From: Zhengyu Gu Date: Mon, 20 Oct 2025 09:53:42 -0400 Subject: [PATCH 3/3] Force loading/initializing pthread early on main thread --- .../src/main/java/datadog/trace/bootstrap/Agent.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java index d1283f7ed2a..5967bf705b5 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java @@ -291,6 +291,12 @@ public static void start( startCwsAgent(); } + // To workaround JDK-8345810, we want to trigger loading/initializing of pthread library on + // main thread (Linux only) + if (OperatingSystem.isLinux()) { + FileSystems.getDefault(); + } + /* * Force the task scheduler init early. The exception profiling instrumentation may get in way of the initialization * when it will happen after the class transformers were added. @@ -796,10 +802,6 @@ private static void startCrashTracking() { if (forceEarlyStart) { initializeCrashTrackingDefault(); } else { - // To workaround JDK-8345810, we want to initialize nio early, - // which has dependence on libpthread. Creating a small nio ByteBuffer - // to force nio initialization. - FileSystems.getDefault(); AgentTaskScheduler.get().execute(Agent::initializeCrashTrackingDefault); } } else {