HTTP/2 ConnectionHandler close cleanup
Motiviation: The connection handler stream close operation is unconditionally adding a listener object to a future. We may not have to add a listener at all because the future has already been completed. Modifications: - If the future is done, directly invoke the logic without creating/adding a new listener. Result: No need to create/add listener if the future is already done in close logic.
This commit is contained in:
parent
e9a2cac16d
commit
49b0d6ed07
@ -481,21 +481,17 @@ public class Http2ConnectionHandler extends ByteToMessageDecoder implements Http
|
|||||||
public void closeStream(final Http2Stream stream, ChannelFuture future) {
|
public void closeStream(final Http2Stream stream, ChannelFuture future) {
|
||||||
stream.close();
|
stream.close();
|
||||||
|
|
||||||
|
if (future.isDone()) {
|
||||||
|
checkCloseConnection(future);
|
||||||
|
} else {
|
||||||
future.addListener(new ChannelFutureListener() {
|
future.addListener(new ChannelFutureListener() {
|
||||||
@Override
|
@Override
|
||||||
public void operationComplete(ChannelFuture future) throws Exception {
|
public void operationComplete(ChannelFuture future) throws Exception {
|
||||||
// If this connection is closing and the graceful shutdown has completed, close the connection
|
checkCloseConnection(future);
|
||||||
// once this operation completes.
|
|
||||||
if (closeListener != null && isGracefulShutdownComplete()) {
|
|
||||||
ChannelFutureListener closeListener = Http2ConnectionHandler.this.closeListener;
|
|
||||||
// This method could be called multiple times
|
|
||||||
// and we don't want to notify the closeListener multiple times.
|
|
||||||
Http2ConnectionHandler.this.closeListener = null;
|
|
||||||
closeListener.operationComplete(future);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Central handler for all exceptions caught during HTTP/2 processing.
|
* Central handler for all exceptions caught during HTTP/2 processing.
|
||||||
@ -623,6 +619,26 @@ public class Http2ConnectionHandler extends ByteToMessageDecoder implements Http
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes the connection if the graceful shutdown process has completed.
|
||||||
|
* @param future Represents the status that will be passed to the {@link #closeListener}.
|
||||||
|
*/
|
||||||
|
private void checkCloseConnection(ChannelFuture future) {
|
||||||
|
// If this connection is closing and the graceful shutdown has completed, close the connection
|
||||||
|
// once this operation completes.
|
||||||
|
if (closeListener != null && isGracefulShutdownComplete()) {
|
||||||
|
ChannelFutureListener closeListener = Http2ConnectionHandler.this.closeListener;
|
||||||
|
// This method could be called multiple times
|
||||||
|
// and we don't want to notify the closeListener multiple times.
|
||||||
|
Http2ConnectionHandler.this.closeListener = null;
|
||||||
|
try {
|
||||||
|
closeListener.operationComplete(future);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new IllegalStateException("Close listener threw an unexpected exception", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the initial settings to be sent to the remote endpoint.
|
* Gets the initial settings to be sent to the remote endpoint.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user