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)