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/10/11 17:34:20 UTC

[1/3] mina-sshd git commit: Activated Checkstyle's EmptyLineSeparator rule

Repository: mina-sshd
Updated Branches:
  refs/heads/master 2529a4c3d -> 693fa5d90


Activated Checkstyle's EmptyLineSeparator rule


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

Branch: refs/heads/master
Commit: 55ca88185e90c04dc554a9b87abd67a392461219
Parents: 0e99597
Author: Lyor Goldstein <ly...@gmail.com>
Authored: Wed Oct 11 19:12:08 2017 +0300
Committer: Lyor Goldstein <ly...@gmail.com>
Committed: Wed Oct 11 20:35:15 2017 +0300

----------------------------------------------------------------------
 sshd-checkstyle.xml                                 |  6 ++++++
 .../sshd/client/ClientAuthenticationManager.java    |  8 ++++++++
 .../apache/sshd/client/ClientFactoryManager.java    |  3 +++
 .../apache/sshd/client/auth/AbstractUserAuth.java   |  1 +
 .../client/session/ClientProxyConnectorHolder.java  |  1 +
 .../sshd/client/simple/AbstractSimpleClient.java    |  1 +
 .../client/subsystem/sftp/DefaultSftpClient.java    |  5 +++--
 .../sshd/client/subsystem/sftp/SftpClient.java      |  8 ++++++--
 .../sshd/client/subsystem/sftp/SftpFileSystem.java  |  4 ++--
 .../apache/sshd/common/PropertyResolverUtils.java   |  2 ++
 .../org/apache/sshd/common/channel/Channel.java     |  2 ++
 .../keys/loader/PrivateKeyEncryptionContext.java    |  5 +++--
 .../pem/AbstractPEMResourceKeyPairParser.java       |  1 -
 .../org/apache/sshd/common/digest/BaseDigest.java   |  1 -
 .../common/forward/DefaultForwardingFilter.java     |  1 -
 .../sshd/common/forward/ForwardingFilter.java       |  1 -
 .../PortForwardingEventListenerManagerHolder.java   |  1 +
 .../sshd/common/forward/TcpipClientChannel.java     |  5 ++---
 .../apache/sshd/common/future/DefaultSshFuture.java |  8 +++++++-
 .../apache/sshd/common/kex/KexFactoryManager.java   | 16 ++++++++++++++++
 .../common/keyprovider/KeyPairProviderHolder.java   |  1 +
 .../java/org/apache/sshd/common/scp/ScpHelper.java  |  1 -
 .../sshd/common/session/ConnectionService.java      |  1 +
 .../org/apache/sshd/common/session/Session.java     |  1 +
 .../common/signature/SignatureFactoriesManager.java |  5 +++++
 .../sshd/common/subsystem/sftp/SftpHelper.java      |  1 -
 .../org/apache/sshd/common/util/GenericUtils.java   |  2 ++
 .../apache/sshd/common/util/io/der/DERWriter.java   |  1 -
 .../sshd/server/ServerAuthenticationManager.java    | 10 ++++++++++
 .../org/apache/sshd/server/kex/DHGEXServer.java     |  1 -
 .../server/session/ServerProxyAcceptorHolder.java   |  1 +
 .../sftp/AbstractSftpEventListenerManager.java      |  1 -
 .../sftp/SftpFileSystemAccessorManager.java         |  1 +
 .../client/config/hosts/HostConfigEntryTest.java    |  1 +
 .../java/org/apache/sshd/client/kex/KexTest.java    |  1 -
 .../channel/ChannelPipedOutputStreamTest.java       |  6 +++---
 .../file/root/RootedFileSystemProviderTest.java     |  1 +
 .../java/org/apache/sshd/common/mac/MacTest.java    |  1 -
 .../sshd/server/auth/WelcomeBannerPhaseTest.java    |  1 -
 .../server/jaas/JaasPasswordAuthenticatorTest.java  |  2 --
 40 files changed, 91 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-checkstyle.xml
----------------------------------------------------------------------
diff --git a/sshd-checkstyle.xml b/sshd-checkstyle.xml
index 3a9f72e..0f5c66f 100644
--- a/sshd-checkstyle.xml
+++ b/sshd-checkstyle.xml
@@ -111,6 +111,12 @@
         <module name="NoWhitespaceAfter">
             <property name="tokens" value="ARRAY_INIT,BNOT,DEC,DOT,INC,LNOT,UNARY_MINUS,UNARY_PLUS" />
         </module>
+        <module name="EmptyLineSeparator">
+            <property name="tokens" value="IMPORT,CLASS_DEF,INTERFACE_DEF,STATIC_INIT,INSTANCE_INIT,METHOD_DEF,CTOR_DEF" />
+            <property name="allowMultipleEmptyLines" value="false" />
+            <property name="allowNoEmptyLineBetweenFields" value="true" />
+            <property name="allowMultipleEmptyLinesInsideClassMembers" value="false" />
+        </module>
         <module name="NoWhitespaceBefore" />
         <module name="GenericWhitespace"/>
         <module name="OperatorWrap" />

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/client/ClientAuthenticationManager.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/ClientAuthenticationManager.java b/sshd-core/src/main/java/org/apache/sshd/client/ClientAuthenticationManager.java
index c495c68..a9ae68c 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/ClientAuthenticationManager.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/ClientAuthenticationManager.java
@@ -77,6 +77,7 @@ public interface ClientAuthenticationManager extends KeyPairProviderHolder {
      * (i.e., no passwords available)
      */
     PasswordIdentityProvider getPasswordIdentityProvider();
+
     void setPasswordIdentityProvider(PasswordIdentityProvider provider);
 
     /**
@@ -116,6 +117,7 @@ public interface ClientAuthenticationManager extends KeyPairProviderHolder {
      * @return the {@link ServerKeyVerifier} to use - never {@code null}
      */
     ServerKeyVerifier getServerKeyVerifier();
+
     void setServerKeyVerifier(ServerKeyVerifier serverKeyVerifier);
 
     /**
@@ -123,6 +125,7 @@ public interface ClientAuthenticationManager extends KeyPairProviderHolder {
      * (may be {@code null} to indicate that no such communication is allowed)
      */
     UserInteraction getUserInteraction();
+
     void setUserInteraction(UserInteraction userInteraction);
 
     /**
@@ -130,20 +133,25 @@ public interface ClientAuthenticationManager extends KeyPairProviderHolder {
      * {@code null}/empty
      */
     List<NamedFactory<UserAuth>> getUserAuthFactories();
+
     default String getUserAuthFactoriesNameList() {
         return NamedResource.getNames(getUserAuthFactories());
     }
+
     default List<String> getUserAuthFactoriesNames() {
         return NamedResource.getNameList(getUserAuthFactories());
     }
 
     void setUserAuthFactories(List<NamedFactory<UserAuth>> userAuthFactories);
+
     default void setUserAuthFactoriesNameList(String names) {
         setUserAuthFactoriesNames(GenericUtils.split(names, ','));
     }
+
     default void setUserAuthFactoriesNames(String... names) {
         setUserAuthFactoriesNames(GenericUtils.isEmpty((Object[]) names) ? Collections.emptyList() : Arrays.asList(names));
     }
+
     default void setUserAuthFactoriesNames(Collection<String> names) {
         BuiltinUserAuthFactories.ParseResult result = BuiltinUserAuthFactories.parseFactoriesList(names);
         @SuppressWarnings({ "rawtypes", "unchecked" })

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/client/ClientFactoryManager.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/ClientFactoryManager.java b/sshd-core/src/main/java/org/apache/sshd/client/ClientFactoryManager.java
index 7d4a07b..31b2a22 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/ClientFactoryManager.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/ClientFactoryManager.java
@@ -83,6 +83,7 @@ public interface ClientFactoryManager
      * effective session parameters - never {@code null}
      */
     HostConfigEntryResolver getHostConfigEntryResolver();
+
     void setHostConfigEntryResolver(HostConfigEntryResolver resolver);
 
     /**
@@ -90,6 +91,7 @@ public interface ClientFactoryManager
      * key pair identities - never {@code null}
      */
     ClientIdentityLoader getClientIdentityLoader();
+
     void setClientIdentityLoader(ClientIdentityLoader loader);
 
     /**
@@ -98,5 +100,6 @@ public interface ClientFactoryManager
      * @see FilePasswordProvider#EMPTY
      */
     FilePasswordProvider getFilePasswordProvider();
+
     void setFilePasswordProvider(FilePasswordProvider provider);
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/client/auth/AbstractUserAuth.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/auth/AbstractUserAuth.java b/sshd-core/src/main/java/org/apache/sshd/client/auth/AbstractUserAuth.java
index 11c26a4..a1f9d18 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/auth/AbstractUserAuth.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/auth/AbstractUserAuth.java
@@ -75,6 +75,7 @@ public abstract class AbstractUserAuth extends AbstractLoggingBean implements Us
     }
 
     protected abstract boolean sendAuthDataRequest(ClientSession session, String service) throws Exception;
+
     protected abstract boolean processAuthDataRequest(ClientSession session, String service, Buffer buffer) throws Exception;
 
     @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/client/session/ClientProxyConnectorHolder.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientProxyConnectorHolder.java b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientProxyConnectorHolder.java
index ea98499..6de3bc3 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientProxyConnectorHolder.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientProxyConnectorHolder.java
@@ -24,5 +24,6 @@ package org.apache.sshd.client.session;
  */
 public interface ClientProxyConnectorHolder {
     ClientProxyConnector getClientProxyConnector();
+
     void setClientProxyConnector(ClientProxyConnector proxyConnector);
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/client/simple/AbstractSimpleClient.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/simple/AbstractSimpleClient.java b/sshd-core/src/main/java/org/apache/sshd/client/simple/AbstractSimpleClient.java
index 475c9d4..a5420c7 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/simple/AbstractSimpleClient.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/simple/AbstractSimpleClient.java
@@ -141,6 +141,7 @@ public abstract class AbstractSimpleClient extends AbstractLoggingBean implement
             return result;
         });
     }
