diff --git a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/WrapRunnableAsNewTaskInstrumentation.java b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/WrapRunnableAsNewTaskInstrumentation.java index f4690009d1d..41303a9f006 100644 --- a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/WrapRunnableAsNewTaskInstrumentation.java +++ b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/WrapRunnableAsNewTaskInstrumentation.java @@ -13,6 +13,7 @@ import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; +import datadog.trace.bootstrap.CallDepthThreadLocalMap; import datadog.trace.bootstrap.instrumentation.java.concurrent.NewTaskForPlaceholder; import datadog.trace.bootstrap.instrumentation.java.concurrent.Wrapper; import java.util.concurrent.AbstractExecutorService; @@ -97,7 +98,16 @@ public static void cancel( @Advice.Thrown Throwable error) { // don't cancel unless we did the wrapping if (wrapped && null != error && task instanceof RunnableFuture) { - ((RunnableFuture) task).cancel(true); + // Guard against recursive cancel calls which can cause StackOverflowError + // when executor.execute() fails during shutdown and triggers promise notifications + int callDepth = CallDepthThreadLocalMap.incrementCallDepth(RunnableFuture.class); + try { + if (callDepth == 0) { + ((RunnableFuture) task).cancel(true); + } + } finally { + CallDepthThreadLocalMap.decrementCallDepth(RunnableFuture.class); + } } } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/build.gradle b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/build.gradle index 823193ea978..56311523214 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/build.gradle +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/build.gradle @@ -1,6 +1,4 @@ apply from: "$rootDir/gradle/java.gradle" -// Use slf4j-simple as default; logback has a high chance of getting stuck in a deadlock on CI. -apply from: "$rootDir/gradle/slf4j-simple.gradle" testJvmConstraints { // TODO Java 17: This version of vertx-web doesn't support Java 17