You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by xi...@apache.org on 2020/12/08 06:20:57 UTC

[shardingsphere] branch master updated: Enhancement plugin class loader (#8526)

This is an automated email from the ASF dual-hosted git repository.

xiaoyu 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 4c8c4ee  Enhancement plugin class loader (#8526)
4c8c4ee is described below

commit 4c8c4eed709e93e7cd4ca064065149e086d64cd8
Author: Daming <zt...@foxmail.com>
AuthorDate: Tue Dec 8 14:20:34 2020 +0800

    Enhancement plugin class loader (#8526)
    
    * Enhancement plugin class loader
    
    * Update AgentPluginLoader.java
---
 shardingsphere-agent/pom.xml                       | 14 +++++++
 .../shardingsphere-agent-bootstrap/pom.xml         | 13 ------
 .../agent/bootstrap/ShardingSphereAgent.java       |  3 +-
 .../shardingsphere-agent-core/pom.xml              | 11 ------
 .../agent/core/ShardingSphereTransformer.java      | 16 ++++----
 .../agent/core/plugin/AgentPluginLoader.java       | 46 +++++++++++++++++-----
 .../shardingsphere-agent-plugins/pom.xml           |  1 -
 .../agent/plugin/trace/SamplePluginDefinition.java |  4 +-
 8 files changed, 62 insertions(+), 46 deletions(-)

diff --git a/shardingsphere-agent/pom.xml b/shardingsphere-agent/pom.xml
index 64a9d8e..e500aa6 100644
--- a/shardingsphere-agent/pom.xml
+++ b/shardingsphere-agent/pom.xml
@@ -39,4 +39,18 @@
         <module>shardingsphere-agent-plugins</module>
         <module>shardingsphere-agent-distribution</module>
     </modules>
+
+    <dependencies>
+        <dependency>
+            <groupId>net.bytebuddy</groupId>
+            <artifactId>byte-buddy</artifactId>
+            <version>${bytebuddy.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>net.bytebuddy</groupId>
+            <artifactId>byte-buddy-agent</artifactId>
+            <version>${bytebuddy.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
 </project>
diff --git a/shardingsphere-agent/shardingsphere-agent-bootstrap/pom.xml b/shardingsphere-agent/shardingsphere-agent-bootstrap/pom.xml
index da6de01..38abe06 100644
--- a/shardingsphere-agent/shardingsphere-agent-bootstrap/pom.xml
+++ b/shardingsphere-agent/shardingsphere-agent-bootstrap/pom.xml
@@ -40,18 +40,6 @@
             <artifactId>shardingsphere-agent-core</artifactId>
             <version>${project.version}</version>
         </dependency>
-
-        <dependency>
-            <groupId>net.bytebuddy</groupId>
-            <artifactId>byte-buddy</artifactId>
-            <version>${bytebuddy.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>net.bytebuddy</groupId>
-            <artifactId>byte-buddy-agent</artifactId>
-            <version>${bytebuddy.version}</version>
-            <scope>test</scope>
-        </dependency>
     </dependencies>
 
     <build>
@@ -81,7 +69,6 @@
                             </transformers>
                             <artifactSet>
                                 <excludes>
-                                    <exclude>net.bytebuddy:byte-buddy:jar:</exclude>
                                     <exclude>com.google.*:*</exclude>
                                     <exclude>com.google.guava:guava:*</exclude>
                                     <exclude>org.checkerframework:checker-qual:*</exclude>
diff --git a/shardingsphere-agent/shardingsphere-agent-bootstrap/src/main/java/org/apache/shardingsphere/agent/bootstrap/ShardingSphereAgent.java b/shardingsphere-agent/shardingsphere-agent-bootstrap/src/main/java/org/apache/shardingsphere/agent/bootstrap/ShardingSphereAgent.java
index 767cb0d..89f0934 100644
--- a/shardingsphere-agent/shardingsphere-agent-bootstrap/src/main/java/org/apache/shardingsphere/agent/bootstrap/ShardingSphereAgent.java
+++ b/shardingsphere-agent/shardingsphere-agent-bootstrap/src/main/java/org/apache/shardingsphere/agent/bootstrap/ShardingSphereAgent.java
@@ -51,8 +51,7 @@ public class ShardingSphereAgent {
         AgentBuilder builder = new AgentBuilder.Default()
             .with(byteBuddy)
             .ignore(ElementMatchers.isSynthetic())
-            .or(ElementMatchers.nameStartsWith("org.apache.shardingsphere.agent."))
-            .or(ElementMatchers.not(ElementMatchers.nameStartsWith("org.apache.shardingsphere.")));
+            .or(ElementMatchers.nameStartsWith("org.apache.shardingsphere.agent."));
         AgentPluginLoader agentPluginLoader = AgentPluginLoader.getInstance();
         agentPluginLoader.initialAllServices();
         builder.type(agentPluginLoader.typeMatcher())
diff --git a/shardingsphere-agent/shardingsphere-agent-core/pom.xml b/shardingsphere-agent/shardingsphere-agent-core/pom.xml
index 7b32311..38280b2 100644
--- a/shardingsphere-agent/shardingsphere-agent-core/pom.xml
+++ b/shardingsphere-agent/shardingsphere-agent-core/pom.xml
@@ -33,17 +33,6 @@
             <groupId>org.yaml</groupId>
             <artifactId>snakeyaml</artifactId>
         </dependency>
-        <dependency>
-            <groupId>net.bytebuddy</groupId>
-            <artifactId>byte-buddy</artifactId>
-            <version>${bytebuddy.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>net.bytebuddy</groupId>
-            <artifactId>byte-buddy-agent</artifactId>
-            <version>${bytebuddy.version}</version>
-            <scope>test</scope>
-        </dependency>
     </dependencies>
 
     <build>
diff --git a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/ShardingSphereTransformer.java b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/ShardingSphereTransformer.java
index 890a32d..2b41785 100644
--- a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/ShardingSphereTransformer.java
+++ b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/ShardingSphereTransformer.java
@@ -27,8 +27,8 @@ import net.bytebuddy.implementation.MethodDelegation;
 import net.bytebuddy.implementation.SuperMethodCall;
 import net.bytebuddy.jar.asm.Opcodes;
 import net.bytebuddy.utility.JavaModule;
-import org.apache.shardingsphere.agent.core.plugin.PluginAdviceDefinition;
 import org.apache.shardingsphere.agent.core.plugin.AgentPluginLoader;
+import org.apache.shardingsphere.agent.core.plugin.PluginAdviceDefinition;
 import org.apache.shardingsphere.agent.core.plugin.advice.ConstructorMethodInterceptor;
 import org.apache.shardingsphere.agent.core.plugin.advice.MethodAroundInterceptor;
 import org.apache.shardingsphere.agent.core.plugin.advice.StaticMethodAroundInterceptor;
@@ -37,14 +37,14 @@ import org.apache.shardingsphere.agent.core.plugin.point.ClassStaticMethodPoint;
 import org.apache.shardingsphere.agent.core.plugin.point.ConstructorPoint;
 import org.apache.shardingsphere.agent.core.plugin.point.InstanceMethodPoint;
 
-import java.util.Map;
-
 /**
- *  Shardingsphere transformer.
+ * Shardingsphere transformer.
  */
 @Slf4j
 public class ShardingSphereTransformer implements AgentBuilder.Transformer {
     
+    private static final String SS_EXTRA_DATA = "_$EXTRA_DATA$_";
+    
     private final AgentPluginLoader agentPluginLoader;
     
     public ShardingSphereTransformer(final AgentPluginLoader agentPluginLoader) {
@@ -54,15 +54,15 @@ public class ShardingSphereTransformer implements AgentBuilder.Transformer {
     @Override
     public DynamicType.Builder<?> transform(final DynamicType.Builder<?> builder, final TypeDescription typeDescription, final ClassLoader classLoader, final JavaModule module) {
         if (agentPluginLoader.containsType(typeDescription)) {
-            DynamicType.Builder<?> newBuilder = builder.defineField("_SSExtraData_", Map.class, Opcodes.ACC_PRIVATE | Opcodes.ACC_VOLATILE)
+            DynamicType.Builder<?> newBuilder = builder;
+            newBuilder = newBuilder.defineField(SS_EXTRA_DATA, Object.class, Opcodes.ACC_PRIVATE | Opcodes.ACC_VOLATILE)
                     .implement(TargetObject.class)
-                    .intercept(FieldAccessor.ofField("_SSExtraData_"));
+                    .intercept(FieldAccessor.ofField(SS_EXTRA_DATA));
             final PluginAdviceDefinition define = agentPluginLoader.loadPluginAdviceDefine(typeDescription);
             for (ConstructorPoint point : define.getConstructorPoints()) {
                 try {
                     final ConstructorMethodInterceptor interceptor = new ConstructorMethodInterceptor(agentPluginLoader.getOrCreateInstance(point.getAdvice()));
-                    newBuilder = newBuilder.constructor(point.getConstructorMatcher())
-                            .intercept(SuperMethodCall.INSTANCE.andThen(MethodDelegation.withDefaultConfiguration().to(interceptor)));
+                    newBuilder = newBuilder.constructor(point.getConstructorMatcher()).intercept(SuperMethodCall.INSTANCE.andThen(MethodDelegation.withDefaultConfiguration().to(interceptor)));
                     // CHECKSTYLE:OFF
                 } catch (Exception e) {
                     // CHECKSTYLE:ON
diff --git a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/AgentPluginLoader.java b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/AgentPluginLoader.java
index eeb35e5..9f47a9a 100644
--- a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/AgentPluginLoader.java
+++ b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/AgentPluginLoader.java
@@ -21,14 +21,13 @@ package org.apache.shardingsphere.agent.core.plugin;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.common.io.ByteStreams;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import net.bytebuddy.description.type.TypeDescription;
 import net.bytebuddy.matcher.ElementMatcher;
-import net.bytebuddy.matcher.ElementMatchers;
-
 import org.apache.shardingsphere.agent.core.common.AgentPathBuilder;
 import org.apache.shardingsphere.agent.core.config.AgentConfiguration;
 import org.apache.shardingsphere.agent.core.utils.SingletonHolder;
@@ -37,10 +36,10 @@ import java.io.ByteArrayOutputStream;
 import java.io.Closeable;
 import java.io.File;
 import java.io.IOException;
-import java.util.Set;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.jar.Attributes;
@@ -52,6 +51,9 @@ import java.util.zip.ZipEntry;
  */
 @Slf4j
 public final class AgentPluginLoader extends ClassLoader implements Closeable {
+    static {
+        registerAsParallelCapable();
+    }
     
     private static final AgentPluginLoader INSTANCE = new AgentPluginLoader();
     
@@ -112,9 +114,9 @@ public final class AgentPluginLoader extends ClassLoader implements Closeable {
     
     private Map<String, PluginAdviceDefinition> loadAllPlugins() throws IOException {
         File[] jarFiles = AgentPathBuilder.getPluginPath().listFiles(file -> file.getName().endsWith(".jar"));
-        ImmutableMap.Builder<String, PluginAdviceDefinition> pluginDefineMap = ImmutableMap.builder();
+        Map<String, PluginAdviceDefinition> pluginDefineMap = Maps.newHashMap();
         if (jarFiles == null) {
-            return pluginDefineMap.build();
+            return pluginDefineMap;
         }
         AgentConfiguration configuration = SingletonHolder.INSTANCE.get(AgentConfiguration.class);
         List<String> activatedLists = configuration.getActivatedPlugins();
@@ -132,6 +134,7 @@ public final class AgentPluginLoader extends ClassLoader implements Closeable {
                 log.warn("Entrypoint is not setting in {}.", jarFile.getName());
                 continue;
             }
+            jars.add(jar);
             ByteStreams.copy(jar.getInputStream(jar.getEntry(classNameToPath(entrypoint))), outputStream);
             try {
                 PluginDefinition pluginDefinition = (PluginDefinition) defineClass(entrypoint, outputStream.toByteArray(), 0, outputStream.size()).newInstance();
@@ -145,13 +148,22 @@ public final class AgentPluginLoader extends ClassLoader implements Closeable {
                         log.error("Failed to create service instance, {}.", klass.getTypeName(), e);
                     }
                 });
-                pluginDefinition.build().forEach(plugin -> pluginDefineMap.put(plugin.getClassNameOfTarget(), plugin));
+                pluginDefinition.build().forEach(plugin -> {
+                    String target = plugin.getClassNameOfTarget();
+                    if (pluginDefineMap.containsKey(target)) {
+                        PluginAdviceDefinition definition = pluginDefineMap.get(target);
+                        definition.getConstructorPoints().addAll(plugin.getConstructorPoints());
+                        definition.getInstanceMethodPoints().addAll(plugin.getInstanceMethodPoints());
+                        definition.getClassStaticMethodPoints().addAll(plugin.getClassStaticMethodPoints());
+                    } else {
+                        pluginDefineMap.put(target, plugin);
+                    }
+                });
             } catch (InstantiationException | IllegalAccessException e) {
                 log.error("Failed to load plugin definition, {}.", entrypoint, e);
             }
-            jars.add(jar);
         }
-        return pluginDefineMap.build();
+        return ImmutableMap.<String, PluginAdviceDefinition>builder().putAll(pluginDefineMap).build();
     }
     
     private String classNameToPath(final String className) {
@@ -164,7 +176,23 @@ public final class AgentPluginLoader extends ClassLoader implements Closeable {
      * @return type matcher
      */
     public ElementMatcher<? super TypeDescription> typeMatcher() {
-        return ElementMatchers.anyOf(pluginDefineMap.keySet().stream().map(ElementMatchers::named).toArray());
+        return new ElementMatcher.Junction<TypeDescription>() {
+            
+            @Override
+            public boolean matches(final TypeDescription target) {
+                return pluginDefineMap.containsKey(target.getTypeName());
+            }
+            
+            @Override
+            public <U extends TypeDescription> Junction<U> and(final ElementMatcher<? super U> other) {
+                return null;
+            }
+            
+            @Override
+            public <U extends TypeDescription> Junction<U> or(final ElementMatcher<? super U> other) {
+                return null;
+            }
+        };
     }
     
     /**
diff --git a/shardingsphere-agent/shardingsphere-agent-plugins/pom.xml b/shardingsphere-agent/shardingsphere-agent-plugins/pom.xml
index ae62913..74ba9ac 100644
--- a/shardingsphere-agent/shardingsphere-agent-plugins/pom.xml
+++ b/shardingsphere-agent/shardingsphere-agent-plugins/pom.xml
@@ -44,7 +44,6 @@
         </dependencies>
     </dependencyManagement>
 
-
     <build>
         <finalName>${project.artifactId}-${project.version}.jar</finalName>
         <plugins>
diff --git a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracers/shardingsphere-agent-tracer-sample/src/main/java/org/apache/shardingsphere/agent/plugin/trace/SamplePluginDefinition.java b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracers/shardingsphere-agent-tracer-sample/src/main/java/org/apache/shardingsphere/agent/plugin/trace/SamplePluginDefinition.java
index 6166284..96bf11a 100644
--- a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracers/shardingsphere-agent-tracer-sample/src/main/java/org/apache/shardingsphere/agent/plugin/trace/SamplePluginDefinition.java
+++ b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracers/shardingsphere-agent-tracer-sample/src/main/java/org/apache/shardingsphere/agent/plugin/trace/SamplePluginDefinition.java
@@ -32,8 +32,8 @@ public class SamplePluginDefinition extends PluginDefinition {
 
     @Override
     protected void define() {
-        intercept("org.Test")
-                .aroundInstanceMethod(ElementMatchers.named("run"))
+        intercept("org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask")
+                .aroundInstanceMethod(ElementMatchers.named("executeCommand"))
                 .implement("org.apache.shardingsphere.agent.plugin.trace.SampleAdvice")
                 .build();
     }