You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sirona.apache.org by rm...@apache.org on 2014/11/27 15:32:57 UTC

svn commit: r1642160 - in /incubator/sirona/trunk: agent/javaagent/ agent/javaagent/src/main/java/org/apache/sirona/javaagent/ agent/javaagent/src/test/java/org/apache/sirona/javaagent/ core/src/main/java/org/apache/sirona/configuration/

Author: rmannibucau
Date: Thu Nov 27 14:32:57 2014
New Revision: 1642160

URL: http://svn.apache.org/r1642160
Log:
finer config for javaagent runner + forcing fallback classloader for Configuration + upgrading asm + using system classloader for libs and not bootstrap one (to validate)

Modified:
    incubator/sirona/trunk/agent/javaagent/pom.xml
    incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java
    incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/AgentArgs.java
    incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/configuration/Configuration.java

Modified: incubator/sirona/trunk/agent/javaagent/pom.xml
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/pom.xml?rev=1642160&r1=1642159&r2=1642160&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/pom.xml (original)
+++ incubator/sirona/trunk/agent/javaagent/pom.xml Thu Nov 27 14:32:57 2014
@@ -30,7 +30,7 @@
   <properties>
     <test.debug.remote>false</test.debug.remote>
     <sirona.agent.debug>false</sirona.agent.debug>
-    <asm.version>5.0.1</asm.version>
+    <asm.version>5.0.3</asm.version>
     <agent.class>org.apache.sirona.javaagent.SironaAgent</agent.class>
   </properties>
 
@@ -132,18 +132,21 @@
               <createSourcesJar>true</createSourcesJar>
               <shadedArtifactAttached>true</shadedArtifactAttached>
               <shadedClassifierName>shaded</shadedClassifierName>
+              <createDependencyReducedPom>true</createDependencyReducedPom>
+              <dependencyReducedPomLocation>${project.build.directory}/reduced-pom.xml</dependencyReducedPomLocation>
               <relocations>
                 <relocation>
                   <pattern>org.objectweb.asm</pattern>
                   <shadedPattern>org.apache.sirona.asm</shadedPattern>
                 </relocation>
-                <!--
-                <relocation>
-                  <pattern>org.apache.sirona</pattern>
-                  <shadedPattern>org.apache.sirona.sirona</shadedPattern>
-                </relocation>
-                -->
               </relocations>
+              <artifactSet>
+                <includes>
+                  <include>org.ow2.asm:asm-all</include>
+                  <include>org.apache.sirona:sirona-aop</include>
+                  <include>org.apache.sirona:sirona-core</include>
+                </includes>
+              </artifactSet>
             </configuration>
           </execution>
         </executions>

Modified: incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java?rev=1642160&r1=1642159&r2=1642160&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java Thu Nov 27 14:32:57 2014
@@ -18,15 +18,17 @@ package org.apache.sirona.javaagent;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
-import java.io.IOException;
 import java.lang.instrument.Instrumentation;
 import java.lang.reflect.Method;
 import java.net.URL;
+import java.net.URLClassLoader;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.jar.JarFile;
 
+import static java.util.Arrays.asList;
+
 public class SironaAgent {
 
     private static final boolean FORCE_RELOAD = Boolean.getBoolean("sirona.javaagent.force.reload");
@@ -49,7 +51,7 @@ public class SironaAgent {
             }
         });
 