+
     @Override
     public CloseableScpClient scpLogin(String host, String username, String password) throws IOException {
         return scpLogin(host, DEFAULT_PORT, username, password);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/DefaultSftpClient.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/DefaultSftpClient.java b/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/DefaultSftpClient.java
index 35400ae..8a72a3f 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/DefaultSftpClient.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/DefaultSftpClient.java
@@ -32,6 +32,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.NavigableMap;
 import java.util.Objects;
 import java.util.Set;
 import java.util.TreeMap;
@@ -64,8 +65,8 @@ public class DefaultSftpClient extends AbstractSftpClient {
     private final byte[] workBuf = new byte[Integer.BYTES];
     private final AtomicInteger versionHolder = new AtomicInteger(0);
     private final AtomicBoolean closing = new AtomicBoolean(false);
-    private final Map<String, byte[]> extensions = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
-    private final Map<String, byte[]> exposedExtensions = Collections.unmodifiableMap(extensions);
+    private final NavigableMap<String, byte[]> extensions = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
+    private final NavigableMap<String, byte[]> exposedExtensions = Collections.unmodifiableNavigableMap(extensions);
 
     public DefaultSftpClient(ClientSession clientSession) throws IOException {
         this.clientSession = Objects.requireNonNull(clientSession, "No client session");

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/SftpClient.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/SftpClient.java b/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/SftpClient.java
index eb22451..410fa22 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/SftpClient.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/SftpClient.java
@@ -34,6 +34,7 @@ import java.util.Comparator;
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Map;
+import java.util.NavigableMap;
 import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
@@ -537,10 +538,12 @@ public interface SftpClient extends SubsystemClient {
     default String getName() {
         return SftpConstants.SFTP_SUBSYSTEM_NAME;
     }
+
     /**
-     * @return An (unmodifiable) {@link Map} of the reported server extensions.
+     * @return An (unmodifiable) {@link NavigableMap} of the reported server extensions.
+     * where key=extension name (case <U>insensitive</U>)
      */
-    Map<String, byte[]> getServerExtensions();
+    NavigableMap<String, byte[]> getServerExtensions();
 
     boolean isClosing();
 
@@ -835,6 +838,7 @@ public interface SftpClient extends SubsystemClient {
 
     // see SSH_FXP_BLOCK / SSH_FXP_UNBLOCK for byte range locks
     void lock(Handle handle, long offset, long length, int mask) throws IOException;
+
     void unlock(Handle handle, long offset, long length) throws IOException;
 
     //

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/SftpFileSystem.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/SftpFileSystem.java b/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/SftpFileSystem.java
index d006d26..cd41691 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/SftpFileSystem.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/SftpFileSystem.java
@@ -30,7 +30,7 @@ import java.nio.file.attribute.UserPrincipalLookupService;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import java.util.Map;
+import java.util.NavigableMap;
 import java.util.Objects;
 import java.util.Queue;
 import java.util.Set;
@@ -236,7 +236,7 @@ public class SftpFileSystem extends BaseFileSystem<SftpPath> implements ClientSe
         }
 
         @Override
-        public Map<String, byte[]> getServerExtensions() {
+        public NavigableMap<String, byte[]> getServerExtensions() {
             return delegate.getServerExtensions();
         }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/common/PropertyResolverUtils.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/PropertyResolverUtils.java b/sshd-core/src/main/java/org/apache/sshd/common/PropertyResolverUtils.java
index 78ebea6..6677685 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/PropertyResolverUtils.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/PropertyResolverUtils.java
@@ -196,6 +196,7 @@ public final class PropertyResolverUtils {
             throw new IllegalArgumentException("Bad value type for enum conversion: " + value.getClass().getSimpleName());
         }
     }
+
     public static Object updateProperty(PropertyResolver resolver, String name, long value) {
         return updateProperty(resolver.getProperties(), name, value);
     }
@@ -306,6 +307,7 @@ public final class PropertyResolverUtils {
             return value;
         }
     }
+
     public static String getStringProperty(Map<String, ?> props, String name, String defaultValue) {
         Object value = resolvePropertyValue(props, name);
         if (value == null) {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/common/channel/Channel.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/Channel.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/Channel.java
index 2061d26..9aa0b0f 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/channel/Channel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/Channel.java
@@ -73,11 +73,13 @@ public interface Channel
     List<RequestHandler<Channel>> getRequestHandlers();
 
     void addRequestHandler(RequestHandler<Channel> handler);
+
     default void addRequestHandlers(Collection<? extends RequestHandler<Channel>> handlers) {
         GenericUtils.forEach(handlers, this::addRequestHandler);
     }
 
     void removeRequestHandler(RequestHandler<Channel> handler);
+
     default void removeRequestHandlers(Collection<? extends RequestHandler<Channel>> handlers) {
         GenericUtils.forEach(handlers, this::removeRequestHandler);
     }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/common/config/keys/loader/PrivateKeyEncryptionContext.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/config/keys/loader/PrivateKeyEncryptionContext.java b/sshd-core/src/main/java/org/apache/sshd/common/config/keys/loader/PrivateKeyEncryptionContext.java
index b935460..9d5eedc 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/config/keys/loader/PrivateKeyEncryptionContext.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/config/keys/loader/PrivateKeyEncryptionContext.java
@@ -23,7 +23,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import java.util.Map;
+import java.util.NavigableMap;
 import java.util.Objects;
 import java.util.SortedSet;
 import java.util.TreeMap;
@@ -37,7 +37,7 @@ import org.apache.sshd.common.util.ValidateUtils;
 public class PrivateKeyEncryptionContext implements Cloneable {
     public static final String  DEFAULT_CIPHER_MODE = "CBC";
 
-    private static final Map<String, PrivateKeyObfuscator> OBFUSCATORS =
+    private static final NavigableMap<String, PrivateKeyObfuscator> OBFUSCATORS =
         new TreeMap<String, PrivateKeyObfuscator>(String.CASE_INSENSITIVE_ORDER) {
             private static final long serialVersionUID = 1L;    // no serialization expected
 
@@ -211,6 +211,7 @@ public class PrivateKeyEncryptionContext implements Cloneable {
             throw new RuntimeException("Failed to clone: " + toString());
         }
     }
+
     @Override
     public int hashCode() {
         return GenericUtils.hashCode(getCipherName(), Boolean.TRUE)

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/common/config/keys/loader/pem/AbstractPEMResourceKeyPairParser.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/config/keys/loader/pem/AbstractPEMResourceKeyPairParser.java b/sshd-core/src/main/java/org/apache/sshd/common/config/keys/loader/pem/AbstractPEMResourceKeyPairParser.java
index 8c8d082..bee13d6 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/config/keys/loader/pem/AbstractPEMResourceKeyPairParser.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/config/keys/loader/pem/AbstractPEMResourceKeyPairParser.java
@@ -134,7 +134,6 @@ public abstract class AbstractPEMResourceKeyPairParser
                 throw new FailedLoginException("No password data for encrypted resource=" + resourceKey);
             }
 
-
             PrivateKeyEncryptionContext encContext = new PrivateKeyEncryptionContext(algInfo);
             encContext.setPassword(password);
             encContext.setInitVector(initVector);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/common/digest/BaseDigest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/digest/BaseDigest.java b/sshd-core/src/main/java/org/apache/sshd/common/digest/BaseDigest.java
index baa64ee..a5ef6f9 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/digest/BaseDigest.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/digest/BaseDigest.java
@@ -104,7 +104,6 @@ public class BaseDigest implements Digest {
         return h;
     }
 
-
     @Override
     public int compareTo(Digest that) {
         if (that == null) {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultForwardingFilter.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultForwardingFilter.java b/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultForwardingFilter.java
index 64f37db..b2403dd 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultForwardingFilter.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultForwardingFilter.java
@@ -789,7 +789,6 @@ public class DefaultForwardingFilter
             err = GenericUtils.accumulateException(err, e);
         }
 
-
         if (err != null) {
             throw err;
         }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/common/forward/ForwardingFilter.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/forward/ForwardingFilter.java b/sshd-core/src/main/java/org/apache/sshd/common/forward/ForwardingFilter.java
index 5c3583b..bb66562 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/forward/ForwardingFilter.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/forward/ForwardingFilter.java
@@ -18,7 +18,6 @@
  */
 package org.apache.sshd.common.forward;
 
-
 import java.io.IOException;
 
 import org.apache.sshd.common.Closeable;

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/common/forward/PortForwardingEventListenerManagerHolder.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/forward/PortForwardingEventListenerManagerHolder.java b/sshd-core/src/main/java/org/apache/sshd/common/forward/PortForwardingEventListenerManagerHolder.java
index 71a607b..dadcf85 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/forward/PortForwardingEventListenerManagerHolder.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/forward/PortForwardingEventListenerManagerHolder.java
@@ -34,5 +34,6 @@ public interface PortForwardingEventListenerManagerHolder {
     Collection<PortForwardingEventListenerManager> getRegisteredManagers();
 
     boolean addPortForwardingEventListenerManager(PortForwardingEventListenerManager manager);
+
     boolean removePortForwardingEventListenerManager(PortForwardingEventListenerManager manager);
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipClientChannel.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipClientChannel.java b/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipClientChannel.java
index 1f73590..673114e 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipClientChannel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipClientChannel.java
@@ -63,15 +63,14 @@ public class TcpipClientChannel extends AbstractClientChannel {
         this.remote = remote;
     }
 
-
     public OpenFuture getOpenFuture() {
         return openFuture;
     }
 
     @Override
     public synchronized OpenFuture open() throws IOException {
-        final InetSocketAddress src;
-        final InetSocketAddress dst;
+        InetSocketAddress src;
+        InetSocketAddress dst;
         switch (typeEnum) {
             case Direct:
                 src = (InetSocketAddress) serverSession.getRemoteAddress();

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultSshFuture.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultSshFuture.java b/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultSshFuture.java
index cb34411..db380c2 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultSshFuture.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultSshFuture.java
@@ -46,7 +46,7 @@ public class DefaultSshFuture<T extends SshFuture> extends AbstractSshFuture<T>
      * then synchronization occurs on {@code this} instance
      */
     public DefaultSshFuture(Object lock) {
-        this.lock = lock != null ? lock : this;
+        this.lock = (lock != null) ? lock : this;
     }
 
     @Override
@@ -159,6 +159,7 @@ public class DefaultSshFuture<T extends SshFuture> extends AbstractSshFuture<T>
         if (notifyNow) {
             notifyListener(listener);
         }
+
         return asT();
     }
 
@@ -220,4 +221,9 @@ public class DefaultSshFuture<T extends SshFuture> extends AbstractSshFuture<T>
     public void cancel() {
         setValue(CANCELED);
     }
+
+    @Override
+    public String toString() {
+        return getClass().getSimpleName() + "[value=" + result + "]";
+    }
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/common/kex/KexFactoryManager.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/kex/KexFactoryManager.java b/sshd-core/src/main/java/org/apache/sshd/common/kex/KexFactoryManager.java
index 898b5c5..7aa8cba 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/kex/KexFactoryManager.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/kex/KexFactoryManager.java
@@ -48,6 +48,7 @@ public interface KexFactoryManager extends KeyPairProviderHolder, SignatureFacto
      * @return a list of named <code>KeyExchange</code> factories, never {@code null}
      */
     List<NamedFactory<KeyExchange>> getKeyExchangeFactories();
+
     void setKeyExchangeFactories(List<NamedFactory<KeyExchange>> keyExchangeFactories);
 
     /**
@@ -56,20 +57,25 @@ public interface KexFactoryManager extends KeyPairProviderHolder, SignatureFacto
      * @return a list of named <code>Cipher</code> factories, never {@code null}
      */
     List<NamedFactory<Cipher>> getCipherFactories();
+
     default String getCipherFactoriesNameList() {
         return NamedResource.getNames(getCipherFactories());
     }
+
     default List<String> getCipherFactoriesNames() {
         return NamedResource.getNameList(getCipherFactories());
     }
 
     void setCipherFactories(List<NamedFactory<Cipher>> cipherFactories);
+
     default void setCipherFactoriesNameList(String names) {
         setCipherFactoriesNames(GenericUtils.split(names, ','));
     }
+
     default void setCipherFactoriesNames(String... names) {
         setCipherFactoriesNames(GenericUtils.isEmpty((Object[]) names) ? Collections.emptyList() : Arrays.asList(names));
     }
+
     default void setCipherFactoriesNames(Collection<String> names) {
         BuiltinCiphers.ParseResult result = BuiltinCiphers.parseCiphersList(names);
         @SuppressWarnings({ "rawtypes", "unchecked" })
@@ -86,20 +92,25 @@ public interface KexFactoryManager extends KeyPairProviderHolder, SignatureFacto
      * @return a list of named <code>Compression</code> factories, never {@code null}
      */
     List<NamedFactory<Compression>> getCompressionFactories();
+
     default String getCompressionFactoriesNameList() {
         return NamedResource.getNames(getCompressionFactories());
     }
+
     default List<String> getCompressionFactoriesNames() {
         return NamedResource.getNameList(getCompressionFactories());
     }
 
     void setCompressionFactories(List<NamedFactory<Compression>> compressionFactories);
+
     default void setCompressionFactoriesNameList(String names) {
         setCompressionFactoriesNames(GenericUtils.split(names, ','));
     }
+
     default void setCompressionFactoriesNames(String... names) {
         setCompressionFactoriesNames(GenericUtils.isEmpty((Object[]) names) ? Collections.emptyList() : Arrays.asList(names));
     }
+
     default void setCompressionFactoriesNames(Collection<String> names) {
         BuiltinCompressions.ParseResult result = BuiltinCompressions.parseCompressionsList(names);
         @SuppressWarnings({ "rawtypes", "unchecked" })
@@ -116,20 +127,25 @@ public interface KexFactoryManager extends KeyPairProviderHolder, SignatureFacto
      * @return a list of named <code>Mac</code> factories, never {@code null}
      */
     List<NamedFactory<Mac>> getMacFactories();
+
     default String getMacFactoriesNameList() {
         return NamedResource.getNames(getMacFactories());
     }
+
     default List<String> getMacFactoriesNames() {
         return NamedResource.getNameList(getMacFactories());
     }
 
     void setMacFactories(List<NamedFactory<Mac>> macFactories);
+
     default void setMacFactoriesNameList(String names) {
         setMacFactoriesNames(GenericUtils.split(names, ','));
     }
+
     default void setMacFactoriesNames(String... names) {
         setMacFactoriesNames(GenericUtils.isEmpty((Object[]) names) ? Collections.emptyList() : Arrays.asList(names));
     }
+
     default void setMacFactoriesNames(Collection<String> names) {
         BuiltinMacs.ParseResult result = BuiltinMacs.parseMacsList(names);
         @SuppressWarnings({ "rawtypes", "unchecked" })

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/KeyPairProviderHolder.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/KeyPairProviderHolder.java b/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/KeyPairProviderHolder.java
index b5826f6..553d553 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/KeyPairProviderHolder.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/KeyPairProviderHolder.java
@@ -30,5 +30,6 @@ public interface KeyPairProviderHolder {
      * @return the <code>KeyPairProvider</code>, never {@code null}
      */
     KeyPairProvider getKeyPairProvider();
+
     void setKeyPairProvider(KeyPairProvider keyPairProvider);
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/common/scp/ScpHelper.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/scp/ScpHelper.java b/sshd-core/src/main/java/org/apache/sshd/common/scp/ScpHelper.java
index 6631832..9918e02 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/scp/ScpHelper.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/scp/ScpHelper.java
@@ -741,7 +741,6 @@ public class ScpHelper extends AbstractLoggingBean implements SessionHolder<Sess
         out.write("E\n".getBytes(StandardCharsets.UTF_8));
         out.flush();
 
-
         readyCode = readAck(false);
         if (log.isDebugEnabled()) {
             log.debug("sendDir({})[{}] 'E' command reply code=", this, path, readyCode);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/common/session/ConnectionService.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/ConnectionService.java b/sshd-core/src/main/java/org/apache/sshd/common/session/ConnectionService.java
index 7c4aa22..823f800 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/session/ConnectionService.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/session/ConnectionService.java
@@ -64,5 +64,6 @@ public interface ConnectionService extends Service, PortForwardingEventListenerM
     X11ForwardSupport getX11ForwardSupport();
 
     boolean isAllowMoreSessions();
+
     void setAllowMoreSessions(boolean allow);
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/common/session/Session.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/Session.java b/sshd-core/src/main/java/org/apache/sshd/common/session/Session.java
index 6e00e26..6216188 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/session/Session.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/session/Session.java
@@ -287,6 +287,7 @@ public interface Session
     long getIdleTimeout();
 
     boolean isAuthenticated();
+
     void setAuthenticated() throws IOException;
 
     /**

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/common/signature/SignatureFactoriesManager.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/signature/SignatureFactoriesManager.java b/sshd-core/src/main/java/org/apache/sshd/common/signature/SignatureFactoriesManager.java
index 3b2d712..c9d876a 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/signature/SignatureFactoriesManager.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/signature/SignatureFactoriesManager.java
@@ -39,20 +39,25 @@ public interface SignatureFactoriesManager {
      * @return The list of named <code>Signature</code> factories
      */
     List<NamedFactory<Signature>> getSignatureFactories();
+
     default String getSignatureFactoriesNameList() {
         return NamedResource.getNames(getSignatureFactories());
     }
+
     default List<String> getSignatureFactoriesNames() {
         return NamedResource.getNameList(getSignatureFactories());
     }
 
     void setSignatureFactories(List<NamedFactory<Signature>> factories);
+
     default void setSignatureFactoriesNameList(String names) {
         setSignatureFactoriesNames(GenericUtils.split(names, ','));
     }
+
     default void setSignatureFactoriesNames(String... names) {
         setSignatureFactoriesNames(GenericUtils.isEmpty((Object[]) names) ? Collections.emptyList() : Arrays.asList(names));
     }
+
     default void setSignatureFactoriesNames(Collection<String> names) {
         BuiltinSignatures.ParseResult result = BuiltinSignatures.parseSignatureList(names);
         @SuppressWarnings({ "rawtypes", "unchecked" })

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/common/subsystem/sftp/SftpHelper.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/subsystem/sftp/SftpHelper.java b/sshd-core/src/main/java/org/apache/sshd/common/subsystem/sftp/SftpHelper.java
index ead2764..7b06e11 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/subsystem/sftp/SftpHelper.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/subsystem/sftp/SftpHelper.java
@@ -121,7 +121,6 @@ public final class SftpHelper {
             }
         });
 
-
     private SftpHelper() {
         throw new UnsupportedOperationException("No instance allowed");
     }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/common/util/GenericUtils.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/GenericUtils.java b/sshd-core/src/main/java/org/apache/sshd/common/util/GenericUtils.java
index 6bf6d20..99a0768 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/GenericUtils.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/GenericUtils.java
@@ -416,6 +416,7 @@ public final class GenericUtils {
 
         return false;
     }
+
     public static <T> void forEach(Iterable<T> values, Consumer<T> consumer) {
         if (isNotEmpty(values)) {
             values.forEach(consumer);
@@ -842,6 +843,7 @@ public final class GenericUtils {
             public boolean hasNext() {
                 return iterator.hasNext();
             }
+
             @Override
             public V next() {
                 return mapper.apply(iterator.next());

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/common/util/io/der/DERWriter.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/io/der/DERWriter.java b/sshd-core/src/main/java/org/apache/sshd/common/util/io/der/DERWriter.java
index a001e0e..bc603ee 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/io/der/DERWriter.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/io/der/DERWriter.java
@@ -118,7 +118,6 @@ public class DERWriter extends FilterOutputStream {
         return (b & 0x80) == 0;
     }
 
-
     public void writeObject(ASN1Object obj) throws IOException {
         Objects.requireNonNull(obj, "No ASN.1 object");
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/server/ServerAuthenticationManager.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/ServerAuthenticationManager.java b/sshd-core/src/main/java/org/apache/sshd/server/ServerAuthenticationManager.java
index 87e7fcd..1d3a96d 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/ServerAuthenticationManager.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/ServerAuthenticationManager.java
@@ -157,20 +157,25 @@ public interface ServerAuthenticationManager {
      * @return a list of named <code>UserAuth</code> factories, never {@code null}/empty
      */
     List<NamedFactory<UserAuth>> getUserAuthFactories();
+
     default String getUserAuthFactoriesNameList() {
         return NamedResource.getNames(getUserAuthFactories());
     }
+
     default List<String> getUserAuthFactoriesNames() {
         return NamedResource.getNameList(getUserAuthFactories());
     }
 
     void setUserAuthFactories(List<NamedFactory<UserAuth>> userAuthFactories);
+
     default void setUserAuthFactoriesNameList(String names) {
         setUserAuthFactoriesNames(GenericUtils.split(names, ','));
     }
+
     default void setUserAuthFactoriesNames(String... names) {
         setUserAuthFactoriesNames(GenericUtils.isEmpty((Object[]) names) ? Collections.emptyList() : Arrays.asList(names));
     }
+
     default void setUserAuthFactoriesNames(Collection<String> names) {
         BuiltinUserAuthFactories.ParseResult result = BuiltinUserAuthFactories.parseFactoriesList(names);
         @SuppressWarnings({ "rawtypes", "unchecked" })
@@ -190,6 +195,7 @@ public interface ServerAuthenticationManager {
      * @return the {@link PublickeyAuthenticator} or {@code null}
      */
     PublickeyAuthenticator getPublickeyAuthenticator();
+
     void setPasswordAuthenticator(PasswordAuthenticator passwordAuthenticator);
 
     /**
@@ -201,6 +207,7 @@ public interface ServerAuthenticationManager {
      * @return the {@link PasswordAuthenticator} or {@code null}
      */
     PasswordAuthenticator getPasswordAuthenticator();
+
     void setPublickeyAuthenticator(PublickeyAuthenticator publickeyAuthenticator);
 
     /**
@@ -212,6 +219,7 @@ public interface ServerAuthenticationManager {
      * @return The {@link KeyboardInteractiveAuthenticator} or {@code null}
      */
     KeyboardInteractiveAuthenticator getKeyboardInteractiveAuthenticator();
+
     void setKeyboardInteractiveAuthenticator(KeyboardInteractiveAuthenticator interactiveAuthenticator);
 
     /**
@@ -223,6 +231,7 @@ public interface ServerAuthenticationManager {
      * @return the {@link GSSAuthenticator} or {@code null}
      */
     GSSAuthenticator getGSSAuthenticator();
+
     void setGSSAuthenticator(GSSAuthenticator gssAuthenticator);
 
     /**
@@ -233,6 +242,7 @@ public interface ServerAuthenticationManager {
      * @return the {@link HostBasedAuthenticator} or {@code null}
      */
     HostBasedAuthenticator getHostBasedAuthenticator();
+
     void setHostBasedAuthenticator(HostBasedAuthenticator hostBasedAuthenticator);
 
     /**

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/server/kex/DHGEXServer.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/kex/DHGEXServer.java b/sshd-core/src/main/java/org/apache/sshd/server/kex/DHGEXServer.java
index d6fed30..39e93ca 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/kex/DHGEXServer.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/kex/DHGEXServer.java
@@ -171,7 +171,6 @@ public class DHGEXServer extends AbstractDHServerKeyExchange {
             dh.setF(e);
             k = dh.getK();
 
-
             byte[] k_s;
             KeyPair kp = Objects.requireNonNull(session.getHostKey(), "No server key pair available");
             String algo = session.getNegotiatedKexParameter(KexProposalOption.SERVERKEYS);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/server/session/ServerProxyAcceptorHolder.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/session/ServerProxyAcceptorHolder.java b/sshd-core/src/main/java/org/apache/sshd/server/session/ServerProxyAcceptorHolder.java
index ec519f5..ef7cf8d 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/session/ServerProxyAcceptorHolder.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/session/ServerProxyAcceptorHolder.java
@@ -24,5 +24,6 @@ package org.apache.sshd.server.session;
  */
 public interface ServerProxyAcceptorHolder {
     ServerProxyAcceptor getServerProxyAcceptor();
+
     void setServerProxyAcceptor(ServerProxyAcceptor proxyAcceptor);
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/AbstractSftpEventListenerManager.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/AbstractSftpEventListenerManager.java b/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/AbstractSftpEventListenerManager.java
index 9289458..11508b3 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/AbstractSftpEventListenerManager.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/AbstractSftpEventListenerManager.java
@@ -44,7 +44,6 @@ public abstract class AbstractSftpEventListenerManager implements SftpEventListe
         return sftpEventListenerProxy;
     }
 
-
     @Override
     public boolean addSftpEventListener(SftpEventListener listener) {
         return sftpEventListeners.add(SftpEventListener.validateListener(listener));

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpFileSystemAccessorManager.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpFileSystemAccessorManager.java b/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpFileSystemAccessorManager.java
index 9619794..616f9ce 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpFileSystemAccessorManager.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpFileSystemAccessorManager.java
@@ -24,5 +24,6 @@ package org.apache.sshd.server.subsystem.sftp;
  */
 public interface SftpFileSystemAccessorManager {
     SftpFileSystemAccessor getFileSystemAccessor();
+
     void setFileSystemAccessor(SftpFileSystemAccessor accessor);
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/test/java/org/apache/sshd/client/config/hosts/HostConfigEntryTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/client/config/hosts/HostConfigEntryTest.java b/sshd-core/src/test/java/org/apache/sshd/client/config/hosts/HostConfigEntryTest.java
index 3eeb6d4..05a32da 100644
--- a/sshd-core/src/test/java/org/apache/sshd/client/config/hosts/HostConfigEntryTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/client/config/hosts/HostConfigEntryTest.java
@@ -309,6 +309,7 @@ public class HostConfigEntryTest extends BaseTestSupport {
         assertNotNull("Missing resource " + resourceName, url);
         return HostConfigEntry.readHostConfigEntries(url);
     }
+
     private static void testCaseInsensitivePatternMatching(String value, Pattern pattern, boolean expected) {
         for (int index = 0; index < value.length(); index++) {
             boolean actual = HostPatternsHolder.isHostMatch(value, pattern);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/test/java/org/apache/sshd/client/kex/KexTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/client/kex/KexTest.java b/sshd-core/src/test/java/org/apache/sshd/client/kex/KexTest.java
index 5509799..9fe1aff 100644
--- a/sshd-core/src/test/java/org/apache/sshd/client/kex/KexTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/client/kex/KexTest.java
@@ -79,7 +79,6 @@ public class KexTest extends BaseTestSupport {
         return parameterize(BuiltinDHFactories.VALUES);
     }
 
-
     @BeforeClass
     public static void setupClientAndServer() throws Exception {
         sshd = Utils.setupTestServer(KexTest.class);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/test/java/org/apache/sshd/common/channel/ChannelPipedOutputStreamTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/common/channel/ChannelPipedOutputStreamTest.java b/sshd-core/src/test/java/org/apache/sshd/common/channel/ChannelPipedOutputStreamTest.java
index e8d3df8..eb2d61f 100644
--- a/sshd-core/src/test/java/org/apache/sshd/common/channel/ChannelPipedOutputStreamTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/common/channel/ChannelPipedOutputStreamTest.java
@@ -43,19 +43,19 @@ public class ChannelPipedOutputStreamTest extends BaseTestSupport {
     @Test
     public void testNioChannelImplementation() throws IOException {
         ChannelPipedSink sink = Mockito.mock(ChannelPipedSink.class);
-        final AtomicBoolean eofCalled = new AtomicBoolean(false);
+        AtomicBoolean eofCalled = new AtomicBoolean(false);
         Mockito.doAnswer(invocation -> {
             assertFalse("Multiple EOF calls", eofCalled.getAndSet(true));
             return null;
         }).when(sink).eof();
 
-
-        final AtomicInteger receiveCount = new AtomicInteger(0);
+        AtomicInteger receiveCount = new AtomicInteger(0);
         Mockito.doAnswer(invocation -> {
             Number len = invocation.getArgumentAt(2, Number.class);
             receiveCount.addAndGet(len.intValue());
             return null;
         }).when(sink).receive(Matchers.any(byte[].class), Matchers.anyInt(), Matchers.anyInt());
+
         try (ChannelPipedOutputStream stream = new ChannelPipedOutputStream(sink)) {
             assertTrue("Stream not marked as initially open", stream.isOpen());
             assertEquals("Unexpected initial receive count", 0, receiveCount.intValue());

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/test/java/org/apache/sshd/common/file/root/RootedFileSystemProviderTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/common/file/root/RootedFileSystemProviderTest.java b/sshd-core/src/test/java/org/apache/sshd/common/file/root/RootedFileSystemProviderTest.java
index 410e1f6..e63db36 100644
--- a/sshd-core/src/test/java/org/apache/sshd/common/file/root/RootedFileSystemProviderTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/common/file/root/RootedFileSystemProviderTest.java
@@ -214,6 +214,7 @@ public class RootedFileSystemProviderTest extends AssertableFile {
         Path link = FileHelper.createLink(fileSystem.getPath("../" + getCurrentTestName() + "link"), existing);
         fail(String.format("Unexpected success in linking file %s", link.toString()));
     }
+
     @Test
     public void testNewByteChannelProviderMismatchException() throws IOException {
         RootedFileSystemProvider provider = new RootedFileSystemProvider();

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/test/java/org/apache/sshd/common/mac/MacTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/common/mac/MacTest.java b/sshd-core/src/test/java/org/apache/sshd/common/mac/MacTest.java
index e92a5c5..5e24eb5 100644
--- a/sshd-core/src/test/java/org/apache/sshd/common/mac/MacTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/common/mac/MacTest.java
@@ -111,7 +111,6 @@ public class MacTest extends BaseTestSupport {
         return ret;
     }
 
-
     @BeforeClass
     public static void setupClientAndServer() throws Exception {
         JSchLogger.init();

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/test/java/org/apache/sshd/server/auth/WelcomeBannerPhaseTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/server/auth/WelcomeBannerPhaseTest.java b/sshd-core/src/test/java/org/apache/sshd/server/auth/WelcomeBannerPhaseTest.java
index bc5b2b2..35f032b 100644
--- a/sshd-core/src/test/java/org/apache/sshd/server/auth/WelcomeBannerPhaseTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/server/auth/WelcomeBannerPhaseTest.java
@@ -121,7 +121,6 @@ public class WelcomeBannerPhaseTest extends BaseTestSupport {
             }
         });
 
-
         try (ClientSession session = client.connect(getCurrentTestName(), TEST_LOCALHOST, port).verify(7L, TimeUnit.SECONDS).getSession()) {
             session.addPasswordIdentity(getCurrentTestName());
             session.auth().verify(5L, TimeUnit.SECONDS);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/55ca8818/sshd-core/src/test/java/org/apache/sshd/server/jaas/JaasPasswordAuthenticatorTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/server/jaas/JaasPasswordAuthenticatorTest.java b/sshd-core/src/test/java/org/apache/sshd/server/jaas/JaasPasswordAuthenticatorTest.java
index a37ab85..d147f2d 100644
--- a/sshd-core/src/test/java/org/apache/sshd/server/jaas/JaasPasswordAuthenticatorTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/server/jaas/JaasPasswordAuthenticatorTest.java
@@ -86,9 +86,7 @@ public class JaasPasswordAuthenticatorTest extends BaseTestSupport {
         assertFalse(auth.authenticate("sshd", "dummy"));
     }
 
-
     protected static class DummyLoginModule implements LoginModule {
-
         private Subject subject;
         private CallbackHandler callbackHandler;
 


[2/3] mina-sshd git commit: [SSHD-776] SSHD local port forwarding close session unexpectedly

Posted by lg...@apache.org.
[SSHD-776] SSHD local port forwarding close session unexpectedly


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

Branch: refs/heads/master
Commit: 0e99597aceb035d271f0140348df23d32b5e3bcd
Parents: 2529a4c
Author: Fulvio Cavarretta <fu...@primeur.com>
Authored: Wed Oct 11 18:21:11 2017 +0300
Committer: Lyor Goldstein <ly...@gmail.com>
Committed: Wed Oct 11 20:35:15 2017 +0300

----------------------------------------------------------------------
 .../sshd/common/channel/AbstractChannel.java    |  1 +
 .../apache/sshd/common/io/nio2/Nio2Session.java | 66 ++++++++++++--------
 .../helpers/AbstractConnectionService.java      | 15 ++++-
 .../sshd/server/forward/TcpipServerChannel.java | 63 ++++++++++---------
 4 files changed, 89 insertions(+), 56 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/0e99597a/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java
index 2a6c0e9..e1eebef 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java
@@ -776,6 +776,7 @@ public abstract class AbstractChannel
             throw err;
         }
     }
+
     @Override
     protected void doCloseImmediately() {
         if (service != null) {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/0e99597a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Session.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Session.java b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Session.java
index 0401224..a846562 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Session.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Session.java
@@ -133,11 +133,11 @@ public class Nio2Session extends AbstractCloseable implements IoSession {
     @Override
     public IoWriteFuture writePacket(Buffer buffer) throws IOException {
         if (log.isDebugEnabled()) {
-            log.debug("Writing {} bytes", buffer.available());
+            log.debug("writePacket({}) Writing {} bytes", this, buffer.available());
         }
 
         ByteBuffer buf = ByteBuffer.wrap(buffer.array(), buffer.rpos(), buffer.available());
-        final Nio2DefaultIoWriteFuture future = new Nio2DefaultIoWriteFuture(null, buf);
+        Nio2DefaultIoWriteFuture future = new Nio2DefaultIoWriteFuture(null, buf);
         if (isClosing()) {
             Throwable exc = new ClosedChannelException();
             future.setException(exc);
@@ -150,32 +150,33 @@ public class Nio2Session extends AbstractCloseable implements IoSession {
     }
 
     protected void exceptionCaught(Throwable exc) {
-        if (!closeFuture.isClosed()) {
-            AsynchronousSocketChannel socket = getSocket();
-            if (isClosing() || !socket.isOpen()) {
-                close(true);
-            } else {
-                IoHandler handler = getIoHandler();
-                try {
-                    if (log.isDebugEnabled()) {
-                        log.debug("exceptionCaught({}) caught {}[{}] - calling handler",
-                                  this, exc.getClass().getSimpleName(), exc.getMessage());
-                    }
-                    handler.exceptionCaught(this, exc);
-                } catch (Throwable e) {
-                    Throwable t = GenericUtils.peelException(e);
-                    if (log.isDebugEnabled()) {
-                        log.debug("exceptionCaught({}) Exception handler threw {}, closing the session: {}",
-                                  this, t.getClass().getSimpleName(), t.getMessage());
-                    }
+        if (closeFuture.isClosed()) {
+            return;
+        }
 
-                    if (log.isTraceEnabled()) {
-                        log.trace("exceptionCaught(" + this + ") exception handler failure details", t);
-                    }
-                    close(true);
+        AsynchronousSocketChannel socket = getSocket();
+        if (isOpen() && socket.isOpen()) {
+            IoHandler handler = getIoHandler();
+            try {
+                if (log.isDebugEnabled()) {
+                    log.debug("exceptionCaught({}) caught {}[{}] - calling handler",
+                              this, exc.getClass().getSimpleName(), exc.getMessage());
+                }
+                handler.exceptionCaught(this, exc);
+            } catch (Throwable e) {
+                Throwable t = GenericUtils.peelException(e);
+                if (log.isDebugEnabled()) {
+                    log.debug("exceptionCaught({}) Exception handler threw {}, closing the session: {}",
+                              this, t.getClass().getSimpleName(), t.getMessage());
+                }
+
+                if (log.isTraceEnabled()) {
+                    log.trace("exceptionCaught(" + this + ") exception handler failure details", t);
                 }
             }
         }
+
+        close(true);
     }
 
     @Override
@@ -193,12 +194,22 @@ public class Nio2Session extends AbstractCloseable implements IoSession {
 
     @Override
     protected void doCloseImmediately() {
-        for (;;) {
+        for (boolean debugEnabled = log.isDebugEnabled();;) {
             // Cancel pending requests informing them of the cancellation
             Nio2DefaultIoWriteFuture future = writes.poll();
             if (future != null) {
+                if (future.isWritten()) {
+                    if (debugEnabled) {
+                        log.debug("doCloseImmediately({}) skip already written future={}", this, future);
+                    }
+                    continue;
+                }
+
                 Throwable error = future.getException();
                 if (error == null) {
+                    if (debugEnabled) {
+                        log.debug("doCloseImmediately({}) signal write abort for future={}", this, future);
+                    }
                     future.setException(new WriteAbortedException("Write request aborted due to immediate session close", null));
                 }
             } else {
@@ -379,6 +390,11 @@ public class Nio2Session extends AbstractCloseable implements IoSession {
             if (log.isDebugEnabled()) {
                 log.debug("handleCompletedWriteCycle({}) finished writing len={}", this, writeLen);
             }
+
+            // This should be called before future.setWritten() to avoid WriteAbortedException
+            // to be thrown by doCloseImmediately when called in the listener of doCloseGracefully
+            writes.remove(future);
+
             future.setWritten();
             finishWrite(future);
         }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/0e99597a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractConnectionService.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractConnectionService.java b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractConnectionService.java
index 1524196..14db9b1 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractConnectionService.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractConnectionService.java
@@ -307,7 +307,8 @@ public abstract class AbstractConnectionService<S extends AbstractSession>
      */
     @Override
     public void unregisterChannel(Channel channel) {
-        Channel result = channels.remove(channel.getId());
+        int channelId = channel.getId();
+        Channel result = channels.remove(channelId);
         if (log.isDebugEnabled()) {
             log.debug("unregisterChannel({}) result={}", channel, result);
         }
@@ -436,8 +437,16 @@ public abstract class AbstractConnectionService<S extends AbstractSession>
      */
     public void channelWindowAdjust(Buffer buffer) throws IOException {
         try {
-            Channel channel = getChannel(buffer);
-            channel.handleWindowAdjust(buffer);
+            // Do not use getChannel to avoid the session being closed
+            // if receiving the SSH_MSG_CHANNEL_WINDOW_ADJUST on an already closed channel
+            int recipient = buffer.getInt();
+            Channel channel = channels.get(recipient);
+            if (channel != null) {
+                channel.handleWindowAdjust(buffer);
+            } else {
+                log.warn("Received SSH_MSG_CHANNEL_WINDOW_ADJUST on unknown channel " + recipient);
+            }
+
         } catch (SshException e) {
             if (log.isDebugEnabled()) {
                 log.debug("channelWindowAdjust {} error: {}", e.getClass().getSimpleName(), e.getMessage());

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/0e99597a/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java b/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java
index 57a5699..317e669 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java
@@ -232,7 +232,7 @@ public class TcpipServerChannel extends AbstractServerChannel {
     protected void handleChannelOpenFailure(OpenFuture f, Throwable problem) {
         signalChannelOpenFailure(problem);
         notifyStateChanged(problem.getClass().getSimpleName());
-        closeImmediately0();
+        close(true);
 
         if (problem instanceof ConnectException) {
             f.setException(new SshChannelOpenException(getId(), SshConstants.SSH_OPEN_CONNECT_FAILED, problem.getMessage(), problem));
@@ -241,44 +241,43 @@ public class TcpipServerChannel extends AbstractServerChannel {
         }
 
     }
-    private void closeImmediately0() {
-        // We need to close the channel immediately to remove it from the
-        // server session's channel table and *not* send a packet to the
-        // client.  A notification was already sent by our caller, or will
-        // be sent after we return.
-        //
-        super.close(true);
+
+    @Override
+    public CloseFuture close(boolean immediately) {
+        CloseFuture closingFeature = super.close(immediately);
 
         // We also need to dispose of the connector, but unfortunately we
         // are being invoked by the connector thread or the connector's
-        // own processor thread.  Disposing of the connector within either
-        // causes deadlock.  Instead create a thread to dispose of the
+        // own processor thread. Disposing of the connector within either
+        // causes deadlock. Instead create a thread to dispose of the
         // connector in the background.
-
         ExecutorService service = getExecutorService();
+
         // allocate a temporary executor service if none provided
-        final ExecutorService executors = (service == null)
+        ExecutorService executors = (service == null)
                 ? ThreadUtils.newSingleThreadExecutor("TcpIpServerChannel-ConnectorCleanup[" + getSession() + "]")
                 : service;
         // shutdown the temporary executor service if had to create it
-        final boolean shutdown = executors != service || isShutdownOnExit();
-        executors.submit(() -> {
-            try {
-                connector.close(true);
-            } finally {
-                if (shutdown && !executors.isShutdown()) {
-                    Collection<Runnable> runners = executors.shutdownNow();
+        boolean shutdown = (executors != service) || isShutdownOnExit();
+
+        return builder().when(closingFeature).run(() -> {
+            executors.submit(() -> {
+                try {
                     if (log.isDebugEnabled()) {
-                        log.debug("destroy({}) - shutdown executor service - runners count={}", TcpipServerChannel.this, runners.size());
+                        log.debug("disposing connector: {} for: {}", connector, TcpipServerChannel.this);
+                    }
+                    connector.close(immediately);
+                } finally {
+                    if (shutdown && (!executors.isShutdown())) {
+                        Collection<Runnable> runners = executors.shutdownNow();
+                        if (log.isDebugEnabled()) {
+                            log.debug("destroy({}) - shutdown executor service - runners count={}",
+                                      TcpipServerChannel.this, runners.size());
+                        }
                     }
                 }
-            }
-        });
-    }
-
-    @Override
-    public CloseFuture close(boolean immediately) {
-        return super.close(immediately).addListener(sshFuture -> closeImmediately0());
+            });
+        }).build().close(false);
     }
 
     @Override
@@ -328,6 +327,14 @@ public class TcpipServerChannel extends AbstractServerChannel {
                     + " len=" + len + " write failure details", t);
         }
 
-        session.exceptionCaught(t);
+        if (ioSession.isOpen()) {
+            session.exceptionCaught(t);
+        } else {
+            // In case remote entity has closed the socket (the ioSession), data coming from
+            // the SSH channel should be simply discarded
+            if (log.isDebugEnabled()) {
+                log.debug("Ignoring writeDataFailure {} because ioSession {} is already closing ", t, ioSession);
+            }
+        }
     }
 }


[3/3] mina-sshd git commit: Added identifier value to Future(s) for improved logging

Posted by lg...@apache.org.
Added identifier value to Future(s) for improved logging


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

Branch: refs/heads/master
Commit: 693fa5d90f54676de6655954046a8a4f5d09728a
Parents: 55ca881
Author: Lyor Goldstein <ly...@gmail.com>
Authored: Wed Oct 11 20:34:21 2017 +0300
Committer: Lyor Goldstein <ly...@gmail.com>
Committed: Wed Oct 11 20:35:16 2017 +0300

----------------------------------------------------------------------
 .../throttle/ThrottlingPacketWriterTest.java    |  2 +-
 .../agent/local/ChannelAgentForwarding.java     |  2 +-
 .../sshd/agent/unix/ChannelAgentForwarding.java |  2 +-
 .../java/org/apache/sshd/client/SshClient.java  | 29 ++++-----
 .../client/channel/AbstractClientChannel.java   |  4 +-
 .../sshd/client/channel/ChannelDirectTcpip.java |  2 +-
 .../sshd/client/future/DefaultAuthFuture.java   |  4 +-
 .../client/future/DefaultConnectFuture.java     |  4 +-
 .../sshd/client/future/DefaultOpenFuture.java   |  4 +-
 .../client/session/AbstractClientSession.java   |  2 +-
 .../client/session/ClientConnectionService.java |  4 +-
 .../sshd/client/session/ClientSessionImpl.java  |  2 +-
 .../client/session/ClientUserAuthService.java   |  2 +-
 .../subsystem/sftp/DefaultSftpClient.java       |  2 +-
 .../sshd/common/channel/AbstractChannel.java    |  9 +--
 .../common/channel/BufferedIoOutputStream.java  | 66 +++++++++++---------
 .../common/channel/ChannelAsyncInputStream.java |  8 ++-
 .../channel/ChannelAsyncOutputStream.java       |  7 ++-
 .../sshd/common/channel/IoWriteFutureImpl.java  |  4 +-
 .../common/forward/DefaultForwardingFilter.java |  2 +-
 .../sshd/common/forward/TcpipClientChannel.java |  4 +-
 .../sshd/common/future/AbstractSshFuture.java   | 19 +++++-
 .../sshd/common/future/DefaultCloseFuture.java  |  5 +-
 .../common/future/DefaultKeyExchangeFuture.java |  4 +-
 .../sshd/common/future/DefaultSshFuture.java    |  7 ++-
 .../future/DefaultVerifiableSshFuture.java      |  4 +-
 .../sshd/common/future/WaitableFuture.java      |  4 ++
 .../sshd/common/io/AbstractIoWriteFuture.java   |  4 +-
 .../sshd/common/io/mina/MinaConnector.java      |  2 +-
 .../apache/sshd/common/io/mina/MinaSession.java | 12 ++--
 .../sshd/common/io/nio2/Nio2Connector.java      |  6 +-
 .../io/nio2/Nio2DefaultIoWriteFuture.java       |  4 +-
 .../apache/sshd/common/io/nio2/Nio2Service.java |  2 +-
 .../apache/sshd/common/io/nio2/Nio2Session.java |  5 +-
 .../helpers/AbstractConnectionService.java      |  4 +-
 .../common/session/helpers/AbstractSession.java |  9 +--
 .../session/helpers/PendingWriteFuture.java     |  4 +-
 .../util/closeable/AbstractCloseable.java       |  3 +-
 .../sshd/common/util/closeable/Builder.java     | 26 ++++----
 .../common/util/closeable/FuturesCloseable.java |  4 +-
 .../util/closeable/ParallelCloseable.java       |  4 +-
 .../util/closeable/SequentialCloseable.java     |  4 +-
 .../common/util/closeable/SimpleCloseable.java  |  4 +-
 .../java/org/apache/sshd/server/SshServer.java  | 27 ++++----
 .../server/channel/AbstractServerChannel.java   |  2 +-
 .../sshd/server/channel/ChannelSession.java     |  4 +-
 .../sshd/server/forward/TcpipServerChannel.java |  4 +-
 .../sshd/server/x11/ChannelForwardedX11.java    |  2 +-
 .../common/future/DefaultSshFutureTest.java     | 32 +++++-----
 .../session/helpers/AbstractSessionTest.java    |  4 +-
 .../util/closeable/CloseableUtilsTest.java      |  7 ++-
 .../deprecated/ClientUserAuthServiceOld.java    |  4 +-
 .../sshd/util/test/AsyncEchoShellFactory.java   |  4 +-
 .../org/apache/sshd/util/test/BogusChannel.java |  2 +-
 54 files changed, 224 insertions(+), 173 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-contrib/src/test/java/org/apache/sshd/common/channel/throttle/ThrottlingPacketWriterTest.java
----------------------------------------------------------------------
diff --git a/sshd-contrib/src/test/java/org/apache/sshd/common/channel/throttle/ThrottlingPacketWriterTest.java b/sshd-contrib/src/test/java/org/apache/sshd/common/channel/throttle/ThrottlingPacketWriterTest.java
index 94958c8..056ff65 100644
--- a/sshd-contrib/src/test/java/org/apache/sshd/common/channel/throttle/ThrottlingPacketWriterTest.java
+++ b/sshd-contrib/src/test/java/org/apache/sshd/common/channel/throttle/ThrottlingPacketWriterTest.java
@@ -123,7 +123,7 @@ public class ThrottlingPacketWriterTest extends BaseTestSupport {
 
         @Override
         public IoWriteFuture writePacket(Buffer buffer) throws IOException {
-            return new IoWriteFutureImpl(buffer);
+            return new IoWriteFutureImpl(MockPacketWriter.class.getSimpleName(), buffer);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/agent/local/ChannelAgentForwarding.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/local/ChannelAgentForwarding.java b/sshd-core/src/main/java/org/apache/sshd/agent/local/ChannelAgentForwarding.java
index b7becde..a1868c7 100644
--- a/sshd-core/src/main/java/org/apache/sshd/agent/local/ChannelAgentForwarding.java
+++ b/sshd-core/src/main/java/org/apache/sshd/agent/local/ChannelAgentForwarding.java
@@ -52,7 +52,7 @@ public class ChannelAgentForwarding extends AbstractServerChannel {
 
     @Override
     protected OpenFuture doInit(Buffer buffer) {
-        OpenFuture f = new DefaultOpenFuture(this);
+        OpenFuture f = new DefaultOpenFuture(this, this);
         String changeEvent = "auth-agent";
         try {
             out = new ChannelOutputStream(this, getRemoteWindow(), log, SshConstants.SSH_MSG_CHANNEL_DATA, true);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java b/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java
index 969f330..395bd37 100644
--- a/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java
+++ b/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java
@@ -71,7 +71,7 @@ public class ChannelAgentForwarding extends AbstractServerChannel {
 
     @Override
     protected OpenFuture doInit(Buffer buffer) {
-        OpenFuture f = new DefaultOpenFuture(this);
+        OpenFuture f = new DefaultOpenFuture(this, this);
         try {
             out = new ChannelOutputStream(this, getRemoteWindow(), log, SshConstants.SSH_MSG_CHANNEL_DATA, true);
             authSocket = this.getString(SshAgent.SSH_AUTHSOCKET_ENV_NAME);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/client/SshClient.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/SshClient.java b/sshd-core/src/main/java/org/apache/sshd/client/SshClient.java
index ce4b192..0e8979e 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/SshClient.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/SshClient.java
@@ -456,21 +456,22 @@ public class SshClient extends AbstractFactoryManager implements ClientFactoryMa
 
     @Override
     protected Closeable getInnerCloseable() {
+        Object closeId = toString();
         return builder()
-                .run(() -> removeSessionTimeout(sessionFactory))
-                .sequential(connector, ioServiceFactory)
-                .run(() -> {
-                    connector = null;
-                    ioServiceFactory = null;
-                    if (shutdownExecutor && (executor != null) && (!executor.isShutdown())) {
-                        try {
-                            executor.shutdownNow();
-                        } finally {
-                            executor = null;
-                        }
+            .run(closeId, () -> removeSessionTimeout(sessionFactory))
+            .sequential(connector, ioServiceFactory)
+            .run(closeId, () -> {
+                connector = null;
+                ioServiceFactory = null;
+                if (shutdownExecutor && (executor != null) && (!executor.isShutdown())) {
+                    try {
+                        executor.shutdownNow();
+                    } finally {
+                        executor = null;
                     }
-                })
-                .build();
+                }
+            })
+            .build();
     }
 
     @Override
@@ -584,7 +585,7 @@ public class SshClient extends AbstractFactoryManager implements ClientFactoryMa
             throw new IllegalStateException("SshClient not started. Please call start() method before connecting to a server");
         }
 
-        ConnectFuture connectFuture = new DefaultConnectFuture(null);
+        ConnectFuture connectFuture = new DefaultConnectFuture(username + "@" + address, null);
         SshFutureListener<IoConnectFuture> listener = createConnectCompletionListener(connectFuture, username, address, identities, useDefaultIdentities);
         connector.connect(address).addListener(listener);
         return connectFuture;

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/client/channel/AbstractClientChannel.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/channel/AbstractClientChannel.java b/sshd-core/src/main/java/org/apache/sshd/client/channel/AbstractClientChannel.java
index 4159a53..4b61734 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/channel/AbstractClientChannel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/channel/AbstractClientChannel.java
@@ -175,7 +175,7 @@ public abstract class AbstractClientChannel extends AbstractChannel implements C
     protected Closeable getInnerCloseable() {
         return builder()
                 .when(openFuture)
-                .run(() -> {
+                .run(toString(), () -> {
                     // If the channel has not been opened yet,
                     // skip the SSH_MSG_CHANNEL_CLOSE exchange
                     if (openFuture == null) {
@@ -297,7 +297,7 @@ public abstract class AbstractClientChannel extends AbstractChannel implements C
             throw new SshException("Session has been closed");
         }
 
-        openFuture = new DefaultOpenFuture(lock);
+        openFuture = new DefaultOpenFuture(this.toString(), lock);
         if (log.isDebugEnabled()) {
             log.debug("open({}) Send SSH_MSG_CHANNEL_OPEN - type={}", this, type);
         }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelDirectTcpip.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelDirectTcpip.java b/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelDirectTcpip.java
index 5658e95..4ecfbf4 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelDirectTcpip.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelDirectTcpip.java
@@ -70,7 +70,7 @@ public class ChannelDirectTcpip extends AbstractClientChannel {
             throw new SshException("Session has been closed");
         }
 
-        openFuture = new DefaultOpenFuture(lock);
+        openFuture = new DefaultOpenFuture(remote, lock);
         if (log.isDebugEnabled()) {
             log.debug("open({}) SSH_MSG_CHANNEL_OPEN", this);
         }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultAuthFuture.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultAuthFuture.java b/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultAuthFuture.java
index da10342..4e5c406 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultAuthFuture.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultAuthFuture.java
@@ -31,8 +31,8 @@ import org.apache.sshd.common.future.DefaultVerifiableSshFuture;
  * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
  */
 public class DefaultAuthFuture extends DefaultVerifiableSshFuture<AuthFuture> implements AuthFuture {
-    public DefaultAuthFuture(Object lock) {
-        super(lock);
+    public DefaultAuthFuture(Object id, Object lock) {
+        super(id, lock);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultConnectFuture.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultConnectFuture.java b/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultConnectFuture.java
index e028690..e746954 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultConnectFuture.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultConnectFuture.java
@@ -32,8 +32,8 @@ import org.apache.sshd.common.io.IoSession;
  * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
  */
 public class DefaultConnectFuture extends DefaultVerifiableSshFuture<ConnectFuture> implements ConnectFuture {
-    public DefaultConnectFuture(Object lock) {
-        super(lock);
+    public DefaultConnectFuture(Object id, Object lock) {
+        super(id, lock);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultOpenFuture.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultOpenFuture.java b/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultOpenFuture.java
index c2ee400..aa91c92 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultOpenFuture.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultOpenFuture.java
@@ -30,8 +30,8 @@ import org.apache.sshd.common.future.DefaultVerifiableSshFuture;
  * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
  */
 public class DefaultOpenFuture extends DefaultVerifiableSshFuture<OpenFuture> implements OpenFuture {
-    public DefaultOpenFuture(Object lock) {
-        super(lock);
+    public DefaultOpenFuture(Object id, Object lock) {
+        super(id, lock);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/client/session/AbstractClientSession.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/session/AbstractClientSession.java b/sshd-core/src/main/java/org/apache/sshd/client/session/AbstractClientSession.java
index 4e9e6c9..b67310d 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/session/AbstractClientSession.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/session/AbstractClientSession.java
@@ -538,7 +538,7 @@ public abstract class AbstractClientSession extends AbstractSession implements C
         }
 
         if (kexState.compareAndSet(KexState.DONE, KexState.INIT)) {
-            DefaultKeyExchangeFuture kexFuture = new DefaultKeyExchangeFuture(null);
+            DefaultKeyExchangeFuture kexFuture = new DefaultKeyExchangeFuture(toString(), null);
             DefaultKeyExchangeFuture prev = kexFutureHolder.getAndSet(kexFuture);
             if (prev != null) {
                 synchronized (prev) {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java
index 145328e..869f0d1 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java
@@ -88,8 +88,8 @@ public class ClientConnectionService extends AbstractConnectionService<AbstractC
                 log.debug("Error (" + e.getClass().getSimpleName() + ") sending keepalive message=" + request + ": " + e.getMessage());
             }
 
-            final Throwable t = e;
-            return new AbstractIoWriteFuture(null) {
+            Throwable t = e;
+            return new AbstractIoWriteFuture(request, null) {
                 {
                     setValue(t);
                 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java
index 4ae713f..ba48841 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java
@@ -83,7 +83,7 @@ public class ClientSessionImpl extends AbstractClientSession {
             nextServiceFactory = null;
         }
 
-        authFuture = new DefaultAuthFuture(lock);
+        authFuture = new DefaultAuthFuture(ioSession.getRemoteAddress(), lock);
         authFuture.setAuthed(false);
 
         signalSessionCreated(ioSession);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java
index dbe4202..5c8339e 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java
@@ -121,7 +121,7 @@ public class ClientUserAuthService
 
         ClientSession session = getClientSession();
         // check if any previous future in use
-        AuthFuture authFuture = new DefaultAuthFuture(clientSession.getLock());
+        AuthFuture authFuture = new DefaultAuthFuture(service, clientSession.getLock());
         AuthFuture currentFuture = authFutureHolder.getAndSet(authFuture);
         if (currentFuture != null) {
             if (currentFuture.isDone()) {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/DefaultSftpClient.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/DefaultSftpClient.java b/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/DefaultSftpClient.java
index 8a72a3f..b72502c 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/DefaultSftpClient.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/DefaultSftpClient.java
@@ -125,7 +125,7 @@ public class DefaultSftpClient extends AbstractSftpClient {
     }
 
     @Override
-    public Map<String, byte[]> getServerExtensions() {
+    public NavigableMap<String, byte[]> getServerExtensions() {
         return exposedExtensions;
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java
index e1eebef..bb88256 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java
@@ -84,7 +84,7 @@ public abstract class AbstractChannel
     protected final AtomicBoolean eofReceived = new AtomicBoolean(false);
     protected final AtomicBoolean eofSent = new AtomicBoolean(false);
     protected AtomicReference<GracefulState> gracefulState = new AtomicReference<>(GracefulState.Opened);
-    protected final DefaultCloseFuture gracefulFuture = new DefaultCloseFuture(lock);
+    protected final DefaultCloseFuture gracefulFuture;
     /**
      * Channel events listener
      */
@@ -124,6 +124,7 @@ public abstract class AbstractChannel
 
     protected AbstractChannel(String discriminator, boolean client, Collection<? extends RequestHandler<Channel>> handlers) {
         super(discriminator);
+        gracefulFuture = new DefaultCloseFuture(discriminator, lock);
         localWindow = new Window(this, null, client, true);
         remoteWindow = new Window(this, null, client, false);
         channelListenerProxy = EventListenerUtils.proxyWrapper(ChannelListener.class, getClass().getClassLoader(), channelListeners);
@@ -352,7 +353,7 @@ public abstract class AbstractChannel
         }
 
         if (RequestHandler.Result.Replied.equals(result) || (!wantReply)) {
-            return new AbstractIoWriteFuture(null) {
+            return new AbstractIoWriteFuture(req, null) {
                 {
                     setValue(Boolean.TRUE);
                 }
@@ -788,14 +789,14 @@ public abstract class AbstractChannel
 
     @Override
     public IoWriteFuture writePacket(Buffer buffer) throws IOException {
+        Session s = getSession();
         if (!isClosing()) {
-            Session s = getSession();
             return s.writePacket(buffer);
         } else {
             if (log.isDebugEnabled()) {
                 log.debug("writePacket({}) Discarding output packet because channel is being closed", this);
             }
-            return new AbstractIoWriteFuture(null) {
+            return new AbstractIoWriteFuture(s.toString(), null) {
                 {
                     setValue(new EOFException("Channel is being closed"));
                 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/channel/BufferedIoOutputStream.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/BufferedIoOutputStream.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/BufferedIoOutputStream.java
index 6737a82..1cb75aa 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/channel/BufferedIoOutputStream.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/BufferedIoOutputStream.java
@@ -38,9 +38,15 @@ public class BufferedIoOutputStream extends AbstractInnerCloseable implements Io
     protected final IoOutputStream out;
     protected final Queue<IoWriteFutureImpl> writes = new ConcurrentLinkedQueue<>();
     protected final AtomicReference<IoWriteFutureImpl> currentWrite = new AtomicReference<>();
+    protected final Object id;
 
-    public BufferedIoOutputStream(IoOutputStream out) {
+    public BufferedIoOutputStream(Object id, IoOutputStream out) {
         this.out = out;
+        this.id = id;
+    }
+
+    public Object getId() {
+        return id;
     }
 
     @Override
@@ -49,46 +55,50 @@ public class BufferedIoOutputStream extends AbstractInnerCloseable implements Io
             throw new EOFException("Closed");
         }
 
-        IoWriteFutureImpl future = new IoWriteFutureImpl(buffer);
+        IoWriteFutureImpl future = new IoWriteFutureImpl(getId(), buffer);
         writes.add(future);
         startWriting();
         return future;
     }
 
     protected void startWriting() throws IOException {
-        final IoWriteFutureImpl future = writes.peek();
-        if (future != null) {
-            if (currentWrite.compareAndSet(null, future)) {
-                out.writePacket(future.getBuffer()).addListener(new SshFutureListener<IoWriteFuture>() {
-                    @Override
-                    public void operationComplete(IoWriteFuture f) {
-                        if (f.isWritten()) {
-                            future.setValue(Boolean.TRUE);
-                        } else {
-                            future.setValue(f.getException());
-                        }
-                        finishWrite();
-                    }
+        IoWriteFutureImpl future = writes.peek();
+        if (future == null) {
+            return;
+        }
 
-                    @SuppressWarnings("synthetic-access")
-                    private void finishWrite() {
-                        writes.remove(future);
-                        currentWrite.compareAndSet(future, null);
-                        try {
-                            startWriting();
-                        } catch (IOException e) {
-                            log.error("finishWrite({}) failed ({}) re-start writing", out, e.getClass().getSimpleName());
-                        }
-                    }
-                });
-            }
+        if (!currentWrite.compareAndSet(null, future)) {
+            return;
         }
+
+        out.writePacket(future.getBuffer()).addListener(new SshFutureListener<IoWriteFuture>() {
+            @Override
+            public void operationComplete(IoWriteFuture f) {
+                if (f.isWritten()) {
+                    future.setValue(Boolean.TRUE);
+                } else {
+                    future.setValue(f.getException());
+                }
+                finishWrite();
+            }
+
+            @SuppressWarnings("synthetic-access")
+            private void finishWrite() {
+                writes.remove(future);
+                currentWrite.compareAndSet(future, null);
+                try {
+                    startWriting();
+                } catch (IOException e) {
+                    log.error("finishWrite({}) failed ({}) re-start writing", out, e.getClass().getSimpleName());
+                }
+            }
+        });
     }
 
     @Override
     protected Closeable getInnerCloseable() {
         return builder()
-                .when(writes)
+                .when(getId(), writes)
                 .close(out)
                 .build();
     }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncInputStream.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncInputStream.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncInputStream.java
index 0be24fe..be34737 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncInputStream.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncInputStream.java
@@ -40,10 +40,12 @@ import org.apache.sshd.common.util.closeable.AbstractCloseable;
 public class ChannelAsyncInputStream extends AbstractCloseable implements IoInputStream, ChannelHolder {
     private final Channel channelInstance;
     private final Buffer buffer = new ByteArrayBuffer();
+    private final Object readFutureId;
     private IoReadFutureImpl pending;
 
     public ChannelAsyncInputStream(Channel channel) {
         this.channelInstance = Objects.requireNonNull(channel, "No channel");
+        this.readFutureId = toString();
     }
 
     @Override
@@ -60,7 +62,7 @@ public class ChannelAsyncInputStream extends AbstractCloseable implements IoInpu
 
     @Override
     public IoReadFuture read(Buffer buf) {
-        IoReadFutureImpl future = new IoReadFutureImpl(buf);
+        IoReadFutureImpl future = new IoReadFutureImpl(readFutureId, buf);
         if (isClosing()) {
             future.setValue(new IOException("Closed"));
         } else {
@@ -140,8 +142,8 @@ public class ChannelAsyncInputStream extends AbstractCloseable implements IoInpu
     public static class IoReadFutureImpl extends DefaultVerifiableSshFuture<IoReadFuture> implements IoReadFuture {
         private final Buffer buffer;
 
-        public IoReadFutureImpl(Buffer buffer) {
-            super(null);
+        public IoReadFutureImpl(Object id, Buffer buffer) {
+            super(id, null);
             this.buffer = buffer;
         }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncOutputStream.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncOutputStream.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncOutputStream.java
index e525355..b0e715e 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncOutputStream.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncOutputStream.java
@@ -39,11 +39,13 @@ public class ChannelAsyncOutputStream extends AbstractCloseable implements IoOut
     private final PacketWriter packetWriter;
     private final byte cmd;
     private final AtomicReference<IoWriteFutureImpl> pendingWrite = new AtomicReference<>();
+    private final Object packetWriteId;
 
     public ChannelAsyncOutputStream(Channel channel, byte cmd) {
         this.channelInstance = Objects.requireNonNull(channel, "No channel");
         this.packetWriter = channelInstance.resolveChannelStreamPacketWriter(channel, cmd);
         this.cmd = cmd;
+        this.packetWriteId = channel.toString() + "[" + SshConstants.getCommandMessageName(cmd) + "]";
     }
 
     @Override
@@ -61,7 +63,7 @@ public class ChannelAsyncOutputStream extends AbstractCloseable implements IoOut
             throw new EOFException("Closed");
         }
 
-        IoWriteFutureImpl future = new IoWriteFutureImpl(buffer);
+        IoWriteFutureImpl future = new IoWriteFutureImpl(packetWriteId, buffer);
         if (!pendingWrite.compareAndSet(null, future)) {
             throw new WritePendingException("No write pending future");
         }
@@ -75,7 +77,8 @@ public class ChannelAsyncOutputStream extends AbstractCloseable implements IoOut
             try {
                 packetWriter.close();
             } catch (IOException e) {
-                log.error("preClose({}) Failed ({}) to pre-close packet writer: {}", this, e.getClass().getSimpleName(), e.getMessage());
+                log.error("preClose({}) Failed ({}) to pre-close packet writer: {}",
+                        this, e.getClass().getSimpleName(), e.getMessage());
             }
         }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/channel/IoWriteFutureImpl.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/IoWriteFutureImpl.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/IoWriteFutureImpl.java
index 1822c92..5c5b41c 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/channel/IoWriteFutureImpl.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/IoWriteFutureImpl.java
@@ -30,8 +30,8 @@ import org.apache.sshd.common.util.buffer.Buffer;
 public class IoWriteFutureImpl extends AbstractIoWriteFuture {
     private final Buffer buffer;
 
-    public IoWriteFutureImpl(Buffer buffer) {
-        super(null);
+    public IoWriteFutureImpl(Object id, Buffer buffer) {
+        super(id, null);
         this.buffer = Objects.requireNonNull(buffer, "No buffer provided");
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultForwardingFilter.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultForwardingFilter.java b/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultForwardingFilter.java
index b2403dd..1017f64 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultForwardingFilter.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultForwardingFilter.java
@@ -858,7 +858,7 @@ public class DefaultForwardingFilter
 
     @Override
     protected synchronized Closeable getInnerCloseable() {
-        return builder().parallel(dynamicLocal.values()).close(acceptor).build();
+        return builder().parallel(toString(), dynamicLocal.values()).close(acceptor).build();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipClientChannel.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipClientChannel.java b/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipClientChannel.java
index 673114e..f55dca1 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipClientChannel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipClientChannel.java
@@ -83,10 +83,12 @@ public class TcpipClientChannel extends AbstractClientChannel {
             default:
                 throw new SshException("Unknown client channel type: " + typeEnum);
         }
+
         if (closeFuture.isClosed()) {
             throw new SshException("Session has been closed");
         }
-        openFuture = new DefaultOpenFuture(lock);
+
+        openFuture = new DefaultOpenFuture(src, lock);
         if (log.isDebugEnabled()) {
             log.debug("open({}) send SSH_MSG_CHANNEL_OPEN", this);
         }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/future/AbstractSshFuture.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/future/AbstractSshFuture.java b/sshd-core/src/main/java/org/apache/sshd/common/future/AbstractSshFuture.java
index f10f0f5..b1217c4 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/future/AbstractSshFuture.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/future/AbstractSshFuture.java
@@ -37,8 +37,18 @@ public abstract class AbstractSshFuture<T extends SshFuture> extends AbstractLog
      */
     protected static final Object CANCELED = new Object();
 
-    protected AbstractSshFuture() {
-        super();
+    private final Object id;
+
+    /**
+     * @param id Some identifier useful as {@link #toString()} value
+     */
+    protected AbstractSshFuture(Object id) {
+        this.id = id;
+    }
+
+    @Override
+    public Object getId() {
+        return id;
     }
 
     @Override
@@ -154,4 +164,9 @@ public abstract class AbstractSshFuture<T extends SshFuture> extends AbstractLog
     protected T asT() {
         return (T) this;
     }
+
+    @Override
+    public String toString() {
+        return getClass().getSimpleName() + "[id=" + getId() + "]";
+    }
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultCloseFuture.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultCloseFuture.java b/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultCloseFuture.java
index 3de2d01..4c34a06 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultCloseFuture.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultCloseFuture.java
@@ -28,11 +28,12 @@ public class DefaultCloseFuture extends DefaultSshFuture<CloseFuture> implements
     /**
      * Create a new instance
      *
+     * @param id Some identifier useful as {@link #toString()} value
      * @param lock A synchronization object for locking access - if {@code null}
      * then synchronization occurs on {@code this} instance
      */
-    public DefaultCloseFuture(Object lock) {
-        super(lock);
+    public DefaultCloseFuture(Object id, Object lock) {
+        super(id, lock);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultKeyExchangeFuture.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultKeyExchangeFuture.java b/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultKeyExchangeFuture.java
index 68029c5..880bb2a 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultKeyExchangeFuture.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultKeyExchangeFuture.java
@@ -27,8 +27,8 @@ import org.apache.sshd.common.SshException;
  * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
  */
 public class DefaultKeyExchangeFuture extends DefaultVerifiableSshFuture<KeyExchangeFuture> implements KeyExchangeFuture {
-    public DefaultKeyExchangeFuture(Object lock) {
-        super(lock);
+    public DefaultKeyExchangeFuture(Object id, Object lock) {
+        super(id, lock);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultSshFuture.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultSshFuture.java b/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultSshFuture.java
index db380c2..d05ce3b 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultSshFuture.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultSshFuture.java
@@ -42,10 +42,13 @@ public class DefaultSshFuture<T extends SshFuture> extends AbstractSshFuture<T>
     /**
      * Creates a new instance.
      *
+     * @param id Some identifier useful as {@link #toString()} value
      * @param lock A synchronization object for locking access - if {@code null}
      * then synchronization occurs on {@code this} instance
      */
-    public DefaultSshFuture(Object lock) {
+    public DefaultSshFuture(Object id, Object lock) {
+        super(id);
+
         this.lock = (lock != null) ? lock : this;
     }
 
@@ -224,6 +227,6 @@ public class DefaultSshFuture<T extends SshFuture> extends AbstractSshFuture<T>
 
     @Override
     public String toString() {
-        return getClass().getSimpleName() + "[value=" + result + "]";
+        return super.toString() + "[value=" + result + "]";
     }
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultVerifiableSshFuture.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultVerifiableSshFuture.java b/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultVerifiableSshFuture.java
index 64b8094..1b02fed 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultVerifiableSshFuture.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/future/DefaultVerifiableSshFuture.java
@@ -24,7 +24,7 @@ package org.apache.sshd.common.future;
  * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
  */
 public abstract class DefaultVerifiableSshFuture<T extends SshFuture> extends DefaultSshFuture<T> implements VerifiableFuture<T> {
-    protected DefaultVerifiableSshFuture(Object lock) {
-        super(lock);
+    protected DefaultVerifiableSshFuture(Object id, Object lock) {
+        super(id, lock);
     }
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/future/WaitableFuture.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/future/WaitableFuture.java b/sshd-core/src/main/java/org/apache/sshd/common/future/WaitableFuture.java
index ba84820..aff4adc 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/future/WaitableFuture.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/future/WaitableFuture.java
@@ -32,6 +32,10 @@ import java.util.concurrent.TimeUnit;
  * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
  */
 public interface WaitableFuture {
+    /**
+     * @return Some identifier useful as {@link #toString()} value
+     */
+    Object getId();
 
     /**
      * Wait {@link Long#MAX_VALUE} msec. for the asynchronous operation to complete.

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/io/AbstractIoWriteFuture.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/AbstractIoWriteFuture.java b/sshd-core/src/main/java/org/apache/sshd/common/io/AbstractIoWriteFuture.java
index 755d5a5..947b678 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/AbstractIoWriteFuture.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/AbstractIoWriteFuture.java
@@ -28,8 +28,8 @@ import org.apache.sshd.common.future.DefaultVerifiableSshFuture;
  * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
  */
 public abstract class AbstractIoWriteFuture extends DefaultVerifiableSshFuture<IoWriteFuture> implements IoWriteFuture {
-    protected AbstractIoWriteFuture(Object lock) {
-        super(lock);
+    protected AbstractIoWriteFuture(Object id, Object lock) {
+        super(id, lock);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaConnector.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaConnector.java b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaConnector.java
index 4b48787..e7da612 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaConnector.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaConnector.java
@@ -77,7 +77,7 @@ public class MinaConnector extends MinaService implements org.apache.sshd.common
     public IoConnectFuture connect(SocketAddress address) {
         class Future extends DefaultSshFuture<IoConnectFuture> implements IoConnectFuture {
             Future(Object lock) {
-                super(lock);
+                super(address, lock);
             }
 
             @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaSession.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaSession.java b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaSession.java
index 02dd74c..81d5b18 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaSession.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaSession.java
@@ -38,15 +38,17 @@ import org.apache.sshd.common.util.closeable.AbstractInnerCloseable;
 import org.apache.sshd.common.util.closeable.IoBaseCloseable;
 
 /**
+ * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
  */
 public class MinaSession extends AbstractInnerCloseable implements IoSession {
-
     private final MinaService service;
     private final org.apache.mina.core.session.IoSession session;
+    private final Object sessionWriteId;
 
     public MinaSession(MinaService service, org.apache.mina.core.session.IoSession session) {
         this.service = service;
         this.session = session;
+        this.sessionWriteId = Objects.toString(session);
     }
 
     public org.apache.mina.core.session.IoSession getSession() {
@@ -87,7 +89,7 @@ public class MinaSession extends AbstractInnerCloseable implements IoSession {
     protected Closeable getInnerCloseable() {
         return new IoBaseCloseable() {
             @SuppressWarnings("synthetic-access")
-            private final DefaultCloseFuture future = new DefaultCloseFuture(lock);
+            private final DefaultCloseFuture future = new DefaultCloseFuture(MinaSession.this.toString(), lock);
 
             @SuppressWarnings("synthetic-access")
             @Override
@@ -138,7 +140,7 @@ public class MinaSession extends AbstractInnerCloseable implements IoSession {
 
     // NOTE !!! data buffer may NOT be re-used when method returns - at least until IoWriteFuture is signalled
     public IoWriteFuture write(IoBuffer buffer) {
-        final Future future = new Future(null);
+        Future future = new Future(sessionWriteId, null);
         session.write(buffer).addListener((IoFutureListener<WriteFuture>) cf -> {
             Throwable t = cf.getException();
             if (t != null) {
@@ -151,8 +153,8 @@ public class MinaSession extends AbstractInnerCloseable implements IoSession {
     }
 
     public static class Future extends AbstractIoWriteFuture {
-        public Future(Object lock) {
-            super(lock);
+        public Future(Object id, Object lock) {
+            super(id, lock);
         }
 
         public void setWritten() {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Connector.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Connector.java b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Connector.java
index ad81b74..68397b1 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Connector.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Connector.java
@@ -48,7 +48,7 @@ public class Nio2Connector extends Nio2Service implements IoConnector {
             log.debug("Connecting to {}", address);
         }
 
-        IoConnectFuture future = new DefaultIoConnectFuture(null);
+        IoConnectFuture future = new DefaultIoConnectFuture(address, null);
         AsynchronousSocketChannel channel = null;
         AsynchronousSocketChannel socket = null;
         try {
@@ -151,8 +151,8 @@ public class Nio2Connector extends Nio2Service implements IoConnector {
     }
 
     public static class DefaultIoConnectFuture extends DefaultSshFuture<IoConnectFuture> implements IoConnectFuture {
-        public DefaultIoConnectFuture(Object lock) {
-            super(lock);
+        public DefaultIoConnectFuture(Object id, Object lock) {
+            super(id, lock);
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2DefaultIoWriteFuture.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2DefaultIoWriteFuture.java b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2DefaultIoWriteFuture.java
index b6a5b43..dbdac9e 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2DefaultIoWriteFuture.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2DefaultIoWriteFuture.java
@@ -29,8 +29,8 @@ import org.apache.sshd.common.io.AbstractIoWriteFuture;
 public class Nio2DefaultIoWriteFuture extends AbstractIoWriteFuture {
     private final ByteBuffer buffer;
 
-    public Nio2DefaultIoWriteFuture(Object lock, ByteBuffer buffer) {
-        super(lock);
+    public Nio2DefaultIoWriteFuture(Object id, Object lock, ByteBuffer buffer) {
+        super(id, lock);
         this.buffer = buffer;
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Service.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Service.java b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Service.java
index 2686415..763b54c 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Service.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Service.java
@@ -111,7 +111,7 @@ public abstract class Nio2Service extends AbstractInnerCloseable implements IoSe
 
     @Override
     protected Closeable getInnerCloseable() {
-        return builder().parallel(sessions.values()).build();
+        return builder().parallel(toString(), sessions.values()).build();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Session.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Session.java b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Session.java
index a846562..c8bcf89 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Session.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Session.java
@@ -137,7 +137,7 @@ public class Nio2Session extends AbstractCloseable implements IoSession {
         }
 
         ByteBuffer buf = ByteBuffer.wrap(buffer.array(), buffer.rpos(), buffer.available());
-        Nio2DefaultIoWriteFuture future = new Nio2DefaultIoWriteFuture(null, buf);
+        Nio2DefaultIoWriteFuture future = new Nio2DefaultIoWriteFuture(getRemoteAddress(), null, buf);
         if (isClosing()) {
             Throwable exc = new ClosedChannelException();
             future.setException(exc);
@@ -181,7 +181,8 @@ public class Nio2Session extends AbstractCloseable implements IoSession {
 
     @Override
     protected CloseFuture doCloseGracefully() {
-        return builder().when(writes).run(() -> {
+        Object closeId = toString();
+        return builder().when(closeId, writes).run(closeId, () -> {
             try {
                 AsynchronousSocketChannel socket = getSocket();
                 socket.shutdownOutput();

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractConnectionService.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractConnectionService.java b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractConnectionService.java
index 14db9b1..83ae0d8 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractConnectionService.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractConnectionService.java
@@ -254,7 +254,7 @@ public abstract class AbstractConnectionService<S extends AbstractSession>
     protected Closeable getInnerCloseable() {
         return builder()
                 .sequential(forwarderHolder.get(), agentForwardHolder.get(), x11ForwardHolder.get())
-                .parallel(channels.values())
+                .parallel(toString(), channels.values())
                 .build();
     }
 
@@ -697,7 +697,7 @@ public abstract class AbstractConnectionService<S extends AbstractSession>
         }
 
         if (RequestHandler.Result.Replied.equals(result) || (!wantReply)) {
-            return new AbstractIoWriteFuture(null) {
+            return new AbstractIoWriteFuture(req, null) {
                 {
                     setValue(Boolean.TRUE);
                 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSession.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSession.java b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSession.java
index 5d01de4..9d25fa9 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSession.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSession.java
@@ -927,7 +927,7 @@ public abstract class AbstractSession extends AbstractKexFactoryManager implemen
     @Override
     protected Closeable getInnerCloseable() {
         return builder()
-                .parallel(getServices())
+                .parallel(toString(), getServices())
                 .close(ioSession)
                 .build();
     }
@@ -1018,13 +1018,14 @@ public abstract class AbstractSession extends AbstractKexFactoryManager implemen
         if (!KexState.DONE.equals(kexState.get())) {
             byte cmd = buffer.array()[buffer.rpos()];
             if (cmd > SshConstants.SSH_MSG_KEX_LAST) {
+                String cmdName = SshConstants.getCommandMessageName(cmd & 0xFF);
                 synchronized (pendingPackets) {
                     if (!KexState.DONE.equals(kexState.get())) {
                         if (pendingPackets.isEmpty()) {
                             log.debug("writePacket({})[{}] Start flagging packets as pending until key exchange is done",
-                                      this, SshConstants.getCommandMessageName(cmd & 0xFF));
+                                      this, cmdName);
                         }
-                        PendingWriteFuture future = new PendingWriteFuture(buffer);
+                        PendingWriteFuture future = new PendingWriteFuture(cmdName, buffer);
                         pendingPackets.add(future);
                         return future;
                     }
@@ -2396,7 +2397,7 @@ public abstract class AbstractSession extends AbstractKexFactoryManager implemen
         log.info("requestNewKeysExchange({}) Initiating key re-exchange", this);
         sendKexInit();
 
-        DefaultKeyExchangeFuture newFuture = new DefaultKeyExchangeFuture(null);
+        DefaultKeyExchangeFuture newFuture = new DefaultKeyExchangeFuture(toString(), null);
         DefaultKeyExchangeFuture kexFuture = kexFutureHolder.getAndSet(newFuture);
         if (kexFuture != null) {
             synchronized (kexFuture) {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/PendingWriteFuture.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/PendingWriteFuture.java b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/PendingWriteFuture.java
index bfc7e46..9ce4b4f 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/PendingWriteFuture.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/PendingWriteFuture.java
@@ -33,8 +33,8 @@ import org.apache.sshd.common.util.buffer.Buffer;
 public class PendingWriteFuture extends AbstractIoWriteFuture implements SshFutureListener<IoWriteFuture> {
     private final Buffer buffer;
 
-    public PendingWriteFuture(Buffer buffer) {
-        super(null);
+    public PendingWriteFuture(Object id, Buffer buffer) {
+        super(id, null);
         this.buffer = Objects.requireNonNull(buffer, "No buffer provided");
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/AbstractCloseable.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/AbstractCloseable.java b/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/AbstractCloseable.java
index 1c5d78f..0a4c169 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/AbstractCloseable.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/AbstractCloseable.java
@@ -49,7 +49,7 @@ public abstract class AbstractCloseable extends IoBaseCloseable {
     /**
      * A future that will be set 'closed' when the object is actually closed
      */
-    protected final CloseFuture closeFuture = new DefaultCloseFuture(lock);
+    protected final CloseFuture closeFuture;
 
     protected AbstractCloseable() {
         this("");
@@ -57,6 +57,7 @@ public abstract class AbstractCloseable extends IoBaseCloseable {
 
     protected AbstractCloseable(String discriminator) {
         super(discriminator);
+        closeFuture = new DefaultCloseFuture(discriminator, lock);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/Builder.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/Builder.java b/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/Builder.java
index 15e9da3..847d49c 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/Builder.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/Builder.java
@@ -39,8 +39,8 @@ public final class Builder implements ObjectBuilder<Closeable> {
         this.lock = Objects.requireNonNull(lock, "No lock");
     }
 
-    public Builder run(Runnable r) {
-        return close(new SimpleCloseable(lock) {
+    public Builder run(Object id, Runnable r) {
+        return close(new SimpleCloseable(id, lock) {
             @Override
             protected void doClose(boolean immediately) {
                 try {
@@ -55,7 +55,7 @@ public final class Builder implements ObjectBuilder<Closeable> {
     @SuppressWarnings("rawtypes")
     public <T extends SshFuture> Builder when(SshFuture<T> future) {
         if (future != null) {
-            when(Collections.singleton(future));
+            when(future.getId(), Collections.singleton(future));
         }
         return this;
     }
@@ -63,12 +63,12 @@ public final class Builder implements ObjectBuilder<Closeable> {
     @SuppressWarnings("rawtypes")
     @SafeVarargs
     public final <T extends SshFuture> Builder when(SshFuture<T>... futures) {
-        return when(Arrays.asList(futures));
+        return when(getClass().getSimpleName(), Arrays.asList(futures));
     }
 
     @SuppressWarnings("rawtypes")
-    public <T extends SshFuture> Builder when(Iterable<? extends SshFuture<T>> futures) {
-        return close(new FuturesCloseable<>(lock, futures));
+    public <T extends SshFuture> Builder when(Object id, Iterable<? extends SshFuture<T>> futures) {
+        return close(new FuturesCloseable<>(id, lock, futures));
     }
 
     public Builder sequential(Closeable... closeables) {
@@ -78,21 +78,21 @@ public final class Builder implements ObjectBuilder<Closeable> {
         return this;
     }
 
-    public Builder sequential(Iterable<Closeable> closeables) {
-        return close(new SequentialCloseable(lock, closeables));
+    public Builder sequential(Object id, Iterable<Closeable> closeables) {
+        return close(new SequentialCloseable(id, lock, closeables));
     }
 
     public Builder parallel(Closeable... closeables) {
         if (closeables.length == 1) {
             close(closeables[0]);
         } else if (closeables.length > 0) {
-            parallel(Arrays.asList(closeables));
+            parallel(getClass().getSimpleName(), Arrays.asList(closeables));
         }
         return this;
     }
 
-    public Builder parallel(Iterable<? extends Closeable> closeables) {
-        return close(new ParallelCloseable(lock, closeables));
+    public Builder parallel(Object id, Iterable<? extends Closeable> closeables) {
+        return close(new ParallelCloseable(id, lock, closeables));
     }
 
     public Builder close(Closeable c) {
@@ -105,11 +105,11 @@ public final class Builder implements ObjectBuilder<Closeable> {
     @Override
     public Closeable build() {
         if (closeables.isEmpty()) {
-            return new SimpleCloseable(lock);
+            return new SimpleCloseable(getClass().getSimpleName(), lock);
         } else if (closeables.size() == 1) {
             return closeables.get(0);
         } else {
-            return new SequentialCloseable(lock, closeables);
+            return new SequentialCloseable(getClass().getSimpleName(), lock, closeables);
         }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/FuturesCloseable.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/FuturesCloseable.java b/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/FuturesCloseable.java
index 2a24ffc..13dffb7 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/FuturesCloseable.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/FuturesCloseable.java
@@ -34,8 +34,8 @@ public class FuturesCloseable<T extends SshFuture> extends SimpleCloseable {
 
     private final Iterable<? extends SshFuture<T>> futures;
 
-    public FuturesCloseable(Object lock, Iterable<? extends SshFuture<T>> futures) {
-        super(lock);
+    public FuturesCloseable(Object id, Object lock, Iterable<? extends SshFuture<T>> futures) {
+        super(id, lock);
         this.futures = (futures == null) ? Collections.emptyList() : futures;
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/ParallelCloseable.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/ParallelCloseable.java b/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/ParallelCloseable.java
index 029c9a0..16634cc 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/ParallelCloseable.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/ParallelCloseable.java
@@ -35,8 +35,8 @@ public class ParallelCloseable extends SimpleCloseable {
 
     private final Iterable<? extends Closeable> closeables;
 
-    public ParallelCloseable(Object lock, Iterable<? extends Closeable> closeables) {
-        super(lock);
+    public ParallelCloseable(Object id, Object lock, Iterable<? extends Closeable> closeables) {
+        super(id, lock);
         this.closeables = (closeables == null) ? Collections.emptyList() : closeables;
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/SequentialCloseable.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/SequentialCloseable.java b/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/SequentialCloseable.java
index 67abd88..c018b00 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/SequentialCloseable.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/SequentialCloseable.java
@@ -34,8 +34,8 @@ import org.apache.sshd.common.future.SshFutureListener;
 public class SequentialCloseable extends SimpleCloseable {
     private final Iterable<? extends Closeable> closeables;
 
-    public SequentialCloseable(Object lock, Iterable<? extends Closeable> closeables) {
-        super(lock);
+    public SequentialCloseable(Object id, Object lock, Iterable<? extends Closeable> closeables) {
+        super(id, lock);
         this.closeables = (closeables == null) ? Collections.emptyList() : closeables;
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/SimpleCloseable.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/SimpleCloseable.java b/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/SimpleCloseable.java
index 8978972..58e2932 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/SimpleCloseable.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/SimpleCloseable.java
@@ -32,8 +32,8 @@ public class SimpleCloseable extends IoBaseCloseable {
     protected final DefaultCloseFuture future;
     protected final AtomicBoolean closing;
 
-    public SimpleCloseable(Object lock) {
-        future = new DefaultCloseFuture(lock);
+    public SimpleCloseable(Object id, Object lock) {
+        future = new DefaultCloseFuture(id, lock);
         closing = new AtomicBoolean();
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/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 0985b2b..0d1d421 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
@@ -349,21 +349,22 @@ public class SshServer extends AbstractFactoryManager implements ServerFactoryMa
 
     @Override
     protected Closeable getInnerCloseable() {
+        Object closeId = toString();
         return builder()
-                .run(() -> removeSessionTimeout(sessionFactory))
-                .sequential(acceptor, ioServiceFactory)
-                .run(() -> {
-                    acceptor = null;
-                    ioServiceFactory = null;
-                    if (shutdownExecutor && (executor != null) && (!executor.isShutdown())) {
-                        try {
-                            executor.shutdownNow();
-                        } finally {
-                            executor = null;
-                        }
+            .run(closeId, () -> removeSessionTimeout(sessionFactory))
+            .sequential(acceptor, ioServiceFactory)
+            .run(closeId, () -> {
+                acceptor = null;
+                ioServiceFactory = null;
+                if (shutdownExecutor && (executor != null) && (!executor.isShutdown())) {
+                    try {
+                        executor.shutdownNow();
+                    } finally {
+                        executor = null;
                     }
-                })
-                .build();
+                }
+            })
+            .build();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/server/channel/AbstractServerChannel.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/channel/AbstractServerChannel.java b/sshd-core/src/main/java/org/apache/sshd/server/channel/AbstractServerChannel.java
index c976c3b..2f3a766 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/channel/AbstractServerChannel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/channel/AbstractServerChannel.java
@@ -86,7 +86,7 @@ public abstract class AbstractServerChannel extends AbstractChannel implements S
     }
 
     protected OpenFuture doInit(Buffer buffer) {
-        OpenFuture f = new DefaultOpenFuture(this);
+        OpenFuture f = new DefaultOpenFuture(this, this);
         String changeEvent = "doInit";
         try {
             signalChannelOpenSuccess();

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java b/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
index 44a5087..b7c4712 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
@@ -95,7 +95,7 @@ public class ChannelSession extends AbstractServerChannel {
     protected Buffer tempBuffer;
     protected final AtomicBoolean commandStarted = new AtomicBoolean(false);
     protected final StandardEnvironment env = new StandardEnvironment();
-    protected final CloseFuture commandExitFuture = new DefaultCloseFuture(lock);
+    protected final CloseFuture commandExitFuture;
 
     public ChannelSession() {
         this(DEFAULT_HANDLERS);
@@ -103,6 +103,8 @@ public class ChannelSession extends AbstractServerChannel {
 
     public ChannelSession(Collection<? extends RequestHandler<Channel>> handlers) {
         super(handlers);
+
+        commandExitFuture = new DefaultCloseFuture(getClass().getSimpleName(), lock);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java b/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java
index 317e669..8b8d201 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java
@@ -131,7 +131,7 @@ public class TcpipServerChannel extends AbstractServerChannel {
         Session session = getSession();
         FactoryManager manager = Objects.requireNonNull(session.getFactoryManager(), "No factory manager");
         TcpForwardingFilter filter = manager.getTcpForwardingFilter();
-        OpenFuture f = new DefaultOpenFuture(this);
+        OpenFuture f = new DefaultOpenFuture(this, this);
         try {
             if ((address == null) || (filter == null) || (!filter.canConnect(type, address, session))) {
                 if (log.isDebugEnabled()) {
@@ -260,7 +260,7 @@ public class TcpipServerChannel extends AbstractServerChannel {
         // shutdown the temporary executor service if had to create it
         boolean shutdown = (executors != service) || isShutdownOnExit();
 
-        return builder().when(closingFeature).run(() -> {
+        return builder().when(closingFeature).run(toString(), () -> {
             executors.submit(() -> {
                 try {
                     if (log.isDebugEnabled()) {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/main/java/org/apache/sshd/server/x11/ChannelForwardedX11.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/x11/ChannelForwardedX11.java b/sshd-core/src/main/java/org/apache/sshd/server/x11/ChannelForwardedX11.java
index 6f99fed..42c3c38 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/x11/ChannelForwardedX11.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/x11/ChannelForwardedX11.java
@@ -53,7 +53,7 @@ public class ChannelForwardedX11 extends AbstractClientChannel {
         if (closeFuture.isClosed()) {
             throw new SshException("Session has been closed");
         }
-        openFuture = new DefaultOpenFuture(lock);
+        openFuture = new DefaultOpenFuture(remote, lock);
 
         Session session = getSession();
         if (log.isDebugEnabled()) {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/test/java/org/apache/sshd/common/future/DefaultSshFutureTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/common/future/DefaultSshFutureTest.java b/sshd-core/src/test/java/org/apache/sshd/common/future/DefaultSshFutureTest.java
index 4d3edb2..6125693 100644
--- a/sshd-core/src/test/java/org/apache/sshd/common/future/DefaultSshFutureTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/common/future/DefaultSshFutureTest.java
@@ -38,8 +38,8 @@ public class DefaultSshFutureTest extends BaseTestSupport {
     @Test
     @SuppressWarnings("rawtypes")
     public void testAwaitUninterrupted() {
-        final DefaultSshFuture future = new DefaultSshFuture(null);
-        final Object expected = new Object();
+        DefaultSshFuture future = new DefaultSshFuture(getCurrentTestName(), null);
+        Object expected = new Object();
         new Thread() {
             @Override
             public void run() {
@@ -59,16 +59,16 @@ public class DefaultSshFutureTest extends BaseTestSupport {
     @Test
     @SuppressWarnings({ "rawtypes", "unchecked" })
     public void testNotifyMultipleListeners() {
-        final DefaultSshFuture future = new DefaultSshFuture(null);
-        final AtomicInteger listenerCount = new AtomicInteger(0);
-        final Object expected = new Object();
-        final SshFutureListener listener = f -> {
+        DefaultSshFuture future = new DefaultSshFuture(getCurrentTestName(), null);
+        AtomicInteger listenerCount = new AtomicInteger(0);
+        Object expected = new Object();
+        SshFutureListener listener = f -> {
             assertSame("Mismatched future instance", future, f);
             assertSame("Mismatched value object", expected, future.getValue());
             listenerCount.incrementAndGet();
         };
 
-        final int numListeners = Byte.SIZE;
+        int numListeners = Byte.SIZE;
         for (int index = 0; index < numListeners; index++) {
             future.addListener(listener);
         }
@@ -80,10 +80,10 @@ public class DefaultSshFutureTest extends BaseTestSupport {
     @Test
     @SuppressWarnings({ "rawtypes", "unchecked" })
     public void testListenerInvokedDirectlyAfterResultSet() {
-        final DefaultSshFuture future = new DefaultSshFuture(null);
-        final AtomicInteger listenerCount = new AtomicInteger(0);
-        final Object expected = new Object();
-        final SshFutureListener listener = f -> {
+        DefaultSshFuture future = new DefaultSshFuture(getCurrentTestName(), null);
+        AtomicInteger listenerCount = new AtomicInteger(0);
+        Object expected = new Object();
+        SshFutureListener listener = f -> {
             assertSame("Mismatched future instance", future, f);
             assertSame("Mismatched value object", expected, future.getValue());
             listenerCount.incrementAndGet();
@@ -98,7 +98,7 @@ public class DefaultSshFutureTest extends BaseTestSupport {
     @Test
     @SuppressWarnings({ "rawtypes", "unchecked" })
     public void testAddAndRemoveRegisteredListenersBeforeResultSet() {
-        DefaultSshFuture future = new DefaultSshFuture(null);
+        DefaultSshFuture future = new DefaultSshFuture(getCurrentTestName(), null);
         SshFutureListener listener = Mockito.mock(SshFutureListener.class);
         for (int index = 1; index <= Byte.SIZE; index++) {
             future.addListener(listener);
@@ -114,10 +114,10 @@ public class DefaultSshFutureTest extends BaseTestSupport {
     @Test
     @SuppressWarnings({ "rawtypes", "unchecked" })
     public void testListenerNotRemovedIfResultSet() {
-        final DefaultSshFuture future = new DefaultSshFuture(null);
-        final AtomicInteger listenerCount = new AtomicInteger(0);
-        final Object expected = new Object();
-        final SshFutureListener listener = f -> {
+        DefaultSshFuture future = new DefaultSshFuture(getCurrentTestName(), null);
+        AtomicInteger listenerCount = new AtomicInteger(0);
+        Object expected = new Object();
+        SshFutureListener listener = f -> {
             assertSame("Mismatched future instance", future, f);
             assertSame("Mismatched value object", expected, future.getValue());
             listenerCount.incrementAndGet();

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/test/java/org/apache/sshd/common/session/helpers/AbstractSessionTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/common/session/helpers/AbstractSessionTest.java b/sshd-core/src/test/java/org/apache/sshd/common/session/helpers/AbstractSessionTest.java
index 538f2cd..026dab2 100644
--- a/sshd-core/src/test/java/org/apache/sshd/common/session/helpers/AbstractSessionTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/common/session/helpers/AbstractSessionTest.java
@@ -298,7 +298,7 @@ public class AbstractSessionTest extends BaseTestSupport {
         private final CloseFuture closeFuture;
 
         public MyIoSession() {
-            closeFuture = new DefaultCloseFuture(open);
+            closeFuture = new DefaultCloseFuture(Test.class.getSimpleName(), open);
         }
 
         @Override
@@ -369,7 +369,7 @@ public class AbstractSessionTest extends BaseTestSupport {
                 throw new WriteAbortedException("Failed to offer outgoing buffer", new IllegalStateException("Offer failure"));
             }
 
-            IoWriteFutureImpl future = new IoWriteFutureImpl(buffer);
+            IoWriteFutureImpl future = new IoWriteFutureImpl(Test.class.getSimpleName(), buffer);
             future.setValue(Boolean.TRUE);
             return future;
         }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/test/java/org/apache/sshd/common/util/closeable/CloseableUtilsTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/common/util/closeable/CloseableUtilsTest.java b/sshd-core/src/test/java/org/apache/sshd/common/util/closeable/CloseableUtilsTest.java
index f8f5a0d..6bea23b 100644
--- a/sshd-core/src/test/java/org/apache/sshd/common/util/closeable/CloseableUtilsTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/common/util/closeable/CloseableUtilsTest.java
@@ -110,9 +110,9 @@ public class CloseableUtilsTest extends BaseTestSupport {
 
     @Test
     public void testCloseImmediateCalledAndWait() throws Exception {
-        final DefaultCloseFuture future = new DefaultCloseFuture(this);
-        final AtomicInteger callsCount = new AtomicInteger(0);
-        final Closeable closeable = new IoBaseCloseable() {
+        DefaultCloseFuture future = new DefaultCloseFuture(this, this);
+        AtomicInteger callsCount = new AtomicInteger(0);
+        Closeable closeable = new IoBaseCloseable() {
             @Override
             public CloseFuture close(boolean immediately) {
                 assertTrue("Closure is not immediate", immediately);
@@ -140,6 +140,7 @@ public class CloseableUtilsTest extends BaseTestSupport {
                 return false;
             }
         };
+
         ExecutorService service = ThreadUtils.newSingleThreadExecutor(getCurrentTestName());
         try {
             Future<?> task = service.submit((Runnable) () -> {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/test/java/org/apache/sshd/deprecated/ClientUserAuthServiceOld.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/deprecated/ClientUserAuthServiceOld.java b/sshd-core/src/test/java/org/apache/sshd/deprecated/ClientUserAuthServiceOld.java
index 4e8e11d..3224913 100644
--- a/sshd-core/src/test/java/org/apache/sshd/deprecated/ClientUserAuthServiceOld.java
+++ b/sshd-core/src/test/java/org/apache/sshd/deprecated/ClientUserAuthServiceOld.java
@@ -75,7 +75,7 @@ public class ClientUserAuthServiceOld extends AbstractCloseable implements Servi
         session = (ClientSessionImpl) s;
         lock = session.getLock();
         // Maintain the current auth status in the authFuture.
-        authFuture = new DefaultAuthFuture(lock);
+        authFuture = new DefaultAuthFuture(s.toString(), lock);
     }
 
     @Override
@@ -150,7 +150,7 @@ public class ClientUserAuthServiceOld extends AbstractCloseable implements Servi
         // Set up the next round of authentication.  Each round gets a new lock.
         this.userAuth = userAuth;
         // The new future !isDone() - i.e., in progress blocking out other waits.
-        this.authFuture = new DefaultAuthFuture(lock);
+        this.authFuture = new DefaultAuthFuture(getClass().getSimpleName(), lock);
         log.debug("ready to try authentication with new lock");
         return true;
     }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/test/java/org/apache/sshd/util/test/AsyncEchoShellFactory.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/util/test/AsyncEchoShellFactory.java b/sshd-core/src/test/java/org/apache/sshd/util/test/AsyncEchoShellFactory.java
index b0ff4bb..67d1516 100644
--- a/sshd-core/src/test/java/org/apache/sshd/util/test/AsyncEchoShellFactory.java
+++ b/sshd-core/src/test/java/org/apache/sshd/util/test/AsyncEchoShellFactory.java
@@ -99,12 +99,12 @@ public class AsyncEchoShellFactory implements Factory<Command> {
 
         @Override
         public void setIoOutputStream(IoOutputStream out) {
-            this.out = new BufferedIoOutputStream(out);
+            this.out = new BufferedIoOutputStream("STDOUT", out);
         }
 
         @Override
         public void setIoErrorStream(IoOutputStream err) {
-            this.err = new BufferedIoOutputStream(err);
+            this.err = new BufferedIoOutputStream("STDERR", err);
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/693fa5d9/sshd-core/src/test/java/org/apache/sshd/util/test/BogusChannel.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/util/test/BogusChannel.java b/sshd-core/src/test/java/org/apache/sshd/util/test/BogusChannel.java
index 96bb36d..afab75d 100644
--- a/sshd-core/src/test/java/org/apache/sshd/util/test/BogusChannel.java
+++ b/sshd-core/src/test/java/org/apache/sshd/util/test/BogusChannel.java
@@ -50,7 +50,7 @@ public class BogusChannel extends AbstractChannel {
 
     @Override
     public OpenFuture open(int recipient, long rwsize, long rmpsize, Buffer buffer) {
-        return new DefaultOpenFuture(this.lock);
+        return new DefaultOpenFuture(this, this.lock);
     }
 
     @Override