THRIFT-5869: Close the transport after TServerEventHandler deleteContext
diff --git a/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java b/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java
index af2bc63..310bb78 100644
--- a/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java
+++ b/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java
@@ -477,9 +477,12 @@
|| state_ == FrameBufferState.AWAITING_CLOSE) {
readBufferBytesAllocated.addAndGet(-buffer_.array().length);
}
- trans_.close();
- if (eventHandler_ != null) {
- eventHandler_.deleteContext(context_, inProt_, outProt_);
+ try {
+ if (eventHandler_ != null) {
+ eventHandler_.deleteContext(context_, inProt_, outProt_);
+ }
+ } finally {
+ trans_.close();
}
}
diff --git a/lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java b/lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java
index 66a1e5f..930f8e8 100644
--- a/lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java
+++ b/lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java
@@ -416,20 +416,23 @@
* selector.
*/
public void close() {
- underlyingTransport.close();
- selectionKey.cancel();
- if (saslPeer != null) {
- saslPeer.dispose();
+ try {
+ if (serverContextCreated) {
+ eventHandler.deleteContext(
+ serverContext,
+ inputProtocolFactory.getProtocol(underlyingTransport),
+ outputProtocolFactory.getProtocol(underlyingTransport));
+ }
+ } finally {
+ selectionKey.cancel();
+ if (saslPeer != null) {
+ saslPeer.dispose();
+ }
+ nextPhase = Phase.CLOSED;
+ currentPhase = Phase.CLOSED;
+ underlyingTransport.close();
+ LOGGER.trace("Connection closed: {}", underlyingTransport);
}
- if (serverContextCreated) {
- eventHandler.deleteContext(
- serverContext,
- inputProtocolFactory.getProtocol(underlyingTransport),
- outputProtocolFactory.getProtocol(underlyingTransport));
- }
- nextPhase = Phase.CLOSED;
- currentPhase = Phase.CLOSED;
- LOGGER.trace("Connection closed: {}", underlyingTransport);
}
public enum Phase {