From db8dd66f093b5e54a85e36df0052a0a057adea26 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Sat, 6 Jul 2019 09:08:20 +0200 Subject: [PATCH] Reduce object creation on Http2FrameCodec (#9333) Motivation: We don't need the extra ChannelPromise when writing headers anymore in Http2FrameCodec. This also means we cal re-use a ChannelFutureListener and so not need to create new instances all the time. Modifications: - Just pass the original ChannelPromise when writing headers - Reuse the ChannelFutureListener Result: Two less objects created when writing headers for an not-yet created stream. --- .../handler/codec/http2/Http2FrameCodec.java | 40 ++++++------------- 1 file changed, 12 insertions(+), 28 deletions(-) diff --git a/codec-http2/src/main/java/io/netty/handler/codec/http2/Http2FrameCodec.java b/codec-http2/src/main/java/io/netty/handler/codec/http2/Http2FrameCodec.java index c263061420..6767f7ea2e 100644 --- a/codec-http2/src/main/java/io/netty/handler/codec/http2/Http2FrameCodec.java +++ b/codec-http2/src/main/java/io/netty/handler/codec/http2/Http2FrameCodec.java @@ -159,6 +159,12 @@ public class Http2FrameCodec extends Http2ConnectionHandler { private int numBufferedStreams; private final IntObjectMap frameStreamToInitializeMap = new IntObjectHashMap(8); + private final ChannelFutureListener bufferedStreamsListener = new ChannelFutureListener() { + @Override + public void operationComplete(ChannelFuture future) throws Exception { + numBufferedStreams--; + } + }; Http2FrameCodec(Http2ConnectionEncoder encoder, Http2ConnectionDecoder decoder, Http2Settings initialSettings, boolean decoupleCloseAndGoAway) { @@ -395,37 +401,15 @@ public class Http2FrameCodec extends Http2ConnectionHandler { // We should not re-use ids. assert old == null; - // TODO(buchgr): Once Http2FrameStream and Http2Stream are merged this is no longer necessary. - final ChannelPromise writePromise = ctx.newPromise(); - encoder().writeHeaders(ctx, streamId, headersFrame.headers(), headersFrame.padding(), - headersFrame.isEndStream(), writePromise); - if (writePromise.isDone()) { - notifyHeaderWritePromise(writePromise, promise); - } else { + headersFrame.isEndStream(), promise); + if (!promise.isDone()) { numBufferedStreams++; - - writePromise.addListener(new ChannelFutureListener() { - @Override - public void operationComplete(ChannelFuture future) throws Exception { - numBufferedStreams--; - - notifyHeaderWritePromise(future, promise); - } - }); + promise.addListener(bufferedStreamsListener); } } } - private static void notifyHeaderWritePromise(ChannelFuture future, ChannelPromise promise) { - Throwable cause = future.cause(); - if (cause == null) { - promise.setSuccess(); - } else { - promise.setFailure(cause); - } - } - private void onStreamActive0(Http2Stream stream) { if (stream.id() != Http2CodecUtil.HTTP_UPGRADE_STREAM_ID && connection().local().isValidStreamId(stream.id())) { @@ -512,7 +496,7 @@ public class Http2FrameCodec extends Http2ConnectionHandler { } } - void onHttp2UnknownStreamError(@SuppressWarnings("unused") ChannelHandlerContext ctx, Throwable cause, + private void onHttp2UnknownStreamError(@SuppressWarnings("unused") ChannelHandlerContext ctx, Throwable cause, Http2Exception.StreamException streamException) { // Just log.... LOG.warn("Stream exception thrown for unknown stream {}.", streamException.streamId(), cause); @@ -615,11 +599,11 @@ public class Http2FrameCodec extends Http2ConnectionHandler { } } - void onUpgradeEvent(ChannelHandlerContext ctx, UpgradeEvent evt) { + private void onUpgradeEvent(ChannelHandlerContext ctx, UpgradeEvent evt) { ctx.fireUserEventTriggered(evt); } - void onHttp2StreamWritabilityChanged(ChannelHandlerContext ctx, Http2FrameStream stream, + private void onHttp2StreamWritabilityChanged(ChannelHandlerContext ctx, Http2FrameStream stream, @SuppressWarnings("unused") boolean writable) { ctx.fireUserEventTriggered(Http2FrameStreamEvent.writabilityChanged(stream)); }