From 4b8d30a100cbb98f493d6ac6fdb243292c1079a2 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sat, 26 Mar 2016 13:01:59 -0700 Subject: [PATCH] Don't go through init sequence twice As a part of PR 1847, 3b5424e507be introduced a second invocation to executeReactor. This is causing a problem in that it exectes InitMilestone progression twice. If you are looking at Jenkins.getInitLevel() it will go through STARTED ... COMPLETED once, then it goes back to STARTED and then go to COMPLETED again. And this code looks bit odd anyway. Why execute a whole reactor just to make one method invocation? But I didn't see any discussion of this in PR 1847. This change fixes this oddity by making this a part of the main (and sole) initialization reactor session. It's not clear what milestone should be the pre-requisite, but given that it's only looking at dependency chain, PLUGINS_PREPARED should be adequate. --- core/src/main/java/hudson/PluginManager.java | 8 ++++++++ core/src/main/java/jenkins/model/Jenkins.java | 16 ---------------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index 7aa8a6202f..3e75ab608d 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -443,6 +443,14 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas session.addAll(g.discoverTasks(session)); } }); + + // All plugins are loaded. Now we can figure out who depends on who. + requires(PLUGINS_PREPARED).attains(COMPLETED).add("Resolving Dependant Plugins Graph", new Executable() { + @Override + public void run(Reactor reactor) throws Exception { + resolveDependantPlugins(); + } + }); }}); } diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 9e5bdf8afa..d97527c1cf 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -896,9 +896,6 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve System.currentTimeMillis()-itemListenerStart,l.getClass().getName())); } - // All plugins are loaded. Now we can figure out who depends on who. - resolveDependantPlugins(); - if (LOG_STARTUP_PERFORMANCE) LOGGER.info(String.format("Took %dms for complete Jenkins startup", System.currentTimeMillis()-start)); @@ -907,19 +904,6 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve } } - private void resolveDependantPlugins() throws InterruptedException, ReactorException, IOException { - TaskGraphBuilder graphBuilder = new TaskGraphBuilder(); - - graphBuilder.add("Resolving Dependant Plugins Graph", new Executable() { - @Override - public void run(Reactor reactor) throws Exception { - pluginManager.resolveDependantPlugins(); - } - }); - - executeReactor(null, graphBuilder); - } - /** * Maintains backwards compatibility. Invoked by XStream when this object is de-serialized. */