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 2022/12/17 04:48:23 UTC

[shardingsphere] branch master updated: Remove PluginJarHolder (#22930)

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 18ebdd85cef Remove PluginJarHolder (#22930)
18ebdd85cef is described below

commit 18ebdd85cef0f5f437ac79af584c6edfcd406510
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Sat Dec 17 12:48:09 2022 +0800

    Remove PluginJarHolder (#22930)
---
 .../agent/bootstrap/ShardingSphereAgent.java       | 19 ++++----
 .../core/plugin/PluginBootServiceManager.java      |  7 ++-
 .../agent/core/plugin/PluginJarHolder.java         | 51 ----------------------
 .../core/plugin/loader/AgentPluginLoader.java      |  4 +-
 .../agent/core/transformer/AgentTransformer.java   |  8 +++-
 .../transformer/build/advise/AdviceFactory.java    |  6 ++-
 .../build/advise/JDBCAdviceFactory.java            |  9 ++--
 .../core/transformer/AgentTransformerTest.java     |  2 +-
 8 files changed, 34 insertions(+), 72 deletions(-)

diff --git a/agent/bootstrap/src/main/java/org/apache/shardingsphere/agent/bootstrap/ShardingSphereAgent.java b/agent/bootstrap/src/main/java/org/apache/shardingsphere/agent/bootstrap/ShardingSphereAgent.java
index f8dd6d8d368..1e5c57b58ad 100644
--- a/agent/bootstrap/src/main/java/org/apache/shardingsphere/agent/bootstrap/ShardingSphereAgent.java
+++ b/agent/bootstrap/src/main/java/org/apache/shardingsphere/agent/bootstrap/ShardingSphereAgent.java
@@ -29,6 +29,7 @@ import org.apache.shardingsphere.agent.core.classloader.AgentClassLoader;
 import org.apache.shardingsphere.agent.core.config.loader.PluginConfigurationLoader;
 import org.apache.shardingsphere.agent.core.logging.LoggingListener;
 import org.apache.shardingsphere.agent.core.plugin.PluginBootServiceManager;
+import org.apache.shardingsphere.agent.core.plugin.PluginJar;
 import org.apache.shardingsphere.agent.core.plugin.loader.AdvisorConfigurationLoader;
 import org.apache.shardingsphere.agent.core.plugin.loader.AgentPluginLoader;
 import org.apache.shardingsphere.agent.core.transformer.AgentJunction;
@@ -36,6 +37,7 @@ import org.apache.shardingsphere.agent.core.transformer.AgentTransformer;
 
 import java.io.IOException;
 import java.lang.instrument.Instrumentation;
+import java.util.Collection;
 import java.util.Map;
 
 /**
@@ -54,10 +56,11 @@ public final class ShardingSphereAgent {
     public static void premain(final String args, final Instrumentation instrumentation) throws IOException {
         Map<String, PluginConfiguration> pluginConfigs = PluginConfigurationLoader.load();
         boolean isEnhancedForProxy = isEnhancedForProxy();
-        Map<String, AdvisorConfiguration> advisorConfigs = AdvisorConfigurationLoader.load(AgentPluginLoader.load(), pluginConfigs.keySet(), isEnhancedForProxy);
-        setUpAgentBuilder(instrumentation, pluginConfigs, advisorConfigs, isEnhancedForProxy);
+        Collection<PluginJar> pluginJars = AgentPluginLoader.load();
+        Map<String, AdvisorConfiguration> advisorConfigs = AdvisorConfigurationLoader.load(pluginJars, pluginConfigs.keySet(), isEnhancedForProxy);
+        setUpAgentBuilder(instrumentation, pluginConfigs, pluginJars, advisorConfigs, isEnhancedForProxy);
         if (isEnhancedForProxy) {
-            setupPluginBootService(pluginConfigs);
+            setupPluginBootService(pluginConfigs, pluginJars);
         }
     }
     
@@ -70,19 +73,19 @@ public final class ShardingSphereAgent {
         return true;
     }
     
-    private static void setUpAgentBuilder(final Instrumentation instrumentation,
-                                          final Map<String, PluginConfiguration> pluginConfigs, final Map<String, AdvisorConfiguration> advisorConfigs, final boolean isEnhancedForProxy) {
+    private static void setUpAgentBuilder(final Instrumentation instrumentation, final Map<String, PluginConfiguration> pluginConfigs,
+                                          final Collection<PluginJar> pluginJars, final Map<String, AdvisorConfiguration> advisorConfigs, final boolean isEnhancedForProxy) {
         AgentBuilder agentBuilder = new AgentBuilder.Default().with(new ByteBuddy().with(TypeValidation.ENABLED))
                 .ignore(ElementMatchers.isSynthetic())
                 .or(ElementMatchers.nameStartsWith("org.apache.shardingsphere.agent."));
         agentBuilder.type(new AgentJunction(advisorConfigs))
-                .transform(new AgentTransformer(pluginConfigs, advisorConfigs, isEnhancedForProxy))
+                .transform(new AgentTransformer(pluginConfigs, pluginJars, advisorConfigs, isEnhancedForProxy))
                 .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
                 .with(new LoggingListener()).installOn(instrumentation);
     }
     
-    private static void setupPluginBootService(final Map<String, PluginConfiguration> pluginConfigs) {
+    private static void setupPluginBootService(final Map<String, PluginConfiguration> pluginConfigs, final Collection<PluginJar> pluginJars) {
         PluginBootServiceManager.startAllServices(pluginConfigs, AgentClassLoader.getClassLoader(), true);
-        Runtime.getRuntime().addShutdownHook(new Thread(PluginBootServiceManager::closeAllServices));
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> PluginBootServiceManager.closeAllServices(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 0c159b0b2fe..fe2face144c 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
@@ -25,6 +25,7 @@ import org.apache.shardingsphere.agent.core.spi.AgentSPIRegistry;
 import org.apache.shardingsphere.agent.spi.plugin.PluginBootService;
 
 import java.io.IOException;
+import java.util.Collection;
 import java.util.Map;
 import java.util.Map.Entry;
 
@@ -66,8 +67,10 @@ public final class PluginBootServiceManager {
     
     /**
      * Close all services.
+     * 
+     * @param pluginJars plugin jars
      */
-    public static void closeAllServices() {
+    public static void closeAllServices(final Collection<PluginJar> pluginJars) {
         AgentSPIRegistry.getAllRegisteredServices(PluginBootService.class).forEach(each -> {
             try {
                 each.close();
@@ -77,7 +80,7 @@ public final class PluginBootServiceManager {
                 LOGGER.error("Failed to close service.", ex);
             }
         });
-        PluginJarHolder.getPluginJars().forEach(each -> {
+        pluginJars.forEach(each -> {
             try {
                 each.getJarFile().close();
             } catch (final IOException ex) {
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginJarHolder.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginJarHolder.java
deleted file mode 100644
index 5f00459794d..00000000000
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginJarHolder.java
+++ /dev/null
@@ -1,51 +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.plugin;
-
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-
-import java.util.Collection;
-import java.util.LinkedList;
-
-/**
- *  Plugin jar holder.
- */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class PluginJarHolder {
-    
-    private static volatile Collection<PluginJar> pluginJars = new LinkedList<>();
-    
-    /**
-     * Get plugin jars.
-     * 
-     * @return plugin jars
-     */
-    public static Collection<PluginJar> getPluginJars() {
-        return pluginJars;
-    }
-    
-    /**
-     * Set plugin jars.
-     * 
-     * @param pluginJars plugin jars
-     */
-    public static void setPluginJars(final Collection<PluginJar> pluginJars) {
-        PluginJarHolder.pluginJars = pluginJars;
-    }
-}
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/loader/AgentPluginLoader.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/loader/AgentPluginLoader.java
index ee0a53166e4..fe5bf384516 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/loader/AgentPluginLoader.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/loader/AgentPluginLoader.java
@@ -19,11 +19,10 @@ package org.apache.shardingsphere.agent.core.plugin.loader;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.agent.core.path.AgentPathBuilder;
 import org.apache.shardingsphere.agent.core.logging.LoggerFactory;
 import org.apache.shardingsphere.agent.core.logging.LoggerFactory.Logger;
+import org.apache.shardingsphere.agent.core.path.AgentPathBuilder;
 import org.apache.shardingsphere.agent.core.plugin.PluginJar;
-import org.apache.shardingsphere.agent.core.plugin.PluginJarHolder;
 
 import java.io.File;
 import java.io.IOException;
@@ -56,7 +55,6 @@ public final class AgentPluginLoader {
             result.add(new PluginJar(new JarFile(each, true), each));
             LOGGER.info("Loaded jar: {}", each.getName());
         }
-        PluginJarHolder.setPluginJars(result);
         return result;
     }
 }
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 f4d14fbf92d..6f5bd5efe7e 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
@@ -24,15 +24,17 @@ import net.bytebuddy.dynamic.DynamicType.Builder;
 import net.bytebuddy.implementation.FieldAccessor;
 import net.bytebuddy.jar.asm.Opcodes;
 import net.bytebuddy.utility.JavaModule;
+import org.apache.shardingsphere.agent.advice.TargetAdviceObject;
 import org.apache.shardingsphere.agent.config.advisor.AdvisorConfiguration;
 import org.apache.shardingsphere.agent.config.plugin.PluginConfiguration;
-import org.apache.shardingsphere.agent.advice.TargetAdviceObject;
+import org.apache.shardingsphere.agent.core.plugin.PluginJar;
 import org.apache.shardingsphere.agent.core.transformer.build.MethodAdvisorBuildEngine;
 import org.apache.shardingsphere.agent.core.transformer.build.advise.AdviceFactory;
 import org.apache.shardingsphere.agent.core.transformer.build.builder.type.ConstructorAdvisorBuilder;
 import org.apache.shardingsphere.agent.core.transformer.build.builder.type.InstanceMethodAdvisorBuilder;
 import org.apache.shardingsphere.agent.core.transformer.build.builder.type.StaticMethodAdvisorBuilder;
 
+import java.util.Collection;
 import java.util.Map;
 
 /**
@@ -45,6 +47,8 @@ public final class AgentTransformer implements Transformer {
     
     private final Map<String, PluginConfiguration> pluginConfigs;
     
+    private final Collection<PluginJar> pluginJars;
+    
     private final Map<String, AdvisorConfiguration> advisorConfigs;
     
     private final boolean enhanceProxy;
@@ -57,7 +61,7 @@ public final class AgentTransformer implements Transformer {
         }
         Builder<?> result = builder.defineField(EXTRA_DATA, Object.class, Opcodes.ACC_PRIVATE | Opcodes.ACC_VOLATILE).implement(TargetAdviceObject.class).intercept(FieldAccessor.ofField(EXTRA_DATA));
         AdvisorConfiguration advisorConfig = advisorConfigs.get(typeDescription.getTypeName());
-        AdviceFactory adviceFactory = new AdviceFactory(classLoader, pluginConfigs, enhanceProxy);
+        AdviceFactory adviceFactory = new AdviceFactory(classLoader, pluginConfigs, pluginJars, enhanceProxy);
         result = new MethodAdvisorBuildEngine(advisorConfig.getConstructorAdvisors(), typeDescription).create(result, new ConstructorAdvisorBuilder(adviceFactory));
         result = new MethodAdvisorBuildEngine(advisorConfig.getInstanceMethodAdvisors(), typeDescription).create(result, new InstanceMethodAdvisorBuilder(adviceFactory));
         result = new MethodAdvisorBuildEngine(advisorConfig.getStaticMethodAdvisors(), typeDescription).create(result, new StaticMethodAdvisorBuilder(adviceFactory));
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/advise/AdviceFactory.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/advise/AdviceFactory.java
index b3d261b71ef..d2609112d7d 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/advise/AdviceFactory.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/advise/AdviceFactory.java
@@ -19,7 +19,9 @@ package org.apache.shardingsphere.agent.core.transformer.build.advise;
 
 import org.apache.shardingsphere.agent.advice.AgentAdvice;
 import org.apache.shardingsphere.agent.config.plugin.PluginConfiguration;
+import org.apache.shardingsphere.agent.core.plugin.PluginJar;
 
+import java.util.Collection;
 import java.util.Map;
 
 /**
@@ -33,9 +35,9 @@ public final class AdviceFactory {
     
     private final boolean isEnhancedForProxy;
     
-    public AdviceFactory(final ClassLoader classLoader, final Map<String, PluginConfiguration> pluginConfigs, final boolean isEnhancedForProxy) {
+    public AdviceFactory(final ClassLoader classLoader, final Map<String, PluginConfiguration> pluginConfigs, final Collection<PluginJar> pluginJars, final boolean isEnhancedForProxy) {
         proxyAdviceFactory = new ProxyAdviceFactory();
-        jdbcAdviceFactory = new JDBCAdviceFactory(classLoader, pluginConfigs);
+        jdbcAdviceFactory = new JDBCAdviceFactory(classLoader, pluginConfigs, pluginJars);
         this.isEnhancedForProxy = isEnhancedForProxy;
     }
     
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/advise/JDBCAdviceFactory.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/advise/JDBCAdviceFactory.java
index ed7fba49705..2e7db63c73e 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/advise/JDBCAdviceFactory.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/build/advise/JDBCAdviceFactory.java
@@ -22,8 +22,9 @@ import lombok.SneakyThrows;
 import org.apache.shardingsphere.agent.config.plugin.PluginConfiguration;
 import org.apache.shardingsphere.agent.core.classloader.AgentClassLoader;
 import org.apache.shardingsphere.agent.core.plugin.PluginBootServiceManager;
-import org.apache.shardingsphere.agent.core.plugin.PluginJarHolder;
+import org.apache.shardingsphere.agent.core.plugin.PluginJar;
 
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -44,6 +45,8 @@ public final class JDBCAdviceFactory {
     
     private final Map<String, PluginConfiguration> pluginConfigs;
     
+    private final Collection<PluginJar> pluginJars;
+    
     /**
      * Get advice.
      *
@@ -59,7 +62,7 @@ public final class JDBCAdviceFactory {
     
     @SneakyThrows(ReflectiveOperationException.class)
     private Object createAdviceForJDBC(final String adviceClassName) {
-        ClassLoader pluginClassLoader = PLUGIN_CLASS_LOADERS.computeIfAbsent(classLoader, key -> new AgentClassLoader(key, PluginJarHolder.getPluginJars()));
+        ClassLoader pluginClassLoader = PLUGIN_CLASS_LOADERS.computeIfAbsent(classLoader, key -> new AgentClassLoader(key, pluginJars));
         Object result = Class.forName(adviceClassName, true, pluginClassLoader).getDeclaredConstructor().newInstance();
         setupPluginBootService(pluginClassLoader);
         return result;
@@ -71,7 +74,7 @@ public final class JDBCAdviceFactory {
         }
         try {
             PluginBootServiceManager.startAllServices(pluginConfigs, pluginClassLoader, false);
-            Runtime.getRuntime().addShutdownHook(new Thread(PluginBootServiceManager::closeAllServices));
+            Runtime.getRuntime().addShutdownHook(new Thread(() -> PluginBootServiceManager.closeAllServices(pluginJars)));
         } finally {
             isStarted = true;
         }
diff --git a/agent/core/src/test/java/org/apache/shardingsphere/agent/core/transformer/AgentTransformerTest.java b/agent/core/src/test/java/org/apache/shardingsphere/agent/core/transformer/AgentTransformerTest.java
index ccb6a832aaa..202b3a6a225 100644
--- a/agent/core/src/test/java/org/apache/shardingsphere/agent/core/transformer/AgentTransformerTest.java
+++ b/agent/core/src/test/java/org/apache/shardingsphere/agent/core/transformer/AgentTransformerTest.java
@@ -69,7 +69,7 @@ public final class AgentTransformerTest {
                 .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
                 .with(new LoggingListener())
                 .type(new AgentJunction(advisorConfigs))
-                .transform(new AgentTransformer(Collections.emptyMap(), advisorConfigs, true))
+                .transform(new AgentTransformer(Collections.emptyMap(), Collections.emptyList(), advisorConfigs, true))
                 .asTerminalTransformation()
                 .installOnByteBuddyAgent();
     }