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

Reply via email to