From fbabc3d3abdf23597e0e892516cb056e3fc7111f Mon Sep 17 00:00:00 2001 From: xiaqi1210 Date: Tue, 25 Jul 2023 21:50:30 +0800 Subject: [PATCH] avoid ThreadPoolExecutor duplicate enhancement (#582) Co-authored-by: xiaqi --- CHANGES.md | 1 + .../apm/plugin/AbstractThreadingPoolInterceptor.java | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index edd97691d..a56bff98c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -147,6 +147,7 @@ Callable { * Support to trace redisson lock * Upgrade netty-codec-http2 to 4.1.94.Final * Upgrade guava to 32.0.1 +* Fix issue with duplicate enhancement by ThreadPoolExecutor #### Documentation diff --git a/apm-sniffer/bootstrap-plugins/jdk-threadpool-plugin/src/main/java/org/apache/skywalking/apm/plugin/AbstractThreadingPoolInterceptor.java b/apm-sniffer/bootstrap-plugins/jdk-threadpool-plugin/src/main/java/org/apache/skywalking/apm/plugin/AbstractThreadingPoolInterceptor.java index c130c2f5b..723945307 100644 --- a/apm-sniffer/bootstrap-plugins/jdk-threadpool-plugin/src/main/java/org/apache/skywalking/apm/plugin/AbstractThreadingPoolInterceptor.java +++ b/apm-sniffer/bootstrap-plugins/jdk-threadpool-plugin/src/main/java/org/apache/skywalking/apm/plugin/AbstractThreadingPoolInterceptor.java @@ -19,6 +19,7 @@ package org.apache.skywalking.apm.plugin; import org.apache.skywalking.apm.agent.core.context.ContextManager; +import org.apache.skywalking.apm.agent.core.context.ContextSnapshot; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; @@ -37,6 +38,11 @@ public abstract class AbstractThreadingPoolInterceptor implements InstanceMethod Object argument = allArguments[0]; + // Avoid duplicate enhancement, such as the case where it has already been enhanced by RunnableWrapper or CallableWrapper with toolkit. + if (argument instanceof EnhancedInstance && ((EnhancedInstance) argument).getSkyWalkingDynamicField() instanceof ContextSnapshot) { + return; + } + Object wrappedObject = wrap(argument); if (wrappedObject != null) { allArguments[0] = wrappedObject;