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();
}