Http2ConnectionHandler not flushing on writabilityChange
Motivation: The Http2ConnectionHandler was writing pending bytes, but was not flushing. This may result in deadlock. Modifications: - Http2ConnectionHandler must writePendingBytes and also flush. Result: Data is now flushed after writabilityChange writes more data to underlying layers.
This commit is contained in:
parent
deda3f5b65
commit
2d4bef9b18
@ -170,7 +170,7 @@ public class Http2ConnectionHandler extends ByteToMessageDecoder implements Http
|
||||
@Override
|
||||
public void flush(ChannelHandlerContext ctx) throws Http2Exception {
|
||||
// Trigger pending writes in the remote flow controller.
|
||||
connection().remote().flowController().writePendingBytes();
|
||||
encoder.flowController().writePendingBytes();
|
||||
try {
|
||||
ctx.flush();
|
||||
} catch (Throwable t) {
|
||||
@ -399,11 +399,14 @@ public class Http2ConnectionHandler extends ByteToMessageDecoder implements Http
|
||||
public void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception {
|
||||
// Writability is expected to change while we are writing. We cannot allow this event to trigger reentering
|
||||
// the allocation and write loop. Reentering the event loop will lead to over or illegal allocation.
|
||||
try {
|
||||
if (ctx.channel().isWritable()) {
|
||||
encoder.flowController().writePendingBytes();
|
||||
flush(ctx);
|
||||
}
|
||||
} finally {
|
||||
super.channelWritabilityChanged(ctx);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
|
||||
|
Loading…
Reference in New Issue
Block a user