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