This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 98af5c6cf32bafe21e3639da8f7c711a819c4951 Author: Benoit Tellier <btell...@linagora.com> AuthorDate: Fri Mar 11 10:01:25 2022 +0700 JAMES-3715 ImapRequestFrameDecoder avoid calling ChannelPipeline::get on each request Pipeline get was taking up to 4.25% of IMAP request decoding time. We can easily handle state in ImapRequestFrameDecoder to not need this. --- .../org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java index fb5d363..968178c 100644 --- a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java +++ b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java @@ -28,6 +28,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentLinkedDeque; +import java.util.concurrent.atomic.AtomicBoolean; import org.apache.james.imap.api.ImapMessage; import org.apache.james.imap.api.ImapSessionState; @@ -62,6 +63,7 @@ public class ImapRequestFrameDecoder extends ByteToMessageDecoder implements Net private final int literalSizeLimit; private final Deque<ChannelInboundHandlerAdapter> behaviourOverrides = new ConcurrentLinkedDeque<>(); private final int maxFrameLength; + private final AtomicBoolean framingEnabled = new AtomicBoolean(true); public ImapRequestFrameDecoder(ImapDecoder decoder, int inMemorySizeLimit, int literalSizeLimit, int maxFrameLength) { this.decoder = decoder; @@ -214,10 +216,12 @@ public class ImapRequestFrameDecoder extends ByteToMessageDecoder implements Net ctx.channel().config().setAutoRead(false); ctx.channel().eventLoop().execute(() -> ctx.channel().pipeline().remove(FRAMER)); ctx.channel().config().setAutoRead(true); + framingEnabled.set(false); } public void enableFraming(ChannelHandlerContext ctx) { - if (ctx.channel().pipeline().get(FRAMER) == null) { + if (!framingEnabled.get()) { + framingEnabled.set(true); ctx.channel().config().setAutoRead(false); ctx.channel().eventLoop().execute(() -> ctx.channel().pipeline().addBefore(REQUEST_DECODER, FRAMER, --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org For additional commands, e-mail: notifications-h...@james.apache.org