From 272d293cb6c27fab68b879f911ffc85cfc8f12e3 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Wed, 11 Dec 2019 18:15:24 +0100 Subject: [PATCH 1/4] Add new module optional-depender and a new failing test * Variant plugin is a dependency of optional-depender Optional-depender contains the following class @OptionalExtension(requirePlugins = {"dependee"}) public class OptionalDependerExtension { private static void foo(Dependee d) { } } --- .../test/java/hudson/PluginManagerTest.java | 36 ++++++++++++++++-- .../plugins/optional-depender-0.0.2.hpi | Bin 0 -> 5192 bytes test/src/test/resources/plugins/variant.hpi | Bin 10027 -> 10252 bytes 3 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 test/src/test/resources/plugins/optional-depender-0.0.2.hpi diff --git a/test/src/test/java/hudson/PluginManagerTest.java b/test/src/test/java/hudson/PluginManagerTest.java index 535587df864b..57cd87d9f975 100644 --- a/test/src/test/java/hudson/PluginManagerTest.java +++ b/test/src/test/java/hudson/PluginManagerTest.java @@ -333,6 +333,11 @@ private String callDependerValue() throws Exception { fail(); } catch( ClassNotFoundException ex ){ } + // Extension extending a dependee class can't be loaded either + try { + r.jenkins.getExtensionList("org.jenkinsci.plugins.dependencytest.depender.DependerExtension"); + fail(); + } catch( NoClassDefFoundError ex ){} // Load dependee. { @@ -342,10 +347,33 @@ private String callDependerValue() throws Exception { // (MUST) Not throws an exception // (SHOULD) depender successfully accesses to dependee. assertEquals("dependee", callDependerValue()); - - // No extensions exist. - // extensions in depender are loaded. - assertFalse(r.jenkins.getExtensionList("org.jenkinsci.plugins.dependencytest.dependee.DependeeExtensionPoint").isEmpty()); + + // Extensions in depender are loaded. + assertEquals(1, r.jenkins.getExtensionList("org.jenkinsci.plugins.dependencytest.depender.DependerExtension").size()); + } + + /** + * Load "optional-depender" and then load "dependee". + * Asserts that "depender" can access to "dependee". + * + * @throws Exception + */ + @Issue("JENKINS-60449") + @WithPlugin("variant.hpi") + @Test public void installDependedOptionalPluginWithoutRestart() throws Exception { + // Load optional-depender. + { + dynamicLoad("optional-depender-0.0.2.hpi"); + } + // Extension depending on dependee class isn't loaded + assertTrue(r.jenkins.getExtensionList("org.jenkinsci.plugins.dependencytest.optionaldepender.OptionalDependerExtension").isEmpty()); + // Load dependee. + { + dynamicLoad("dependee-0.0.2.hpi"); + } + + // Extensions in depender are loaded. + assertEquals(1, r.jenkins.getExtensionList("org.jenkinsci.plugins.dependencytest.optionaldepender.OptionalDependerExtension").size()); } @Issue("JENKINS-21486") diff --git a/test/src/test/resources/plugins/optional-depender-0.0.2.hpi b/test/src/test/resources/plugins/optional-depender-0.0.2.hpi new file mode 100644 index 0000000000000000000000000000000000000000..6e3031e7cd3376d30c0e1df5d883d0d868197994 GIT binary patch literal 5192 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 Dn}fXr literal 0 HcmV?d00001 diff --git a/test/src/test/resources/plugins/variant.hpi b/test/src/test/resources/plugins/variant.hpi index 999acbcf1b98a1f706a9467de37449e41b7fa0ab..9f49430df032a5ce5b4ff63ed6da684d67e77962 100644 GIT binary patch literal 10252 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 Date: Thu, 12 Dec 2019 11:36:18 +0100 Subject: [PATCH 2/4] [JENKINS-60449] Move plugin initialization at the end, keep only one extension refresh --- core/src/main/java/hudson/PluginManager.java | 31 +++++++++----------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index eab0bae336e9..7728ed70655d 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -949,23 +949,6 @@ public void dynamicLoad(File arc, boolean removeExisting, @CheckForNull List plugins) throws Exception { try (ACLContext context = ACL.as(ACL.SYSTEM)) { - Jenkins.get().refreshExtensions(); - - for (PluginWrapper p : plugins) { - p.getPlugin().postInitialize(); - } - - // run initializers in the added plugins - Reactor r = new Reactor(InitMilestone.ordering()); - Set loaders = plugins.stream().map(p -> p.classLoader).collect(Collectors.toSet()); - r.addAll(new InitializerFinder(uberClassLoader) { - @Override - protected boolean filter(Method e) { - return !loaders.contains(e.getDeclaringClass().getClassLoader()) || super.filter(e); - } - }.discoverTasks(r)); - new InitReactorRunner().run(r); - Map pluginsByName = plugins.stream().collect(Collectors.toMap(p -> p.getShortName(), p -> p)); // recalculate dependencies of plugins optionally depending the newly deployed ones. @@ -993,6 +976,20 @@ protected boolean filter(Method e) { } catch (ExtensionRefreshException e) { throw new IOException("Failed to refresh extensions after installing some plugins", e); } + for (PluginWrapper p : plugins) { + p.getPlugin().postInitialize(); + } + + // run initializers in the added plugins + Reactor r = new Reactor(InitMilestone.ordering()); + Set loaders = plugins.stream().map(p -> p.classLoader).collect(Collectors.toSet()); + r.addAll(new InitializerFinder(uberClassLoader) { + @Override + protected boolean filter(Method e) { + return !loaders.contains(e.getDeclaringClass().getClassLoader()) || super.filter(e); + } + }.discoverTasks(r)); + new InitReactorRunner().run(r); } } From 394b932091977207d3a7e216a99cd8f99dfee9e8 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Thu, 12 Dec 2019 12:16:37 +0100 Subject: [PATCH 3/4] Improve logic to detect classloading issues Inspect all declared constructors/methods/fields recursively to exclude failing classes from Guice rather than have Guice explode. This also fix the failing test, but the previous commit is still better because it avoids an extra Jenkins.get().refreshExtensions() call. --- .../src/main/java/hudson/ExtensionFinder.java | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/hudson/ExtensionFinder.java b/core/src/main/java/hudson/ExtensionFinder.java index 76a7908adc94..f5da946d06ae 100644 --- a/core/src/main/java/hudson/ExtensionFinder.java +++ b/core/src/main/java/hudson/ExtensionFinder.java @@ -36,6 +36,8 @@ import com.google.inject.Provider; import com.google.inject.Scope; import com.google.inject.Scopes; +import com.google.inject.TypeLiteral; +import com.google.inject.internal.Errors; import com.google.inject.matcher.Matchers; import com.google.inject.name.Names; import com.google.inject.spi.ProvisionListener; @@ -484,24 +486,25 @@ public SezpozModule(List> index) { */ private void resolve(Class c) { try { - c.getGenericSuperclass(); - c.getGenericInterfaces(); ClassLoader ecl = c.getClassLoader(); Method m = ClassLoader.class.getDeclaredMethod("resolveClass", Class.class); m.setAccessible(true); m.invoke(ecl, c); - c.getConstructors(); - c.getMethods(); - for (Field f : c.getFields()) { - if (f.getAnnotation(javax.inject.Inject.class) != null || f.getAnnotation(com.google.inject.Inject.class) != null) { - resolve(f.getType()); + for (Class cc = c; cc != Object.class; cc = cc.getSuperclass()) { + /** + * See {@link com.google.inject.spi.InjectionPoint#getInjectionPoints(TypeLiteral, boolean, Errors)} + */ + cc.getGenericSuperclass(); + cc.getGenericInterfaces(); + cc.getDeclaredConstructors(); + cc.getDeclaredMethods(); + for (Field f : cc.getDeclaredFields()) { + if (f.getAnnotation(javax.inject.Inject.class) != null || f.getAnnotation(com.google.inject.Inject.class) != null) { + resolve(f.getType()); + } } } LOGGER.log(Level.FINER, "{0} looks OK", c); - while (c != Object.class) { - c.getGenericSuperclass(); - c = c.getSuperclass(); - } } catch (Exception x) { throw (LinkageError)new LinkageError("Failed to resolve "+c).initCause(x); } From 2cc2adbe410967184b14cdfd73c6bf49753a0ea8 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Thu, 12 Dec 2019 16:32:26 +0100 Subject: [PATCH 4/4] Only test resolveClass method if the classloader is not the bootstrap one --- core/src/main/java/hudson/ExtensionFinder.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/ExtensionFinder.java b/core/src/main/java/hudson/ExtensionFinder.java index f5da946d06ae..fda89201be07 100644 --- a/core/src/main/java/hudson/ExtensionFinder.java +++ b/core/src/main/java/hudson/ExtensionFinder.java @@ -487,9 +487,11 @@ public SezpozModule(List> index) { private void resolve(Class c) { try { ClassLoader ecl = c.getClassLoader(); - Method m = ClassLoader.class.getDeclaredMethod("resolveClass", Class.class); - m.setAccessible(true); - m.invoke(ecl, c); + if (ecl != null) { // Not bootstrap classloader + Method m = ClassLoader.class.getDeclaredMethod("resolveClass", Class.class); + m.setAccessible(true); + m.invoke(ecl, c); + } for (Class cc = c; cc != Object.class; cc = cc.getSuperclass()) { /** * See {@link com.google.inject.spi.InjectionPoint#getInjectionPoints(TypeLiteral, boolean, Errors)}