You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2023/04/01 03:33:07 UTC
[shardingsphere] branch master updated: Optimize agent core module (#24933)
This is an automated email from the ASF dual-hosted git repository.
panjuan 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 99c47a35b3f Optimize agent core module (#24933)
99c47a35b3f is described below
commit 99c47a35b3fa510257988cb5f4b4e2c5a9b4bb4d
Author: jiangML <10...@qq.com>
AuthorDate: Sat Apr 1 11:32:51 2023 +0800
Optimize agent core module (#24933)
---
.../advisor/executor/AdviceExecutorFactory.java | 5 +-
.../agent/core/advisor/executor/AdviceFactory.java | 2 +-
.../agent/core/builder/AgentTransformer.java | 8 +-
.../impl/MethodAdvisorBuilderInterceptor.java | 2 +-
.../core/classloader/AgentExtraClassLoader.java | 151 ---------------------
.../plugin/classloader/AgentPluginClassLoader.java | 100 +++++++++++++-
.../classloader/ClassLoaderContext.java | 7 +-
7 files changed, 109 insertions(+), 166 deletions(-)
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/AdviceExecutorFactory.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/AdviceExecutorFactory.java
index 237fcd6fd47..6b5f93aaa67 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/AdviceExecutorFactory.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/AdviceExecutorFactory.java
@@ -24,7 +24,7 @@ import org.apache.shardingsphere.agent.core.advisor.config.MethodAdvisorConfigur
import org.apache.shardingsphere.agent.core.advisor.executor.type.ConstructorAdviceExecutor;
import org.apache.shardingsphere.agent.core.advisor.executor.type.InstanceMethodAdviceExecutor;
import org.apache.shardingsphere.agent.core.advisor.executor.type.StaticMethodAdviceExecutor;
-import org.apache.shardingsphere.agent.core.classloader.ClassLoaderContext;
+import org.apache.shardingsphere.agent.core.plugin.classloader.ClassLoaderContext;
import java.util.Collection;
import java.util.HashMap;
@@ -61,6 +61,9 @@ public final class AdviceExecutorFactory {
advices.get(each.getPluginType()).add(adviceFactory.getAdvice(each.getAdviceClassName()));
}
}
+ if (advices.isEmpty()) {
+ return Optional.empty();
+ }
if (isConstructor(methodDescription)) {
return Optional.of(new ConstructorAdviceExecutor(convert(advices)));
}
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/AdviceFactory.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/AdviceFactory.java
index d3803897c13..2e3ef7e1817 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/AdviceFactory.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/AdviceFactory.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.agent.core.advisor.executor;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.apache.shardingsphere.agent.api.advice.AgentAdvice;
-import org.apache.shardingsphere.agent.core.classloader.ClassLoaderContext;
+import org.apache.shardingsphere.agent.core.plugin.classloader.ClassLoaderContext;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/AgentTransformer.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/AgentTransformer.java
index 2b932b45ac3..c9932e2c4e4 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/AgentTransformer.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/AgentTransformer.java
@@ -31,11 +31,11 @@ import org.apache.shardingsphere.agent.core.advisor.config.MethodAdvisorConfigur
import org.apache.shardingsphere.agent.core.builder.interceptor.AgentBuilderInterceptChainEngine;
import org.apache.shardingsphere.agent.core.builder.interceptor.impl.MethodAdvisorBuilderInterceptor;
import org.apache.shardingsphere.agent.core.builder.interceptor.impl.TargetAdviceObjectBuilderInterceptor;
-import org.apache.shardingsphere.agent.core.classloader.AgentExtraClassLoader;
-import org.apache.shardingsphere.agent.core.classloader.ClassLoaderContext;
import org.apache.shardingsphere.agent.core.log.AgentLogger;
import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory;
import org.apache.shardingsphere.agent.core.plugin.PluginLifecycleServiceManager;
+import org.apache.shardingsphere.agent.core.plugin.classloader.AgentPluginClassLoader;
+import org.apache.shardingsphere.agent.core.plugin.classloader.ClassLoaderContext;
import java.util.Collection;
import java.util.Map;
@@ -50,7 +50,7 @@ public final class AgentTransformer implements Transformer {
private static final AgentLogger LOGGER = AgentLoggerFactory.getAgentLogger(AdvisorConfigurationLoader.class);
- private static final Map<AgentExtraClassLoader, TypePool> TYPE_POOL_MAP = new ConcurrentHashMap<>();
+ private static final Map<AgentPluginClassLoader, TypePool> TYPE_POOL_MAP = new ConcurrentHashMap<>();
private final Map<String, PluginConfiguration> pluginConfigs;
@@ -84,7 +84,7 @@ public final class AgentTransformer implements Transformer {
return result;
}
- private boolean isExist(final String adviceClassName, final AgentExtraClassLoader pluginClassLoader) {
+ private boolean isExist(final String adviceClassName, final AgentPluginClassLoader pluginClassLoader) {
TypePool typePool = TYPE_POOL_MAP.get(pluginClassLoader);
return null == typePool ? TYPE_POOL_MAP.computeIfAbsent(pluginClassLoader, Default::of).describe(adviceClassName).isResolved() : typePool.describe(adviceClassName).isResolved();
}
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/interceptor/impl/MethodAdvisorBuilderInterceptor.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/interceptor/impl/MethodAdvisorBuilderInterceptor.java
index 9a9bc31806d..c9f1d5b5e16 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/interceptor/impl/MethodAdvisorBuilderInterceptor.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/interceptor/impl/MethodAdvisorBuilderInterceptor.java
@@ -24,7 +24,7 @@ import org.apache.shardingsphere.agent.core.advisor.config.AdvisorConfiguration;
import org.apache.shardingsphere.agent.core.advisor.executor.AdviceExecutor;
import org.apache.shardingsphere.agent.core.advisor.executor.AdviceExecutorFactory;
import org.apache.shardingsphere.agent.core.builder.interceptor.AgentBuilderInterceptor;
-import org.apache.shardingsphere.agent.core.classloader.ClassLoaderContext;
+import org.apache.shardingsphere.agent.core.plugin.classloader.ClassLoaderContext;
import org.apache.shardingsphere.agent.core.log.AgentLogger;
import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory;
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/AgentExtraClassLoader.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/AgentExtraClassLoader.java
deleted file mode 100644
index 1ee11e03dd1..00000000000
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/AgentExtraClassLoader.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * 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.core.classloader;
-
-import com.google.common.io.ByteStreams;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.LinkedList;
-import java.util.Optional;
-import java.util.jar.Attributes;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-import java.util.jar.Manifest;
-import java.util.stream.Collectors;
-import java.util.zip.ZipEntry;
-
-/**
- * Agent extra class loader.
- */
-public abstract class AgentExtraClassLoader extends ClassLoader {
-
- static {
- registerAsParallelCapable();
- }
-
- private final Collection<JarFile> extraJars;
-
- private final Collection<File> extraResourcePaths;
-
- public AgentExtraClassLoader(final ClassLoader appClassLoader, final Collection<JarFile> extraJars) {
- this(appClassLoader, extraJars, Collections.emptyList());
- }
-
- public AgentExtraClassLoader(final ClassLoader appClassLoader, final Collection<JarFile> extraJars, final Collection<File> extraResourcePaths) {
- super(appClassLoader);
- this.extraJars = extraJars;
- this.extraResourcePaths = extraResourcePaths;
- }
-
- @Override
- protected Class<?> findClass(final String name) throws ClassNotFoundException {
- String path = convertClassNameToPath(name);
- for (JarFile each : extraJars) {
- ZipEntry entry = each.getEntry(path);
- if (null == entry) {
- continue;
- }
- try {
- definePackage(name, each);
- return defineClass(name, each, entry);
- } catch (final IOException ex) {
- throw new ClassNotFoundException(name, ex);
- }
- }
- throw new ClassNotFoundException(name);
- }
-
- private String convertClassNameToPath(final String className) {
- return String.join("", className.replace(".", "/"), ".class");
- }
-
- private void definePackage(final String className, final JarFile extraJar) throws IOException {
- int index = className.lastIndexOf('.');
- if (-1 == index) {
- return;
- }
- String packageName = className.substring(0, index);
- if (null == getPackage(packageName)) {
- definePackage(packageName, extraJar.getManifest());
- }
- }
-
- private void definePackage(final String name, final Manifest manifest) {
- Attributes attributes = manifest.getMainAttributes();
- String specTitle = attributes.getValue(Attributes.Name.SPECIFICATION_TITLE);
- String specVersion = attributes.getValue(Attributes.Name.SPECIFICATION_VERSION);
- String specVendor = attributes.getValue(Attributes.Name.SPECIFICATION_VENDOR);
- String implTitle = attributes.getValue(Attributes.Name.IMPLEMENTATION_TITLE);
- String implVersion = attributes.getValue(Attributes.Name.IMPLEMENTATION_VERSION);
- String implVendor = attributes.getValue(Attributes.Name.IMPLEMENTATION_VENDOR);
- definePackage(name, specTitle, specVersion, specVendor, implTitle, implVersion, implVendor, null);
- }
-
- private Class<?> defineClass(final String name, final JarFile extraJar, final ZipEntry entry) throws IOException {
- byte[] data = ByteStreams.toByteArray(extraJar.getInputStream(entry));
- return defineClass(name, data, 0, data.length);
- }
-
- @Override
- protected Enumeration<URL> findResources(final String name) {
- Collection<URL> result = new LinkedList<>();
- for (JarFile each : extraJars) {
- findResource(name, each).ifPresent(result::add);
- }
- if (result.isEmpty()) {
- result.addAll(findResourcesFromResourcePaths(name));
- }
- return Collections.enumeration(result);
- }
-
- @Override
- protected URL findResource(final String name) {
- return extraJars.stream().map(each -> findResource(name, each)).filter(Optional::isPresent).findFirst().filter(Optional::isPresent).map(Optional::get)
- .orElseGet(() -> findResourcesFromResourcePaths(name).stream().findFirst().orElse(null));
- }
-
- private Optional<URL> findResource(final String name, final JarFile extraJar) {
- JarEntry entry = extraJar.getJarEntry(name);
- if (null == entry) {
- return Optional.empty();
- }
- try {
- return Optional.of(new URL(String.format("jar:file:%s!/%s", extraJar.getName(), name)));
- } catch (final MalformedURLException ignored) {
- return Optional.empty();
- }
- }
-
- private Collection<URL> findResourcesFromResourcePaths(final String name) {
- Collection<URL> result = new LinkedList<>();
- Collection<File> resourceFiles = extraResourcePaths.stream().map(each -> new File(String.join(File.separator, each.getPath(), name))).filter(File::exists).collect(Collectors.toList());
- for (File each : resourceFiles) {
- try {
- result.add(each.toURI().toURL());
- } catch (final MalformedURLException ignored) {
- }
- }
- return result;
- }
-}
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/classloader/AgentPluginClassLoader.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/classloader/AgentPluginClassLoader.java
index d097bd28111..58c9ea2a54a 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/classloader/AgentPluginClassLoader.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/classloader/AgentPluginClassLoader.java
@@ -17,18 +17,110 @@
package org.apache.shardingsphere.agent.core.plugin.classloader;
-import org.apache.shardingsphere.agent.core.classloader.AgentExtraClassLoader;
+import com.google.common.io.ByteStreams;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
import java.util.Collection;
import java.util.Collections;
+import java.util.Enumeration;
+import java.util.LinkedList;
+import java.util.Optional;
+import java.util.jar.Attributes;
+import java.util.jar.JarEntry;
import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import java.util.zip.ZipEntry;
/**
* Agent plugin class loader.
*/
-public final class AgentPluginClassLoader extends AgentExtraClassLoader {
+public final class AgentPluginClassLoader extends ClassLoader {
- public AgentPluginClassLoader(final ClassLoader classLoader, final Collection<JarFile> pluginJars) {
- super(classLoader, pluginJars, Collections.emptyList());
+ static {
+ registerAsParallelCapable();
+ }
+
+ private final Collection<JarFile> extraJars;
+
+ public AgentPluginClassLoader(final ClassLoader appClassLoader, final Collection<JarFile> extraJars) {
+ super(appClassLoader);
+ this.extraJars = extraJars;
+ }
+
+ @Override
+ protected Class<?> findClass(final String name) throws ClassNotFoundException {
+ String path = convertClassNameToPath(name);
+ for (JarFile each : extraJars) {
+ ZipEntry entry = each.getEntry(path);
+ if (null == entry) {
+ continue;
+ }
+ try {
+ definePackage(name, each);
+ return defineClass(name, each, entry);
+ } catch (final IOException ex) {
+ throw new ClassNotFoundException(name, ex);
+ }
+ }
+ throw new ClassNotFoundException(name);
+ }
+
+ private String convertClassNameToPath(final String className) {
+ return String.join("", className.replace(".", "/"), ".class");
+ }
+
+ private void definePackage(final String className, final JarFile extraJar) throws IOException {
+ int index = className.lastIndexOf('.');
+ if (-1 == index) {
+ return;
+ }
+ String packageName = className.substring(0, index);
+ if (null == getPackage(packageName)) {
+ definePackage(packageName, extraJar.getManifest());
+ }
+ }
+
+ private void definePackage(final String name, final Manifest manifest) {
+ Attributes attributes = manifest.getMainAttributes();
+ String specTitle = attributes.getValue(Attributes.Name.SPECIFICATION_TITLE);
+ String specVersion = attributes.getValue(Attributes.Name.SPECIFICATION_VERSION);
+ String specVendor = attributes.getValue(Attributes.Name.SPECIFICATION_VENDOR);
+ String implTitle = attributes.getValue(Attributes.Name.IMPLEMENTATION_TITLE);
+ String implVersion = attributes.getValue(Attributes.Name.IMPLEMENTATION_VERSION);
+ String implVendor = attributes.getValue(Attributes.Name.IMPLEMENTATION_VENDOR);
+ definePackage(name, specTitle, specVersion, specVendor, implTitle, implVersion, implVendor, null);
+ }
+
+ private Class<?> defineClass(final String name, final JarFile extraJar, final ZipEntry entry) throws IOException {
+ byte[] data = ByteStreams.toByteArray(extraJar.getInputStream(entry));
+ return defineClass(name, data, 0, data.length);
+ }
+
+ @Override
+ protected Enumeration<URL> findResources(final String name) {
+ Collection<URL> result = new LinkedList<>();
+ for (JarFile each : extraJars) {
+ findResource(name, each).ifPresent(result::add);
+ }
+ return Collections.enumeration(result);
+ }
+
+ @Override
+ protected URL findResource(final String name) {
+ return extraJars.stream().map(each -> findResource(name, each)).filter(Optional::isPresent).findFirst().filter(Optional::isPresent).map(Optional::get).orElse(null);
+ }
+
+ private Optional<URL> findResource(final String name, final JarFile extraJar) {
+ JarEntry entry = extraJar.getJarEntry(name);
+ if (null == entry) {
+ return Optional.empty();
+ }
+ try {
+ return Optional.of(new URL(String.format("jar:file:%s!/%s", extraJar.getName(), name)));
+ } catch (final MalformedURLException ignored) {
+ 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/plugin/classloader/ClassLoaderContext.java
similarity index 81%
rename from agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/ClassLoaderContext.java
rename to agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/classloader/ClassLoaderContext.java
index 3cd6552ca21..7ae8f7cd421 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/plugin/classloader/ClassLoaderContext.java
@@ -15,11 +15,10 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.agent.core.classloader;
+package org.apache.shardingsphere.agent.core.plugin.classloader;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.agent.core.plugin.classloader.AgentPluginClassLoader;
import java.util.Collection;
import java.util.Map;
@@ -32,7 +31,7 @@ import java.util.jar.JarFile;
@RequiredArgsConstructor
public final class ClassLoaderContext {
- private static final Map<ClassLoader, AgentExtraClassLoader> AGENT_CLASS_LOADERS = new ConcurrentHashMap<>();
+ private static final Map<ClassLoader, AgentPluginClassLoader> AGENT_CLASS_LOADERS = new ConcurrentHashMap<>();
@Getter
private final ClassLoader appClassLoader;
@@ -44,7 +43,7 @@ public final class ClassLoaderContext {
*
* @return plugin class loader
*/
- public AgentExtraClassLoader getPluginClassLoader() {
+ public AgentPluginClassLoader getPluginClassLoader() {
return AGENT_CLASS_LOADERS.computeIfAbsent(appClassLoader, key -> new AgentPluginClassLoader(key, pluginJars));
}
}