diff --git a/changelog.html b/changelog.html
index 97fd30b477..b7ef58be40 100644
--- a/changelog.html
+++ b/changelog.html
@@ -43,6 +43,8 @@ Upcoming changes
Fixed a bug in crontab "day of week" handling in locales where a week starts from Monday.
(issue 8401)
+
+ If a master fails to ping a slave, it should be hard-disconnected.
diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java
index d9c37f9ece..990ebd28b4 100644
--- a/core/src/main/java/hudson/TcpSlaveAgentListener.java
+++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java
@@ -116,6 +116,12 @@ public final class TcpSlaveAgentListener extends Thread {
// the loop eventually terminates when the socket is closed.
while (true) {
Socket s = serverSocket.accept();
+
+ // this prevents a connection from silently terminated by the router in between or the other peer
+ // and that goes without unnoticed. However, the time out is often very long (for example 2 hours
+ // by default in Linux) that this alone is enough to prevent that.
+ s.setKeepAlive(true);
+
new ConnectionHandler(s).start();
}
} catch (IOException e) {
diff --git a/core/src/main/java/hudson/node_monitors/ResponseTimeMonitor.java b/core/src/main/java/hudson/node_monitors/ResponseTimeMonitor.java
index 2b2873a8c6..764056db59 100644
--- a/core/src/main/java/hudson/node_monitors/ResponseTimeMonitor.java
+++ b/core/src/main/java/hudson/node_monitors/ResponseTimeMonitor.java
@@ -25,6 +25,7 @@ package hudson.node_monitors;
import hudson.Util;
import hudson.Extension;
+import hudson.model.Descriptor.FormException;
import hudson.slaves.OfflineCause;
import hudson.model.Computer;
import hudson.remoting.Callable;
@@ -67,8 +68,14 @@ public class ResponseTimeMonitor extends NodeMonitor {
d = new Data(old,-1L);
}
- if(d.hasTooManyTimeouts() && markOffline(c,d))
+ if(d.hasTooManyTimeouts() && !isIgnored()) {
+ // unlike other monitors whose failure still allow us to communicate with the slave,
+ // the failure in this monitor indicates that we are just unable to make any requests
+ // to this slave. So we should severe the connection, as opposed to marking it temporarily
+ // off line, which still keeps the underlying channel open.
+ c.disconnect(d);
LOGGER.warning(Messages.ResponseTimeMonitor_MarkedOffline(c.getName()));
+ }
return d;
}
diff --git a/core/src/main/resources/hudson/node_monitors/Messages.properties b/core/src/main/resources/hudson/node_monitors/Messages.properties
index dd39f4e857..1aa5daa78c 100644
--- a/core/src/main/resources/hudson/node_monitors/Messages.properties
+++ b/core/src/main/resources/hudson/node_monitors/Messages.properties
@@ -25,7 +25,7 @@ ClockMonitor.DisplayName=Clock Difference
DiskSpaceMonitor.MarkedOffline=Making {0} offline temporarily due to the lack of disk space
DiskSpaceMonitor.DisplayName=Free Disk Space
ResponseTimeMonitor.DisplayName=Response Time
-ResponseTimeMonitor.MarkedOffline=Making {0} offline temporarily because it''s not responding
+ResponseTimeMonitor.MarkedOffline=Making {0} offline because it''s not responding
ResponseTimeMonitor.TimeOut=Time out for last {0} try
SwapSpaceMonitor.DisplayName=Free Swap Space
TemporarySpaceMonitor.DisplayName=Free Temp Space
\ No newline at end of file