You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2011/08/24 20:35:47 UTC

svn commit: r1161222 - in /james/server/trunk: imapserver/src/main/java/org/apache/james/imapserver/netty/ChannelImapResponseWriter.java pop3server/src/main/java/org/apache/james/pop3server/netty/POP3NettySession.java

Author: norman
Date: Wed Aug 24 18:35:46 2011
New Revision: 1161222

URL: http://svn.apache.org/viewvc?rev=1161222&view=rev
Log:
Use Zero-copy file transfer to transfer message content if possible. See JAMES-1301

Modified:
    james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ChannelImapResponseWriter.java
    james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3NettySession.java

Modified: james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ChannelImapResponseWriter.java
URL: http://svn.apache.org/viewvc/james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ChannelImapResponseWriter.java?rev=1161222&r1=1161221&r2=1161222&view=diff
==============================================================================
--- james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ChannelImapResponseWriter.java (original)
+++ james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ChannelImapResponseWriter.java Wed Aug 24 18:35:46 2011
@@ -19,12 +19,18 @@
 
 package org.apache.james.imapserver.netty;
 
+import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.nio.channels.FileChannel;
 
 import org.apache.james.imap.encode.ImapResponseWriter;
 import org.apache.james.imap.message.response.Literal;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.jboss.netty.channel.Channel;
+import org.jboss.netty.channel.DefaultFileRegion;
+import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
+import org.jboss.netty.handler.stream.ChunkedNioFile;
 import org.jboss.netty.handler.stream.ChunkedStream;
 
 /**
@@ -33,12 +39,17 @@ import org.jboss.netty.handler.stream.Ch
  */
 public class ChannelImapResponseWriter implements ImapResponseWriter {
 
-    private Channel channel;
+    private final Channel channel;
+	private final boolean zeroCopy;
 
     public ChannelImapResponseWriter(Channel channel) {
-        this.channel = channel;
+    	this(channel, true);
     }
 
+    public ChannelImapResponseWriter(Channel channel, boolean zeroCopy) {
+        this.channel = channel;
+        this.zeroCopy = zeroCopy;
+    }
 
     /*
      * (non-Javadoc)
@@ -53,7 +64,17 @@ public class ChannelImapResponseWriter i
      * @see org.apache.james.imap.encode.ImapResponseWriter#write(org.apache.james.imap.message.response.Literal)
      */
     public void write(Literal literal) throws IOException {
-        channel.write(new ChunkedStream(literal.getInputStream()));
+        InputStream in = literal.getInputStream();
+        if (in instanceof FileInputStream && channel.getFactory() instanceof NioServerSocketChannelFactory) {
+            FileChannel fc = ((FileInputStream) in).getChannel();
+            if (zeroCopy) {
+                channel.write(new DefaultFileRegion(fc, fc.position(), literal.size()));
+            } else {
+                channel.write(new ChunkedNioFile(fc, 8192));
+            }
+        } else {
+            channel.write(new ChunkedStream(literal.getInputStream()));
+        }
     }
 
 }

Modified: james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3NettySession.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3NettySession.java?rev=1161222&r1=1161221&r2=1161222&view=diff
==============================================================================
--- james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3NettySession.java (original)
+++ james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3NettySession.java Wed Aug 24 18:35:46 2011
@@ -18,6 +18,10 @@
  ****************************************************************/
 package org.apache.james.pop3server.netty;
 
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.channels.FileChannel;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -27,7 +31,12 @@ import org.apache.james.mailbox.MessageM
 import org.apache.james.pop3server.POP3HandlerConfigurationData;
 import org.apache.james.pop3server.POP3Session;
 import org.apache.james.protocols.impl.AbstractSession;
+import org.jboss.netty.channel.Channel;
 import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.channel.DefaultFileRegion;
+import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
+import org.jboss.netty.handler.stream.ChunkedNioFile;
+import org.jboss.netty.handler.stream.ChunkedStream;
 import org.slf4j.Logger;
 
 /**
@@ -42,15 +51,22 @@ public class POP3NettySession extends Ab
 
     private MessageManager mailbox;
 
+    private boolean zeroCopy;
+
     public POP3NettySession(POP3HandlerConfigurationData configData, Logger logger, ChannelHandlerContext handlerContext) {
         this(configData, logger, handlerContext, null);
     }
 
     public POP3NettySession(POP3HandlerConfigurationData configData, Logger logger, ChannelHandlerContext handlerContext, SSLEngine engine) {
+        this(configData, logger, handlerContext, engine, true);
+    }
+
+    public POP3NettySession(POP3HandlerConfigurationData configData, Logger logger, ChannelHandlerContext handlerContext, SSLEngine engine, boolean zeroCopy) {
         super(logger, handlerContext, engine);
         this.configData = configData;
+        this.zeroCopy = zeroCopy;
     }
-
+    
     /*
      * (non-Javadoc)
      * 
@@ -117,4 +133,25 @@ public class POP3NettySession extends Ab
     public void setUserMailbox(MessageManager mailbox) {
         this.mailbox = mailbox;
     }
+
+    @Override
+    public void writeStream(InputStream stream) {
+        Channel channel = getChannelHandlerContext().getChannel();
+        if (stream instanceof FileInputStream  && channel.getFactory() instanceof NioServerSocketChannelFactory) {
+            FileChannel fc = ((FileInputStream) stream).getChannel();
+            try {
+                if (zeroCopy) {
+                    channel.write(new DefaultFileRegion(fc, fc.position(), fc.size()));
+                } else {
+                    channel.write(new ChunkedNioFile(fc, 8192));
+                }
+            } catch (IOException e) {
+                // Catch the exception and just pass it so we get the exception later
+                super.writeStream(stream);
+            }
+        } else {
+            super.writeStream(stream);
+        }
+    }
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org