This is an automated email from the ASF dual-hosted git repository.
sunnianjun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 46a2fb0fc59 Use RootSpanContext to instead of ExecutorDataMap for root
span thread-crossed passing for zipkin (#23682)
46a2fb0fc59 is described below
commit 46a2fb0fc5963dda10324211b5ddb83864b23c06
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Jan 20 23:45:41 2023 +0800
Use RootSpanContext to instead of ExecutorDataMap for root span
thread-crossed passing for zipkin (#23682)
* Use RootSpanContext to instead of DataMap for root span thread-crossed
passing for zipkin
* Use RootSpanContext to instead of DataMap for root span thread-crossed
passing for zipkin
* Add executor test case
* Add transmittable-thread-local dependency
* Use transmittable-thread-local on zipkin
---
.../advice/ZipkinCommandExecutorTaskAdvice.java | 8 +--
.../advice/ZipkinJDBCExecutorCallbackAdvice.java | 7 +--
.../zipkin/advice/ZipkinSQLParserEngineAdvice.java | 6 +--
.../tracing/zipkin/constant/ZipkinConstants.java | 2 -
.../tracing/zipkin/span/RootSpanContext.java | 58 +++++++++++++++++++++
.../ZipkinJDBCExecutorCallbackAdviceTest.java | 6 ---
.../advice/ZipkinSQLParserEngineAdviceTest.java | 11 ++--
.../proxy-native/src/main/release-docs/LICENSE | 1 +
distribution/proxy/src/main/release-docs/LICENSE | 1 +
infra/executor/pom.xml | 5 ++
.../kernel/thread/ExecutorServiceManager.java | 3 +-
.../thread/ExecutorThreadFactoryBuilder.java | 11 ----
.../kernel/thread/ExecutorServiceManagerTest.java | 59 ++++++++++++++++++++++
.../thread/ExecutorThreadFactoryBuilderTest.java | 11 ----
pom.xml | 6 +++
15 files changed, 146 insertions(+), 49 deletions(-)
diff --git
a/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinCommandExecutorTaskAdvice.java
b/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinCommandExecutorTaskAdvice.java
index ae7aeb15b83..7b96a44c936 100644
---
a/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinCommandExecutorTaskAdvice.java
+++
b/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinCommandExecutorTaskAdvice.java
@@ -23,7 +23,7 @@ import
org.apache.shardingsphere.agent.api.advice.TargetAdviceObject;
import org.apache.shardingsphere.agent.api.advice.type.InstanceMethodAdvice;
import org.apache.shardingsphere.agent.plugin.core.util.AgentReflectionUtil;
import
org.apache.shardingsphere.agent.plugin.tracing.zipkin.constant.ZipkinConstants;
-import org.apache.shardingsphere.infra.executor.kernel.model.ExecutorDataMap;
+import
org.apache.shardingsphere.agent.plugin.tracing.zipkin.span.RootSpanContext;
import org.apache.shardingsphere.proxy.backend.communication.BackendConnection;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
@@ -40,19 +40,19 @@ public final class ZipkinCommandExecutorTaskAdvice
implements InstanceMethodAdvi
public void beforeMethod(final TargetAdviceObject target, final Method
method, final Object[] args, final String pluginType) {
Span span = Tracing.currentTracer().newTrace().name(OPERATION_NAME);
span.tag(ZipkinConstants.Tags.COMPONENT,
ZipkinConstants.COMPONENT_NAME).kind(Span.Kind.CLIENT).tag(ZipkinConstants.Tags.DB_TYPE,
ZipkinConstants.DB_TYPE_VALUE).start();
- ExecutorDataMap.getValue().put(ZipkinConstants.ROOT_SPAN, span);
+ RootSpanContext.set(span);
}
@Override
public void afterMethod(final TargetAdviceObject target, final Method
method, final Object[] args, final Object result, final String pluginType) {
BackendConnection connection =
AgentReflectionUtil.<ConnectionSession>getFieldValue(target,
"connectionSession").getBackendConnection();
- Span span = (Span)
ExecutorDataMap.getValue().remove(ZipkinConstants.ROOT_SPAN);
+ Span span = RootSpanContext.get();
span.tag(ZipkinConstants.Tags.CONNECTION_COUNT,
String.valueOf(connection.getConnectionSize()));
span.finish();
}
@Override
public void onThrowing(final TargetAdviceObject target, final Method
method, final Object[] args, final Throwable throwable, final String
pluginType) {
- ((Span)
ExecutorDataMap.getValue().get(ZipkinConstants.ROOT_SPAN)).error(throwable);
+ RootSpanContext.<Span>get().error(throwable);
}
}
diff --git
a/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinJDBCExecutorCallbackAdvice.java
b/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinJDBCExecutorCallbackAdvice.java
index 971cf245142..99d3ffa5f8a 100644
---
a/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinJDBCExecutorCallbackAdvice.java
+++
b/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinJDBCExecutorCallbackAdvice.java
@@ -24,6 +24,7 @@ import
org.apache.shardingsphere.agent.api.advice.TargetAdviceObject;
import org.apache.shardingsphere.agent.api.advice.type.InstanceMethodAdvice;
import org.apache.shardingsphere.agent.plugin.core.util.AgentReflectionUtil;
import
org.apache.shardingsphere.agent.plugin.tracing.zipkin.constant.ZipkinConstants;
+import
org.apache.shardingsphere.agent.plugin.tracing.zipkin.span.RootSpanContext;
import org.apache.shardingsphere.infra.database.metadata.DataSourceMetaData;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutionUnit;
@@ -43,10 +44,10 @@ public final class ZipkinJDBCExecutorCallbackAdvice
implements InstanceMethodAdv
@Override
@SneakyThrows({ReflectiveOperationException.class, SQLException.class})
- @SuppressWarnings("unchecked")
public void beforeMethod(final TargetAdviceObject target, final Method
method, final Object[] args, final String pluginType) {
- Span root = (Span) ((Map<String, Object>)
args[2]).get(ZipkinConstants.ROOT_SPAN);
- Span span = null == root ?
Tracing.currentTracer().nextSpan().name(OPERATION_NAME) :
Tracing.currentTracer().newChild(root.context()).name(OPERATION_NAME);
+ Span span = RootSpanContext.isEmpty()
+ ? Tracing.currentTracer().nextSpan().name(OPERATION_NAME)
+ :
Tracing.currentTracer().newChild(RootSpanContext.<Span>get().context()).name(OPERATION_NAME);
span.tag(ZipkinConstants.Tags.COMPONENT,
ZipkinConstants.COMPONENT_NAME);
span.tag(ZipkinConstants.Tags.DB_TYPE, ZipkinConstants.DB_TYPE_VALUE);
JDBCExecutionUnit executionUnit = (JDBCExecutionUnit) args[0];
diff --git
a/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinSQLParserEngineAdvice.java
b/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinSQLParserEngineAdvice.java
index 8ad9ca7ef9d..3e7c0985b85 100644
---
a/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinSQLParserEngineAdvice.java
+++
b/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinSQLParserEngineAdvice.java
@@ -19,11 +19,10 @@ package
org.apache.shardingsphere.agent.plugin.tracing.zipkin.advice;
import brave.Span;
import brave.Tracing;
-import brave.propagation.TraceContext;
import org.apache.shardingsphere.agent.api.advice.TargetAdviceObject;
import org.apache.shardingsphere.agent.api.advice.type.InstanceMethodAdvice;
import
org.apache.shardingsphere.agent.plugin.tracing.zipkin.constant.ZipkinConstants;
-import org.apache.shardingsphere.infra.executor.kernel.model.ExecutorDataMap;
+import
org.apache.shardingsphere.agent.plugin.tracing.zipkin.span.RootSpanContext;
import java.lang.reflect.Method;
@@ -36,8 +35,7 @@ public final class ZipkinSQLParserEngineAdvice implements
InstanceMethodAdvice {
@Override
public void beforeMethod(final TargetAdviceObject target, final Method
method, final Object[] args, final String pluginType) {
- TraceContext parentContext = ((Span)
ExecutorDataMap.getValue().get(ZipkinConstants.ROOT_SPAN)).context();
- Span span =
Tracing.currentTracer().newChild(parentContext).name(OPERATION_NAME);
+ Span span =
Tracing.currentTracer().newChild(RootSpanContext.<Span>get().context()).name(OPERATION_NAME);
span.tag(ZipkinConstants.Tags.COMPONENT,
ZipkinConstants.COMPONENT_NAME);
span.tag(ZipkinConstants.Tags.DB_TYPE, ZipkinConstants.DB_TYPE_VALUE);
span.tag(ZipkinConstants.Tags.DB_STATEMENT, String.valueOf(args[0]));
diff --git
a/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/constant/ZipkinConstants.java
b/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/constant/ZipkinConstants.java
index 71fb81442c9..966f5aa47a0 100644
---
a/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/constant/ZipkinConstants.java
+++
b/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/constant/ZipkinConstants.java
@@ -28,8 +28,6 @@ public final class ZipkinConstants {
public static final String COMPONENT_NAME = "shardingsphere";
- public static final String ROOT_SPAN = "zipkin_root_span";
-
public static final String DB_TYPE_VALUE = "shardingsphere-proxy";
@NoArgsConstructor(access = AccessLevel.PRIVATE)
diff --git
a/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/span/RootSpanContext.java
b/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/span/RootSpanContext.java
new file mode 100644
index 00000000000..c24b1d400d0
--- /dev/null
+++
b/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/span/RootSpanContext.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.agent.plugin.tracing.zipkin.span;
+
+import com.alibaba.ttl.TransmittableThreadLocal;
+
+/**
+ * Root span context.
+ */
+public final class RootSpanContext {
+
+ private static final TransmittableThreadLocal<Object> VALUE = new
TransmittableThreadLocal<>();
+
+ /**
+ * Judge whether empty root span.
+ *
+ * @return empty span or not
+ */
+ public static boolean isEmpty() {
+ return null == VALUE.get();
+ }
+
+ /**
+ * Get root span.
+ *
+ * @param <T> type of span
+ * @return root span
+ */
+ @SuppressWarnings("unchecked")
+ public static <T> T get() {
+ return (T) VALUE.get();
+ }
+
+ /**
+ * Set root span.
+ *
+ * @param value root span
+ * @param <T> type of span
+ */
+ public static <T> void set(final T value) {
+ VALUE.set(value);
+ }
+}
diff --git
a/agent/plugins/tracing/type/zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinJDBCExecutorCallbackAdviceTest.java
b/agent/plugins/tracing/type/zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinJDBCExecutorCallbackAdviceTest.java
index e6d1bcf922d..cee26964005 100644
---
a/agent/plugins/tracing/type/zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinJDBCExecutorCallbackAdviceTest.java
+++
b/agent/plugins/tracing/type/zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinJDBCExecutorCallbackAdviceTest.java
@@ -20,7 +20,6 @@ package
org.apache.shardingsphere.agent.plugin.tracing.zipkin.advice;
import
org.apache.shardingsphere.agent.plugin.tracing.advice.AbstractJDBCExecutorCallbackAdviceTest;
import
org.apache.shardingsphere.agent.plugin.tracing.zipkin.collector.ZipkinCollector;
import
org.apache.shardingsphere.agent.plugin.tracing.zipkin.constant.ZipkinConstants;
-import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Test;
import zipkin2.Span;
@@ -37,11 +36,6 @@ public final class ZipkinJDBCExecutorCallbackAdviceTest
extends AbstractJDBCExec
@ClassRule
public static final ZipkinCollector COLLECTOR = new ZipkinCollector();
- @Before
- public void setup() {
- getExtraMap().put(ZipkinConstants.ROOT_SPAN, null);
- }
-
@Test
public void assertMethod() {
ZipkinJDBCExecutorCallbackAdvice advice = new
ZipkinJDBCExecutorCallbackAdvice();
diff --git
a/agent/plugins/tracing/type/zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinSQLParserEngineAdviceTest.java
b/agent/plugins/tracing/type/zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinSQLParserEngineAdviceTest.java
index 738dafad848..1587691fd6d 100644
---
a/agent/plugins/tracing/type/zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinSQLParserEngineAdviceTest.java
+++
b/agent/plugins/tracing/type/zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinSQLParserEngineAdviceTest.java
@@ -22,7 +22,7 @@ import brave.Tracing;
import
org.apache.shardingsphere.agent.plugin.tracing.advice.AbstractSQLParserEngineAdviceTest;
import
org.apache.shardingsphere.agent.plugin.tracing.zipkin.collector.ZipkinCollector;
import
org.apache.shardingsphere.agent.plugin.tracing.zipkin.constant.ZipkinConstants;
-import org.apache.shardingsphere.infra.executor.kernel.model.ExecutorDataMap;
+import
org.apache.shardingsphere.agent.plugin.tracing.zipkin.span.RootSpanContext;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Test;
@@ -43,12 +43,9 @@ public final class ZipkinSQLParserEngineAdviceTest extends
AbstractSQLParserEngi
private ZipkinSQLParserEngineAdvice advice;
- private Span parentSpan;
-
@Before
public void setup() {
- parentSpan = Tracing.currentTracer().newTrace().name("parent").start();
- ExecutorDataMap.getValue().put(ZipkinConstants.ROOT_SPAN, parentSpan);
+
RootSpanContext.set(Tracing.currentTracer().newTrace().name("parent").start());
advice = new ZipkinSQLParserEngineAdvice();
}
@@ -56,7 +53,7 @@ public final class ZipkinSQLParserEngineAdviceTest extends
AbstractSQLParserEngi
public void assertMethod() {
advice.beforeMethod(getTargetObject(), null, new
Object[]{SQL_STATEMENT, true}, "Zipkin");
advice.afterMethod(getTargetObject(), null, new
Object[]{SQL_STATEMENT, true}, null, "Zipkin");
- parentSpan.finish();
+ RootSpanContext.<Span>get().finish();
zipkin2.Span span = COLLECTOR.pop();
assertNotNull(span.parentId());
Map<String, String> tags = span.tags();
@@ -69,7 +66,7 @@ public final class ZipkinSQLParserEngineAdviceTest extends
AbstractSQLParserEngi
advice.beforeMethod(getTargetObject(), null, new
Object[]{SQL_STATEMENT, true}, "Zipkin");
advice.onThrowing(getTargetObject(), null, new Object[]{SQL_STATEMENT,
true}, new IOException(), "Zipkin");
advice.afterMethod(getTargetObject(), null, new
Object[]{SQL_STATEMENT, true}, null, "Zipkin");
- parentSpan.finish();
+ RootSpanContext.<Span>get().finish();
zipkin2.Span span = COLLECTOR.pop();
assertNotNull(span.parentId());
Map<String, String> tags = span.tags();
diff --git a/distribution/proxy-native/src/main/release-docs/LICENSE
b/distribution/proxy-native/src/main/release-docs/LICENSE
index d05f7ebe370..7ab7c219f02 100644
--- a/distribution/proxy-native/src/main/release-docs/LICENSE
+++ b/distribution/proxy-native/src/main/release-docs/LICENSE
@@ -288,6 +288,7 @@ The text of each license is the standard Apache 2.0 license.
quartz 2.3.2: https://github.com/quartz-scheduler/quartz, Apache 2.0
sketches-core 0.9.0, Apache 2.0
snakeyaml 1.33: https://bitbucket.org/snakeyaml/snakeyaml, Apache 2.0
+ transmittable-thread-local 2.14.2:
https://github.com/alibaba/transmittable-thread-local, Apache 2.0
uzaygezen-core 0.2: https://code.google.com/p/uzaygezen, Apache 2.0
zookeeper 3.8.0: https://github.com/apache/zookeeper, Apache 2.0
zookeeper-jute 3.8.0: https://github.com/apache/zookeeper, Apache 2.0
diff --git a/distribution/proxy/src/main/release-docs/LICENSE
b/distribution/proxy/src/main/release-docs/LICENSE
index e753e8d671b..29e54d10e52 100644
--- a/distribution/proxy/src/main/release-docs/LICENSE
+++ b/distribution/proxy/src/main/release-docs/LICENSE
@@ -290,6 +290,7 @@ The text of each license is the standard Apache 2.0 license.
quartz 2.3.2: https://github.com/quartz-scheduler/quartz, Apache 2.0
sketches-core 0.9.0, Apache 2.0
snakeyaml 1.33: https://bitbucket.org/snakeyaml/snakeyaml, Apache 2.0
+ transmittable-thread-local 2.14.2:
https://github.com/alibaba/transmittable-thread-local, Apache 2.0
uzaygezen-core 0.2: https://code.google.com/p/uzaygezen, Apache 2.0
zookeeper 3.8.0: https://github.com/apache/zookeeper, Apache 2.0
zookeeper-jute 3.8.0: https://github.com/apache/zookeeper, Apache 2.0
diff --git a/infra/executor/pom.xml b/infra/executor/pom.xml
index 5a542c96b88..c9893c548c3 100644
--- a/infra/executor/pom.xml
+++ b/infra/executor/pom.xml
@@ -45,5 +45,10 @@
<version>${project.version}</version>
<scope>test</scope>
</dependency>
+
+ <dependency>
+ <groupId>com.alibaba</groupId>
+ <artifactId>transmittable-thread-local</artifactId>
+ </dependency>
</dependencies>
</project>
diff --git
a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorServiceManager.java
b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorServiceManager.java
index 0abe5b5df86..135830b1575 100644
---
a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorServiceManager.java
+++
b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorServiceManager.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.infra.executor.kernel.thread;
+import com.alibaba.ttl.threadpool.TtlExecutors;
import lombok.Getter;
import java.util.concurrent.ExecutorService;
@@ -41,7 +42,7 @@ public final class ExecutorServiceManager {
}
public ExecutorServiceManager(final int executorSize, final String
nameFormat) {
- executorService = getExecutorService(executorSize, nameFormat);
+ executorService =
TtlExecutors.getTtlExecutorService(getExecutorService(executorSize,
nameFormat));
}
private ExecutorService getExecutorService(final int executorSize, final
String nameFormat) {
diff --git
a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorThreadFactoryBuilder.java
b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorThreadFactoryBuilder.java
index 5b06e30a1e3..a2947dcc86b 100644
---
a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorThreadFactoryBuilder.java
+++
b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorThreadFactoryBuilder.java
@@ -31,17 +31,6 @@ public final class ExecutorThreadFactoryBuilder {
private static final String NAME_FORMAT_PREFIX = "ShardingSphere-";
- private static final String DEFAULT_EXECUTOR_NAME_FORMAT =
NAME_FORMAT_PREFIX + "%d";
-
- /**
- * Build default thread factory.
- *
- * @return default thread factory
- */
- public static ThreadFactory build() {
- return new
ThreadFactoryBuilder().setDaemon(true).setNameFormat(DEFAULT_EXECUTOR_NAME_FORMAT).build();
- }
-
/**
* Build thread factory with thread name format.
*
diff --git
a/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorServiceManagerTest.java
b/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorServiceManagerTest.java
new file mode 100644
index 00000000000..4f1d7b78fbd
--- /dev/null
+++
b/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorServiceManagerTest.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.executor.kernel.thread;
+
+import com.alibaba.ttl.TransmittableThreadLocal;
+import org.junit.Test;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public final class ExecutorServiceManagerTest {
+
+ private static final TransmittableThreadLocal<String>
TRANSMITTABLE_THREAD_LOCAL = new TransmittableThreadLocal<>();
+
+ @Test(timeout = 1000L)
+ public void assertThreadLocalValueChangedForReusedThread() throws
InterruptedException {
+ AtomicBoolean finished = new AtomicBoolean(false);
+ ExecutorService executorService = new
ExecutorServiceManager(1).getExecutorService();
+ executorService.submit(() -> {
+ TRANSMITTABLE_THREAD_LOCAL.set("foo");
+ executorService.submit(() ->
assertThat(TRANSMITTABLE_THREAD_LOCAL.get(), is("foo")));
+ });
+ TRANSMITTABLE_THREAD_LOCAL.set("bar");
+ executorService.submit(() -> {
+ assertValueChangedInConcurrencyThread();
+ finished.set(true);
+ });
+ while (!finished.get()) {
+ Thread.sleep(100L);
+ }
+ }
+
+ private void assertValueChangedInConcurrencyThread() {
+ try {
+ assertThat(TRANSMITTABLE_THREAD_LOCAL.get(), is("bar"));
+ } catch (final AssertionError ex) {
+ ex.printStackTrace();
+ throw ex;
+ }
+ }
+}
diff --git
a/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorThreadFactoryBuilderTest.java
b/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorThreadFactoryBuilderTest.java
index e0a5ed9639f..cafd33941f9 100644
---
a/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorThreadFactoryBuilderTest.java
+++
b/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorThreadFactoryBuilderTest.java
@@ -26,17 +26,6 @@ import static org.hamcrest.MatcherAssert.assertThat;
public final class ExecutorThreadFactoryBuilderTest {
- @Test
- public void assertBuild() {
- ThreadFactory threadFactory = ExecutorThreadFactoryBuilder.build();
- Thread thread0 = threadFactory.newThread(() -> {
- });
- assertThat(thread0.getName(), is("ShardingSphere-0"));
- Thread thread1 = threadFactory.newThread(() -> {
- });
- assertThat(thread1.getName(), is("ShardingSphere-1"));
- }
-
@Test
public void assertBuildWithNameFormat() {
ThreadFactory threadFactory =
ExecutorThreadFactoryBuilder.build("test");
diff --git a/pom.xml b/pom.xml
index 178024903ee..94f4c3fd940 100644
--- a/pom.xml
+++ b/pom.xml
@@ -63,6 +63,7 @@
<commons-lang3.version>3.12.0</commons-lang3.version>
<commons-collections4.version>4.4</commons-collections4.version>
<commons-codec.version>1.15</commons-codec.version>
+
<transmittable-thread-local.version>2.14.2</transmittable-thread-local.version>
<antlr4.version>4.9.2</antlr4.version>
<snakeyaml.version>1.33</snakeyaml.version>
@@ -182,6 +183,11 @@
<artifactId>commons-codec</artifactId>
<version>${commons-codec.version}</version>
</dependency>
+ <dependency>
+ <groupId>com.alibaba</groupId>
+ <artifactId>transmittable-thread-local</artifactId>
+ <version>${transmittable-thread-local.version}</version>
+ </dependency>
<dependency>
<groupId>org.antlr</groupId>