You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by lg...@apache.org on 2017/12/06 08:35:38 UTC

[2/2] mina-sshd git commit: [SSHD-786] More debuggable code related to Nio2Acceptor behavior

[SSHD-786] More debuggable code related to Nio2Acceptor behavior


Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo
Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/014bf86c
Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/014bf86c
Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/014bf86c

Branch: refs/heads/master
Commit: 014bf86c5517a0ec9c3e501e321391a6e145eb9b
Parents: f3384ea
Author: Goldstein Lyor <ly...@c-b4.com>
Authored: Wed Dec 6 09:36:08 2017 +0200
Committer: Goldstein Lyor <ly...@c-b4.com>
Committed: Wed Dec 6 10:35:22 2017 +0200

----------------------------------------------------------------------
 .../sshd/common/io/nio2/Nio2Acceptor.java       | 41 ++++++++++++++------
 .../common/io/nio2/Nio2CompletionHandler.java   |  4 +-
 .../java/org/apache/sshd/server/SshServer.java  | 10 +++++
 3 files changed, 42 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/014bf86c/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Acceptor.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Acceptor.java b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Acceptor.java
index e942e8a..66a3c41 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Acceptor.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Acceptor.java
@@ -58,16 +58,16 @@ public class Nio2Acceptor extends Nio2Service implements IoAcceptor {
                 log.debug("Binding Nio2Acceptor to address {}", address);
             }
 
-            AsynchronousServerSocketChannel socket =
-                    setSocketOptions(openAsynchronousServerSocketChannel(address, group));
+            AsynchronousServerSocketChannel asyncChannel = openAsynchronousServerSocketChannel(address, group);
+            AsynchronousServerSocketChannel socket = setSocketOptions(asyncChannel);
             socket.bind(address, backlog);
             SocketAddress local = socket.getLocalAddress();
             channels.put(local, socket);
 
             CompletionHandler<AsynchronousSocketChannel, ? super SocketAddress> handler =
-                    ValidateUtils.checkNotNull(createSocketCompletionHandler(channels, socket),
-                                               "No completion handler created for address=%s",
-                                               address);
+                ValidateUtils.checkNotNull(createSocketCompletionHandler(channels, socket),
+                    "No completion handler created for address=%s",
+                    address);
             socket.accept(local, handler);
         }
     }
@@ -112,7 +112,7 @@ public class Nio2Acceptor extends Nio2Service implements IoAcceptor {
                 }
             } else {
                 if (log.isTraceEnabled()) {
-                    log.trace("No active channel to unbind {}", address);
+                    log.trace("No active channel to unbind for {}", address);
                 }
             }
         }
@@ -136,11 +136,20 @@ public class Nio2Acceptor extends Nio2Service implements IoAcceptor {
 
     @Override
     public void doCloseImmediately() {
-        for (SocketAddress address : channels.keySet()) {
+        Collection<SocketAddress> boundAddresses = getBoundAddresses();
+        for (SocketAddress address : boundAddresses) {
+            AsynchronousServerSocketChannel asyncChannel = channels.remove(address);
+            if (asyncChannel == null) {
+                continue;   // debug breakpoint
+            }
+
             try {
-                channels.get(address).close();
+                asyncChannel.close();
+                if (log.isDebugEnabled()) {
+                    log.debug("doCloseImmediately({}) closed channel", address);
+                }
             } catch (IOException e) {
-                log.debug("Exception caught while closing channel", e);
+                log.debug("Exception caught while closing channel of " + address, e);
             }
         }
         super.doCloseImmediately();
@@ -204,12 +213,22 @@ public class Nio2Acceptor extends Nio2Service implements IoAcceptor {
 
         @Override
         @SuppressWarnings("synthetic-access")
-        protected void onFailed(final Throwable exc, final SocketAddress address) {
-            if (channels.containsKey(address) && !disposing.get()) {
+        protected void onFailed(Throwable exc, SocketAddress address) {
+            AsynchronousServerSocketChannel channel = channels.get(address);
+            if (channel == null) {
+                if (log.isDebugEnabled()) {
+                    log.debug("Caught {} for untracked channel of {}: {}",
+                        exc.getClass().getSimpleName(), address, exc.getMessage());
+                }
+                return;
+            }
+
+            if (!disposing.get()) {
                 log.warn("Caught " + exc.getClass().getSimpleName()
                        + " while accepting incoming connection from " + address
                        + ": " + exc.getMessage(),
                         exc);
+                // TODO (SSHD-786) consider closing the channel
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/014bf86c/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2CompletionHandler.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2CompletionHandler.java b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2CompletionHandler.java
index 1ed9286..05f1a60 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2CompletionHandler.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2CompletionHandler.java
@@ -33,7 +33,7 @@ public abstract class Nio2CompletionHandler<V, A> implements CompletionHandler<V
     }
 
     @Override
-    public void completed(final V result, final A attachment) {
+    public void completed(V result, A attachment) {
         AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
             onCompleted(result, attachment);
             return null;
@@ -41,7 +41,7 @@ public abstract class Nio2CompletionHandler<V, A> implements CompletionHandler<V
     }
 
     @Override
-    public void failed(final Throwable exc, final A attachment) {
+    public void failed(Throwable exc, A attachment) {
         AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
             onFailed(exc, attachment);
             return null;

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/014bf86c/sshd-core/src/main/java/org/apache/sshd/server/SshServer.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/SshServer.java b/sshd-core/src/main/java/org/apache/sshd/server/SshServer.java
index 0d1d421..5085283 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/SshServer.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/SshServer.java
@@ -23,6 +23,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
+import java.net.SocketAddress;
 import java.net.SocketTimeoutException;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -37,6 +38,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.TreeMap;
 
 import org.apache.sshd.common.Closeable;
@@ -160,6 +162,14 @@ public class SshServer extends AbstractFactoryManager implements ServerFactoryMa
         this.port = port;
     }
 
+    /**
+     * @return The currently bound addresses - valid only after server {@link #start() started}
+     * and while not {@link #stop() stopped}
+     */
+    public Set<SocketAddress> getBoundAddresses() {
+        return (acceptor == null) ? Collections.emptySet() : acceptor.getBoundAddresses();
+    }
+
     @Override
     public List<NamedFactory<UserAuth>> getUserAuthFactories() {
         return userAuthFactories;