-        final ClassLoader loader = Thread.currentThread().getContextClassLoader();
+        final ClassLoader loader = ClassLoader.getSystemClassLoader(); // TCCL works for sirona but not for libs
         try {
             final String resource = SironaAgent.class.getName().replace('.', '/') + ".class";
             final URL agentUrl = loader.getResource(resource);
@@ -65,19 +67,21 @@ public class SironaAgent {
             e.printStackTrace();
         }
 
+        final boolean debug = "true".equalsIgnoreCase(extractConfig(agentArgs, "debug="));
+        final boolean envrtDebug = debug || "true".equalsIgnoreCase(extractConfig(agentArgs, "environment-debug="));
+
+        final StringBuilder out = new StringBuilder();
         final String libs = extractConfig(agentArgs, "libs=");
         if (libs != null) {
-            final File root = new File(libs);
-            if (root.exists()) {
-                final File[] children = root.listFiles();
-                if (children != null) {
-                    for (final File f : children) {
-                        if (!f.isDirectory()) {
-                            try {
-                                instrumentation.appendToBootstrapClassLoaderSearch(new JarFile(f));
-                            } catch (final IOException e) {
-                                e.printStackTrace();
-                            }
+            for (final String lib : libs.split(" *, *")) {
+                final File root = new File(lib);
+                if (root.isFile() && root.getName().endsWith(".jar")) {
+                    addLib(instrumentation, out, root);
+                } else if (root.isDirectory()) {
+                    final File[] children = root.listFiles();
+                    if (children != null) {
+                        for (final File f : children) {
+                            addLib(instrumentation, out, f);
                         }
                     }
                 }
@@ -91,6 +95,11 @@ public class SironaAgent {
             e.printStackTrace();
         }
 
+        // we can log/sysout only from here
+        if (envrtDebug) {
+            System.out.print(out.toString());
+        }
+
         try {
             // setup agent parameters
             Class<?> clazz = Class.forName("org.apache.sirona.javaagent.AgentContext", true, loader);
@@ -106,15 +115,24 @@ public class SironaAgent {
 
 
         try {
-            final boolean debug = "true".equalsIgnoreCase(extractConfig(agentArgs, "debug="));
             if (debug) {
                 System.out.println("Sirona debugging activated, find instrumented classes in /tmp/sirona-dump/");
             }
+
             final SironaTransformer transformer = new SironaTransformer(debug);
             final boolean reloadable = instrumentation.isRetransformClassesSupported() && FORCE_RELOAD;
             instrumentation.addTransformer(transformer, reloadable);
 
             final Class<?> listener = loader.loadClass("org.apache.sirona.javaagent.spi.InvocationListener");
+
+            if (envrtDebug) {
+                System.out.println("ClassLoader: " + loader);
+                System.out.println("Loading ClassLoader: " + listener.getClassLoader());
+                if (URLClassLoader.class.isInstance(loader)) {
+                    System.out.println("URLs: " + asList(URLClassLoader.class.cast(loader).getURLs()));
+                }
+            }
+
             if (reloadable) {
                 for (final Class<?> clazz : instrumentation.getAllLoadedClasses()) {
                     if (!clazz.isArray()
@@ -146,6 +164,19 @@ public class SironaAgent {
         }
     }
 
+    private static void addLib(final Instrumentation instrumentation, final StringBuilder out, final File f) {
+        if (out != null) {
+            out.append("Added ").append(f.getAbsolutePath())
+                    .append(" to (instrumentation) classpath")
+                    .append(System.getProperty("line.separator"));
+        }
+        try {
+            instrumentation.appendToSystemClassLoaderSearch(new JarFile(f));
+        } catch (final Exception e) {
+            e.printStackTrace();
+        }
+    }
+
     private static void debug(ClassLoader loader, String msg, Object... objects) {
         try
         {

Modified: incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/AgentArgs.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/AgentArgs.java?rev=1642160&r1=1642159&r2=1642160&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/AgentArgs.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/AgentArgs.java Thu Nov 27 14:32:57 2014
@@ -29,6 +29,7 @@ import java.lang.annotation.Target;
 public @interface AgentArgs
 {
     boolean removeTargetClassesFromClasspath() default true;
+    boolean removeSironaFromClasspath() default true;
 
     String value();
 

Modified: incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java?rev=1642160&r1=1642159&r2=1642160&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java Thu Nov 27 14:32:57 2014
@@ -104,9 +104,9 @@ public class JavaAgentRunner extends Blo
             }
         };
 
-        final List<FrameworkMethod> befores = getTestClass() .getAnnotatedMethods(BeforeFork.class);
+        final List<FrameworkMethod> befores = getTestClass().getAnnotatedMethods(BeforeFork.class);
         statement = befores.isEmpty() ? statement : new RunBefores(statement, befores, null);
-        final List<FrameworkMethod> afters = getTestClass() .getAnnotatedMethods(AfterFork.class);
+        final List<FrameworkMethod> afters = getTestClass().getAnnotatedMethods(AfterFork.class);
         statement = befores.isEmpty() ? statement : new RunAfters(statement, afters, null);
         return statement;
     }
@@ -181,10 +181,15 @@ public class JavaAgentRunner extends Blo
             }
         }
 
-        final String cp = System.getProperty("surefire.test.class.path", System.getProperty("java.class.path"));
-
+        String cp = System.getProperty("surefire.test.class.path", System.getProperty("java.class.path"));
+        if (agentArgs == null || agentArgs.removeTargetClassesFromClasspath()) {
+            cp = removeAgentFromCp(cp);
+        }
+        if (agentArgs != null && agentArgs.removeSironaFromClasspath()) {
+            cp = removeSironaFromCp(cp);
+        }
         args.add("-cp");
-        args.add(agentArgs == null || agentArgs.removeTargetClassesFromClasspath() ? removeAgentFromCp(cp) : cp);
+        args.add(cp);
         args.add(JavaAgentRunner.class.getName());
         args.add(mtd.getMethod().getDeclaringClass().getName());
         args.add(mtd.getName());
@@ -196,11 +201,31 @@ public class JavaAgentRunner extends Blo
 
     private static String removeAgentFromCp(final String property) {
         final String path = new File("target" + File.separatorChar + "classes").getAbsolutePath();
+        return removeFromCp(property, new Predicate() {
+            @Override
+            public boolean accept(final String segment) {
+                return !segment.equals(path);
+            }
+        });
+    }
+
+    private static String removeSironaFromCp(final String property) {
+        return removeFromCp(property, new Predicate() {
+            @Override
+            public boolean accept(final String segment) {
+                final String name = new File(segment).getName();
+                // we remove sirona* but this jar with the runner
+                return !name.startsWith("sirona-") || name.endsWith("-tests.jar");
+            }
+        });
+    }
+
+    private static String removeFromCp(final String property, final Predicate predicate) {
         final String sep = System.getProperty("path.separator");
         final String[] segments = property.split(sep);
         final StringBuilder builder = new StringBuilder(property.length());
         for (final String segment : segments) {
-            if (!segment.equals(path)) {
+            if (predicate.accept(segment)) {
                 builder.append(segment).append(sep);
             }
         }
@@ -358,4 +383,7 @@ public class JavaAgentRunner extends Blo
 
     }
 
+    private static interface Predicate {
+        boolean accept(String path);
+    }
 }

Modified: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/configuration/Configuration.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/configuration/Configuration.java?rev=1642160&r1=1642159&r2=1642160&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/configuration/Configuration.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/configuration/Configuration.java Thu Nov 27 14:32:57 2014
@@ -42,7 +42,12 @@ public final class Configuration {
                 providers.add(new FileConfigurationProvider(source));
             }
             providers.add(new PropertiesConfigurationProvider(System.getProperties()));
-            for (final ConfigurationProvider provider : ServiceLoader.load(ConfigurationProvider.class, Configuration.class.getClassLoader())) {
+
+            ClassLoader classLoader = Configuration.class.getClassLoader();
+            if (classLoader == null) { // ServiceLoader fallbacks to it normally but ensure it is portable
+                classLoader = ClassLoader.getSystemClassLoader();
+            }
+            for (final ConfigurationProvider provider : ServiceLoader.load(ConfigurationProvider.class, classLoader)) {
                 providers.add(provider);
             }
             Collections.sort(providers, Sorter.INSTANCE);