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;