This is an automated email from the ASF dual-hosted git repository. rcordier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 31b5012b4a94a1a944f08929cfbaa4a8a0c903d4 Author: Benoit TELLIER <btell...@linagora.com> AuthorDate: Tue Mar 26 15:16:12 2024 +0100 [PERF] MimeMessageWrapper should avoid synchronized input stream This causes 0.5% of overall memory allocation --- .../james/server/core/MimeMessageWrapper.java | 33 +++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/server/container/core/src/main/java/org/apache/james/server/core/MimeMessageWrapper.java b/server/container/core/src/main/java/org/apache/james/server/core/MimeMessageWrapper.java index 53f72bebfb..164a5ef850 100644 --- a/server/container/core/src/main/java/org/apache/james/server/core/MimeMessageWrapper.java +++ b/server/container/core/src/main/java/org/apache/james/server/core/MimeMessageWrapper.java @@ -19,6 +19,8 @@ package org.apache.james.server.core; +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -35,9 +37,12 @@ import jakarta.mail.MessagingException; import jakarta.mail.Session; import jakarta.mail.internet.InternetHeaders; import jakarta.mail.internet.MimeMessage; +import jakarta.mail.internet.MimeUtility; +import jakarta.mail.internet.SharedInputStream; import jakarta.mail.util.SharedByteArrayInputStream; import org.apache.commons.io.IOUtils; +import org.apache.commons.io.input.UnsynchronizedBufferedInputStream; import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream; import org.apache.james.lifecycle.api.Disposable; import org.apache.james.lifecycle.api.LifecycleUtil; @@ -569,10 +574,36 @@ public class MimeMessageWrapper extends MimeMessage implements Disposable { protected void parse(InputStream is) throws MessagingException { // the super implementation calls // headers = createInternetHeaders(is); - super.parse(is); + parseUnsynchronized(is); messageParsed = true; } + protected void parseUnsynchronized(InputStream is) throws MessagingException { + if (!(is instanceof ByteArrayInputStream) && !(is instanceof BufferedInputStream) && !(is instanceof SharedInputStream)) { + try { + is = UnsynchronizedBufferedInputStream.builder() + .setBufferSize(8192) + .setInputStream(is) + .get(); + } catch (IOException e) { + throw new MessagingException("Failure buffering stream", e); + } + } + + this.headers = this.createInternetHeaders(is); + if (is instanceof SharedInputStream) { + SharedInputStream sharedInputStream = (SharedInputStream)is; + this.contentStream = sharedInputStream.newStream(sharedInputStream.getPosition(), -1L); + } else { + try { + this.content = MimeUtility.getBytes(is); + } catch (IOException var3) { + throw new MessagingException("IOException", var3); + } + } + this.modified = false; + } + /** * If we already parsed the headers then we simply return the updated ones. * Otherwise we parse --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org For additional commands, e-mail: notifications-h...@james.apache.org