You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by su...@apache.org on 2022/12/31 07:46:57 UTC
[shardingsphere] branch master updated: Refactor ClassLoaderContext (#23221)
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 d964a9f9003 Refactor ClassLoaderContext (#23221)
d964a9f9003 is described below
commit d964a9f900364b7e3c8b841b6fa90aac5263cb0b
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Sat Dec 31 15:46:50 2022 +0800
Refactor ClassLoaderContext (#23221)
* Refactor pom of agent-core
* Refactor AdvisorConfigurationLoader
* Refactor ClassLoaderContext
* Refactor AgentTransformer
* Refactor AgentClassLoader
---
agent/core/pom.xml | 12 ++++------
.../agent/core/classloader/AgentClassLoader.java | 6 ++---
.../agent/core/classloader/ClassLoaderContext.java | 2 +-
.../core/plugin/PluginBootServiceManager.java | 6 ++---
.../plugin/loader/AdvisorConfigurationLoader.java | 26 ++++++++++------------
.../agent/core/transformer/AgentTransformer.java | 9 ++++----
.../transformer/builder/advise/AdviceFactory.java | 6 ++---
7 files changed, 31 insertions(+), 36 deletions(-)
diff --git a/agent/core/pom.xml b/agent/core/pom.xml
index 6487628585d..1bf64318a0c 100644
--- a/agent/core/pom.xml
+++ b/agent/core/pom.xml
@@ -93,6 +93,10 @@
</excludes>
</artifactSet>
<relocations>
+ <relocation>
+ <pattern>com.google</pattern>
+ <shadedPattern>${shade.package}.com.google</shadedPattern>
+ </relocation>
<relocation>
<pattern>net.bytebuddy</pattern>
<shadedPattern>${shade.package}.net.bytebuddy</shadedPattern>
@@ -101,14 +105,6 @@
<pattern>org.yaml</pattern>
<shadedPattern>${shade.package}.org.yaml</shadedPattern>
</relocation>
- <relocation>
- <pattern>com.google</pattern>
- <shadedPattern>${shade.package}.com.google</shadedPattern>
- </relocation>
- <relocation>
- <pattern>org.apache.commons</pattern>
- <shadedPattern>${shade.package}.org.apache.commons</shadedPattern>
- </relocation>
<relocation>
<pattern>org.slf4j</pattern>
<shadedPattern>${shade.package}.org.slf4j</shadedPattern>
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/AgentClassLoader.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/AgentClassLoader.java
index e3f370bbaa6..15792386ee5 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/AgentClassLoader.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/AgentClassLoader.java
@@ -44,8 +44,8 @@ public final class AgentClassLoader extends ClassLoader {
private final Collection<PluginJar> pluginJars;
- public AgentClassLoader(final ClassLoader classLoader, final Collection<PluginJar> pluginJars) {
- super(classLoader);
+ public AgentClassLoader(final ClassLoader appClassLoader, final Collection<PluginJar> pluginJars) {
+ super(appClassLoader);
this.pluginJars = pluginJars;
}
@@ -120,7 +120,7 @@ public final class AgentClassLoader extends ClassLoader {
try {
return Optional.of(new URL(String.format("jar:file:%s!/%s", pluginJar.getSourcePath().getAbsolutePath(), name)));
} catch (final MalformedURLException ignored) {
+ return Optional.empty();
}
- return Optional.empty();
}
}
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/ClassLoaderContext.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/ClassLoaderContext.java
index fb2d1a5efa4..491de60796b 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/ClassLoaderContext.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/ClassLoaderContext.java
@@ -29,11 +29,11 @@ import java.util.concurrent.ConcurrentHashMap;
* Class loader context.
*/
@RequiredArgsConstructor
-@Getter
public final class ClassLoaderContext {
private static final Map<ClassLoader, AgentClassLoader> AGENT_CLASS_LOADERS = new ConcurrentHashMap<>();
+ @Getter
private final ClassLoader appClassLoader;
private final Collection<PluginJar> pluginJars;
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginBootServiceManager.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginBootServiceManager.java
index dc6501d6fd9..bde5ea9a84f 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginBootServiceManager.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginBootServiceManager.java
@@ -41,13 +41,13 @@ public final class PluginBootServiceManager {
* Start all services.
*
* @param pluginConfigs plugin configuration map
- * @param classLoader class loader
+ * @param agentClassLoader agent class loader
* @param isEnhancedForProxy is enhanced for proxy
*/
- public static void startAllServices(final Map<String, PluginConfiguration> pluginConfigs, final ClassLoader classLoader, final boolean isEnhancedForProxy) {
+ public static void startAllServices(final Map<String, PluginConfiguration> pluginConfigs, final ClassLoader agentClassLoader, final boolean isEnhancedForProxy) {
ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
try {
- Thread.currentThread().setContextClassLoader(classLoader);
+ Thread.currentThread().setContextClassLoader(agentClassLoader);
for (Entry<String, PluginConfiguration> entry : pluginConfigs.entrySet()) {
PluginBootServiceRegistry.getRegisteredService(entry.getKey()).ifPresent(optional -> {
try {
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/loader/AdvisorConfigurationLoader.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/loader/AdvisorConfigurationLoader.java
index ed3a2836bdc..e47264f341f 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/loader/AdvisorConfigurationLoader.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/loader/AdvisorConfigurationLoader.java
@@ -17,16 +17,15 @@
package org.apache.shardingsphere.agent.core.plugin.loader;
-import com.google.common.collect.ImmutableMap;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.agent.core.classloader.AgentClassLoader;
import org.apache.shardingsphere.agent.core.logging.LoggerFactory;
import org.apache.shardingsphere.agent.core.logging.LoggerFactory.Logger;
import org.apache.shardingsphere.agent.core.plugin.PluginJar;
+import org.apache.shardingsphere.agent.core.plugin.advisor.AdvisorConfiguration;
import org.apache.shardingsphere.agent.core.plugin.yaml.loader.YamlAdvisorsConfigurationLoader;
import org.apache.shardingsphere.agent.core.plugin.yaml.swapper.YamlAdvisorsConfigurationSwapper;
-import org.apache.shardingsphere.agent.core.plugin.advisor.AdvisorConfiguration;
import java.io.InputStream;
import java.util.Collection;
@@ -51,26 +50,25 @@ public final class AdvisorConfigurationLoader {
*/
public static Map<String, AdvisorConfiguration> load(final Collection<PluginJar> pluginJars, final Collection<String> pluginTypes, final boolean isEnhancedForProxy) {
Map<String, AdvisorConfiguration> result = new HashMap<>();
- AgentClassLoader classLoader = new AgentClassLoader(AdvisorConfigurationLoader.class.getClassLoader(), pluginJars);
+ AgentClassLoader agentClassLoader = new AgentClassLoader(AdvisorConfigurationLoader.class.getClassLoader(), pluginJars);
for (String each : pluginTypes) {
- InputStream advisorsResourceStream = getAdvisorsResourceStream(classLoader, each, isEnhancedForProxy);
+ InputStream advisorsResourceStream = getAdvisorsResourceStream(agentClassLoader, each, isEnhancedForProxy);
if (null == advisorsResourceStream) {
- LOGGER.error("No configuration of advisor for type `{}`", each);
- continue;
+ LOGGER.info("No configuration of advisor for type `{}`.", each);
+ } else {
+ mergeAdvisorConfigurations(result, YamlAdvisorsConfigurationSwapper.swapToObject(YamlAdvisorsConfigurationLoader.load(advisorsResourceStream), each));
}
- Collection<AdvisorConfiguration> advisorConfigs = YamlAdvisorsConfigurationSwapper.swapToObject(YamlAdvisorsConfigurationLoader.load(advisorsResourceStream), each);
- mergeAdvisorConfigurations(result, advisorConfigs);
}
- return ImmutableMap.<String, AdvisorConfiguration>builder().putAll(result).build();
+ return result;
}
- private static InputStream getAdvisorsResourceStream(final ClassLoader classLoader, final String type, final boolean isEnhancedForProxy) {
- InputStream result = classLoader.getResourceAsStream(getAdvisorsResourceFile(type, (isEnhancedForProxy ? "proxy" : "jdbc") + "-advisors.yaml"));
- return null == result ? classLoader.getResourceAsStream(getAdvisorsResourceFile(type, "advisors.yaml")) : result;
+ private static InputStream getAdvisorsResourceStream(final ClassLoader agentClassLoader, final String pluginType, final boolean isEnhancedForProxy) {
+ InputStream accurateResourceStream = getAdvisorsResourceStream(agentClassLoader, pluginType, (isEnhancedForProxy ? "proxy" : "jdbc") + "-advisors.yaml");
+ return null == accurateResourceStream ? getAdvisorsResourceStream(agentClassLoader, pluginType, "advisors.yaml") : accurateResourceStream;
}
- private static String getAdvisorsResourceFile(final String type, final String fileName) {
- return String.join("/", type.toLowerCase(), fileName);
+ private static InputStream getAdvisorsResourceStream(final ClassLoader agentClassLoader, final String pluginType, final String fileName) {
+ return agentClassLoader.getResourceAsStream(String.join("/", pluginType.toLowerCase(), fileName));
}
private static void mergeAdvisorConfigurations(final Map<String, AdvisorConfiguration> advisorConfigMap, final Collection<AdvisorConfiguration> advisorConfigs) {
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/AgentTransformer.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/AgentTransformer.java
index 17ab5c99cb5..5b0e42f7aa8 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/AgentTransformer.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/AgentTransformer.java
@@ -63,13 +63,14 @@ public final class AgentTransformer implements Transformer {
}
ClassLoaderContext classLoaderContext = new ClassLoaderContext(classLoader, pluginJars);
startAllServices(classLoaderContext.getAgentClassLoader());
- return new MethodAdvisorBuilder(new AdviceFactory(classLoaderContext), advisorConfigs.get(typeDescription.getTypeName()), typeDescription)
- .build(builder.defineField(EXTRA_DATA, Object.class, Opcodes.ACC_PRIVATE | Opcodes.ACC_VOLATILE).implement(TargetAdviceObject.class).intercept(FieldAccessor.ofField(EXTRA_DATA)));
+ Builder<?> targetAdviceObjectBuilder = builder.defineField(EXTRA_DATA,
+ Object.class, Opcodes.ACC_PRIVATE | Opcodes.ACC_VOLATILE).implement(TargetAdviceObject.class).intercept(FieldAccessor.ofField(EXTRA_DATA));
+ return new MethodAdvisorBuilder(new AdviceFactory(classLoaderContext), advisorConfigs.get(typeDescription.getTypeName()), typeDescription).build(targetAdviceObjectBuilder);
}
- private void startAllServices(final ClassLoader classLoader) {
+ private void startAllServices(final ClassLoader agentClassLoader) {
if (STARTED_FLAG.compareAndSet(false, true)) {
- PluginBootServiceManager.startAllServices(pluginConfigs, classLoader, isEnhancedForProxy);
+ PluginBootServiceManager.startAllServices(pluginConfigs, agentClassLoader, isEnhancedForProxy);
Runtime.getRuntime().addShutdownHook(new Thread(() -> PluginBootServiceManager.closeAllServices(pluginJars)));
}
}
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/AdviceFactory.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/AdviceFactory.java
index 8ec861f8368..8156ff74ecb 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/AdviceFactory.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/AdviceFactory.java
@@ -42,9 +42,9 @@ public final class AdviceFactory {
* @return got advance
*/
public AgentAdvice getAdvice(final String adviceClassName) {
- String adviceInstanceCacheKey = String.format("%s_%s@%s", adviceClassName, classLoaderContext.getAppClassLoader().getClass().getName(),
- Integer.toHexString(classLoaderContext.getAppClassLoader().hashCode()));
- return CACHED_ADVICES.computeIfAbsent(adviceInstanceCacheKey, key -> createAdvice(adviceClassName));
+ ClassLoader appClassLoader = classLoaderContext.getAppClassLoader();
+ String cacheKey = String.format("%s_%s@%s", adviceClassName, appClassLoader.getClass().getName(), Integer.toHexString(appClassLoader.hashCode()));
+ return CACHED_ADVICES.computeIfAbsent(cacheKey, key -> createAdvice(adviceClassName));
}
@SneakyThrows(ReflectiveOperationException.class)