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