summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn O. Pearce <sop@google.com>2009-05-14 10:26:59 -0700
committerShawn O. Pearce <sop@google.com>2009-05-14 10:58:44 -0700
commitfc9081f4625b206619f9452b8688f26592a26fff (patch)
treef298b5b9018a99b67dbaa8cbdb48db8e5132dcaf
parent9410f2cf90dbc356f0db2abc74f69693ffcb1544 (diff)
Honor sshd.tcpKeepAlive for TCP keep alive controls
Signed-off-by: Shawn O. Pearce <sop@google.com>
-rw-r--r--Documentation/config-gerrit.txt7
-rw-r--r--src/main/java/com/google/gerrit/server/ssh/GerritSshDaemon.java14
2 files changed, 18 insertions, 3 deletions
diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt
index 12a9bb3649..acd460b971 100644
--- a/Documentation/config-gerrit.txt
+++ b/Documentation/config-gerrit.txt
@@ -193,6 +193,13 @@ to permit fast restarts.
+
By default, true.
+sshd.tcpKeepAlive::
++
+If true, enables TCP keepalive messages to the other side, so
+the daemon can terminate connections if the peer disappears.
++
+By default, true.
+
File `replication.config`
-------------------------
diff --git a/src/main/java/com/google/gerrit/server/ssh/GerritSshDaemon.java b/src/main/java/com/google/gerrit/server/ssh/GerritSshDaemon.java
index a02e0629f7..3bb4b2a596 100644
--- a/src/main/java/com/google/gerrit/server/ssh/GerritSshDaemon.java
+++ b/src/main/java/com/google/gerrit/server/ssh/GerritSshDaemon.java
@@ -21,6 +21,7 @@ import com.google.gwtorm.client.OrmException;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IoSession;
+import org.apache.mina.transport.socket.SocketSessionConfig;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.apache.sshd.SshServer;
import org.apache.sshd.common.Cipher;
@@ -154,12 +155,14 @@ public class GerritSshDaemon extends SshServer {
private IoAcceptor acceptor;
private boolean reuseAddress;
+ private boolean keepAlive;
private GerritSshDaemon(final GerritServer srv) {
setPort(Common.getGerritConfig().getSshdPort());
final RepositoryConfig cfg = srv.getGerritConfig();
reuseAddress = cfg.getBoolean("sshd", "reuseaddress", true);
+ keepAlive = cfg.getBoolean("sshd", "tcpkeepalive", true);
if (SecurityUtils.isBouncyCastleRegistered()) {
initProviderBouncyCastle();
@@ -177,10 +180,15 @@ public class GerritSshDaemon extends SshServer {
setShellFactory(new NoShell());
setSessionFactory(new SessionFactory() {
@Override
- protected AbstractSession createSession(final IoSession ioSession)
+ protected AbstractSession createSession(final IoSession io)
throws Exception {
- final AbstractSession s = super.createSession(ioSession);
- s.setAttribute(SshUtil.REMOTE_PEER, ioSession.getRemoteAddress());
+ if (io.getConfig() instanceof SocketSessionConfig) {
+ final SocketSessionConfig c = (SocketSessionConfig) io.getConfig();
+ c.setKeepAlive(keepAlive);
+ }
+
+ final AbstractSession s = super.createSession(io);
+ s.setAttribute(SshUtil.REMOTE_PEER, io.getRemoteAddress());
return s;
}
});