You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by gn...@apache.org on 2009/10/28 14:19:58 UTC

svn commit: r830525 - in /mina/sshd/trunk/sshd-core/src: main/java/org/apache/sshd/SshServer.java main/java/org/apache/sshd/common/session/AbstractSession.java test/java/org/apache/sshd/PortForwardingTest.java

Author: gnodet
Date: Wed Oct 28 13:19:57 2009
New Revision: 830525

URL: http://svn.apache.org/viewvc?rev=830525&view=rev
Log:
SSHD43: When the ssh server is closd, channels are not closed cleanly, causing clients to hang

Modified:
    mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/SshServer.java
    mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java
    mina/sshd/trunk/sshd-core/src/test/java/org/apache/sshd/PortForwardingTest.java

Modified: mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/SshServer.java
URL: http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/SshServer.java?rev=830525&r1=830524&r2=830525&view=diff
==============================================================================
--- mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/SshServer.java (original)
+++ mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/SshServer.java Wed Oct 28 13:19:57 2009
@@ -21,12 +21,15 @@
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.security.InvalidKeyException;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.concurrent.CountDownLatch;
 
 import org.apache.mina.core.service.IoAcceptor;
+import org.apache.mina.core.session.IoSession;
 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
 import org.apache.sshd.common.AbstractFactoryManager;
 import org.apache.sshd.common.Channel;
@@ -42,6 +45,8 @@
 import org.apache.sshd.common.cipher.BlowfishCBC;
 import org.apache.sshd.common.cipher.TripleDESCBC;
 import org.apache.sshd.common.compression.CompressionNone;
+import org.apache.sshd.common.future.CloseFuture;
+import org.apache.sshd.common.future.SshFutureListener;
 import org.apache.sshd.common.keyprovider.FileKeyPairProvider;
 import org.apache.sshd.common.mac.HMACMD5;
 import org.apache.sshd.common.mac.HMACMD596;
@@ -50,6 +55,7 @@
 import org.apache.sshd.common.random.BouncyCastleRandom;
 import org.apache.sshd.common.random.JceRandom;
 import org.apache.sshd.common.random.SingletonRandomFactory;
+import org.apache.sshd.common.session.AbstractSession;
 import org.apache.sshd.common.signature.SignatureDSA;
 import org.apache.sshd.common.signature.SignatureRSA;
 import org.apache.sshd.common.util.SecurityUtils;
@@ -233,7 +239,26 @@
     /**
      * Stop the SSH server.  This method will block until all resources are actually disposed.
      */
-    public void stop() {
+    public void stop() throws InterruptedException {
+        acceptor.setCloseOnDeactivation(false);
+        acceptor.unbind();
+        List<AbstractSession> sessions = new ArrayList<AbstractSession>();
+        for (IoSession ioSession : acceptor.getManagedSessions().values()) {
+            AbstractSession session = AbstractSession.getSession(ioSession, true);
+            if (session != null) {
+                sessions.add(session);
+            }
+        }
+        final CountDownLatch latch = new CountDownLatch(sessions.size());
+        SshFutureListener<CloseFuture> listener = new SshFutureListener<CloseFuture>() {
+            public void operationComplete(CloseFuture future) {
+                latch.countDown();
+            }
+        };
+        for (AbstractSession session : sessions) {
+            session.close(false).addListener(listener);
+        }
+        latch.await();
         acceptor.dispose();
         acceptor = null;
     }

Modified: mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java
URL: http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java?rev=830525&r1=830524&r2=830525&view=diff
==============================================================================
--- mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java (original)
+++ mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java Wed Oct 28 13:19:57 2009
@@ -262,7 +262,7 @@
         } catch (Throwable t2) {
             // Ignore
         }
-        close(false);
+        close(true);
     }
 
     /**

Modified: mina/sshd/trunk/sshd-core/src/test/java/org/apache/sshd/PortForwardingTest.java
URL: http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/test/java/org/apache/sshd/PortForwardingTest.java?rev=830525&r1=830524&r2=830525&view=diff
==============================================================================
--- mina/sshd/trunk/sshd-core/src/test/java/org/apache/sshd/PortForwardingTest.java (original)
+++ mina/sshd/trunk/sshd-core/src/test/java/org/apache/sshd/PortForwardingTest.java Wed Oct 28 13:19:57 2009
@@ -197,7 +197,7 @@
         assertEquals("Hello", res);
         s.close();
 
-        session.delPortForwardingR(forwardedPort);
+        session.delPortForwardingL(forwardedPort);
 
 //        session.setPortForwardingL(8010, "www.amazon.com", 80);
 //        Thread.sleep(1000000);