diff --git a/core/src/main/java/hudson/slaves/ChannelPinger.java b/core/src/main/java/hudson/slaves/ChannelPinger.java index bb3749f576fd952dfb6087dfe37965238564fada..ddc641ba412fff14a991e5b6c5bf28cb6c3ec354 100644 --- a/core/src/main/java/hudson/slaves/ChannelPinger.java +++ b/core/src/main/java/hudson/slaves/ChannelPinger.java @@ -88,7 +88,7 @@ public class ChannelPinger extends ComputerListener { // set up ping from both directions, so that in case of a router dropping a connection, // both sides can notice it and take compensation actions. - setUpPingForChannel(channel, pingInterval); + setUpPingForChannel(channel, pingInterval, true); } private static class SetUpRemotePing extends MasterToSlaveCallable { @@ -99,18 +99,20 @@ public class ChannelPinger extends ComputerListener { } public Void call() throws IOException { - setUpPingForChannel(Channel.current(), pingInterval); + setUpPingForChannel(Channel.current(), pingInterval, false); return null; } } - private static void setUpPingForChannel(final Channel channel, int interval) { + private static void setUpPingForChannel(final Channel channel, int interval, final boolean analysis) { + LOGGER.log(FINE, "setting up ping on {0} at interval {1}m", new Object[] {channel.getName(), interval}); final AtomicBoolean isInClosed = new AtomicBoolean(false); final PingThread t = new PingThread(channel, interval * 60 * 1000) { + @Override protected void onDead(Throwable cause) { try { - for (PingFailureAnalyzer pfa : PingFailureAnalyzer.all()) { - pfa.onPingFailure(channel,cause); + if (analysis) { + analyze(cause); } if (isInClosed.get()) { LOGGER.log(FINE,"Ping failed after the channel "+channel.getName()+" is already partially closed.",cause); @@ -122,6 +124,14 @@ public class ChannelPinger extends ComputerListener { LOGGER.log(SEVERE,"Failed to terminate the channel "+channel.getName(),e); } } + /** Keep in a separate method so we do not even try to do class loading on {@link PingFailureAnalyzer} from an agent JVM. */ + private void analyze(Throwable cause) throws IOException { + for (PingFailureAnalyzer pfa : PingFailureAnalyzer.all()) { + pfa.onPingFailure(channel,cause); + } + } + @Deprecated + @Override protected void onDead() { onDead(null); }