diff --git a/core/src/main/java/hudson/model/ComputerSet.java b/core/src/main/java/hudson/model/ComputerSet.java index dd0ccee05d1cad74fd6179da87171aa9a8e40bcf..1eeae9f5fd2e03e0b76950b1d9eaba3b4025a00b 100644 --- a/core/src/main/java/hudson/model/ComputerSet.java +++ b/core/src/main/java/hudson/model/ComputerSet.java @@ -21,21 +21,7 @@ import org.kohsuke.stapler.export.Exported; */ @ExportedBean public final class ComputerSet implements ModelObject { - private static volatile List monitors = Collections.emptyList(); - - public ComputerSet() { - if(monitors.isEmpty()) { - // create all instances when requested for the first time. - ArrayList r = new ArrayList(); - for (Descriptor d : NodeMonitor.LIST) - try { - r.add(d.newInstance(null,null)); - } catch (FormException e) { - // so far impossible. TODO: report - } - monitors = r; - } - } + private static final List monitors; @Exported public String getDisplayName() { @@ -67,4 +53,21 @@ public final class ComputerSet implements ModelObject { public Api getApi() { return new Api(this); } + + /** + * Just to force the execution of the static initializer. + */ + public static void initialize() {} + + static { + // create all instances + ArrayList r = new ArrayList(); + for (Descriptor d : NodeMonitor.LIST) + try { + r.add(d.newInstance(null,null)); + } catch (FormException e) { + // so far impossible. TODO: report + } + monitors = r; + } } diff --git a/core/src/main/java/hudson/triggers/Trigger.java b/core/src/main/java/hudson/triggers/Trigger.java index 8ce314c42ea58cf8f9bfdf403d687c7952ac0d02..16ca5e20722d65c8e197eda12ddffdbc7fdf4f8d 100644 --- a/core/src/main/java/hudson/triggers/Trigger.java +++ b/core/src/main/java/hudson/triggers/Trigger.java @@ -1,21 +1,23 @@ package hudson.triggers; +import antlr.ANTLRException; import hudson.DependencyRunner; -import hudson.ExtensionPoint; -import hudson.util.DoubleLaunchChecker; import hudson.DependencyRunner.ProjectRunnable; +import hudson.ExtensionPoint; import hudson.model.AbstractProject; import hudson.model.Action; import hudson.model.Build; +import hudson.model.ComputerSet; import hudson.model.Describable; import hudson.model.FingerprintCleanupThread; import hudson.model.Hudson; import hudson.model.Item; import hudson.model.Project; -import hudson.model.WorkspaceCleanupThread; import hudson.model.SlaveReconnectionWork; +import hudson.model.WorkspaceCleanupThread; import hudson.scheduler.CronTab; import hudson.scheduler.CronTabList; +import hudson.util.DoubleLaunchChecker; import java.io.InvalidObjectException; import java.io.ObjectStreamException; @@ -28,8 +30,6 @@ import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; -import antlr.ANTLRException; - /** * Triggers a {@link Build}. * @@ -214,5 +214,12 @@ public abstract class Trigger implements Describable> timer.scheduleAtFixedRate(new FingerprintCleanupThread(),DAY,DAY); timer.scheduleAtFixedRate(new WorkspaceCleanupThread(),DAY+4*HOUR,DAY); timer.scheduleAtFixedRate(new SlaveReconnectionWork(),15*MIN,5*MIN); + + // start monitoring nodes, although there's no hurry. + timer.schedule(new SafeTimerTask() { + public void doRun() { + ComputerSet.initialize(); + } + }, 1000*10); } }