diff --git a/driver-core/src/main/com/mongodb/connection/TlsChannelStreamFactoryFactory.java b/driver-core/src/main/com/mongodb/connection/TlsChannelStreamFactoryFactory.java index 5b1277c7f37..877798c03bd 100644 --- a/driver-core/src/main/com/mongodb/connection/TlsChannelStreamFactoryFactory.java +++ b/driver-core/src/main/com/mongodb/connection/TlsChannelStreamFactoryFactory.java @@ -203,7 +203,7 @@ public boolean supportsAdditionalTimeout() { @Override public boolean supportsConcurrentClose() { - return false; + return true; } @Override diff --git a/driver-core/src/main/com/mongodb/internal/connection/tlschannel/async/AsynchronousTlsChannelGroup.java b/driver-core/src/main/com/mongodb/internal/connection/tlschannel/async/AsynchronousTlsChannelGroup.java index 70c47668e11..beb4d0ad051 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/tlschannel/async/AsynchronousTlsChannelGroup.java +++ b/driver-core/src/main/com/mongodb/internal/connection/tlschannel/async/AsynchronousTlsChannelGroup.java @@ -29,6 +29,7 @@ import com.mongodb.internal.connection.tlschannel.util.Util; import java.io.IOException; +import java.nio.channels.AsynchronousCloseException; import java.nio.channels.CancelledKeyException; import java.nio.channels.ClosedChannelException; import java.nio.channels.InterruptedByTimeoutException; @@ -121,7 +122,9 @@ class RegisteredSocket { public void close() { doCancelRead(this, null); doCancelWrite(this, null); - key.cancel(); + if (key != null) { + key.cancel(); + } currentRegistrations.getAndDecrement(); /* * Actual de-registration from the selector will happen asynchronously. @@ -263,6 +266,9 @@ boolean doCancelRead(final RegisteredSocket socket, final ReadOperation op) { try { // a null op means cancel any operation if (op != null && socket.readOperation == op || op == null && socket.readOperation != null) { + if (op == null) { + socket.readOperation.onFailure.accept(new AsynchronousCloseException()); + } socket.readOperation = null; cancelledReads.increment(); currentReads.decrement(); @@ -280,6 +286,9 @@ boolean doCancelWrite(final RegisteredSocket socket, final WriteOperation op) { try { // a null op means cancel any operation if (op != null && socket.writeOperation == op || op == null && socket.writeOperation != null) { + if (op == null) { + socket.writeOperation.onFailure.accept(new AsynchronousCloseException()); + } socket.writeOperation = null; cancelledWrites.increment(); currentWrites.decrement();