Author: norman
Date: Sat Sep 17 18:33:25 2011
New Revision: 1172041
URL: http://svn.apache.org/viewvc?rev=1172041&view=rev
Log:
Fix race-condition in pop3server. Now it works again without deadlocking
Added:
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ChannelUpstreamHandler.java
(with props)
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ProtocolTransport.java
(with props)
Modified:
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ResponseEncoder.java
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
Added:
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ChannelUpstreamHandler.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ChannelUpstreamHandler.java?rev=1172041&view=auto
==============================================================================
---
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ChannelUpstreamHandler.java
(added)
+++
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ChannelUpstreamHandler.java
Sat Sep 17 18:33:25 2011
@@ -0,0 +1,60 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.pop3server.netty;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+
+import org.apache.james.protocols.api.ProtocolHandlerChain;
+import org.apache.james.protocols.api.ProtocolSession;
+import org.apache.james.protocols.api.ProtocolSessionFactory;
+import org.apache.james.protocols.impl.BasicChannelUpstreamHandler;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.slf4j.Logger;
+
+public class POP3ChannelUpstreamHandler extends BasicChannelUpstreamHandler{
+
+ private boolean zeroCopy;
+
+ public POP3ChannelUpstreamHandler(ProtocolHandlerChain chain,
ProtocolSessionFactory sessionFactory, Logger logger, boolean zeroCopy) {
+ super(chain, sessionFactory, logger);
+ this.zeroCopy = zeroCopy;
+ }
+
+ public POP3ChannelUpstreamHandler(ProtocolHandlerChain chain,
ProtocolSessionFactory sessionFactory, Logger logger, SSLContext context,
String[] enabledCipherSuites, boolean zeroCopy) {
+ super(chain, sessionFactory, logger, context, enabledCipherSuites);
+ this.zeroCopy = zeroCopy;
+ }
+
+ @Override
+ protected ProtocolSession createSession(ChannelHandlerContext ctx) throws
Exception {
+ SSLEngine engine = null;
+ if (context != null) {
+ engine = context.createSSLEngine();
+ if (enabledCipherSuites != null && enabledCipherSuites.length > 0)
{
+ engine.setEnabledCipherSuites(enabledCipherSuites);
+ }
+ }
+
+ return sessionFactory.newSession(new
POP3ProtocolTransport(ctx.getChannel(), engine, zeroCopy));
+ }
+
+
+}
Propchange:
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ChannelUpstreamHandler.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added:
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ProtocolTransport.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ProtocolTransport.java?rev=1172041&view=auto
==============================================================================
---
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ProtocolTransport.java
(added)
+++
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ProtocolTransport.java
Sat Sep 17 18:33:25 2011
@@ -0,0 +1,83 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.pop3server.netty;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.channels.FileChannel;
+
+import javax.net.ssl.SSLEngine;
+
+import org.apache.james.pop3server.POP3StreamResponse;
+import org.apache.james.protocols.api.ProtocolSession;
+import org.apache.james.protocols.api.Response;
+import org.apache.james.protocols.impl.NettyProtocolTransport;
+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;
+
+public class POP3ProtocolTransport extends NettyProtocolTransport{
+
+ private Channel channel;
+ private boolean zeroCopy;
+
+ public POP3ProtocolTransport(Channel channel, SSLEngine engine, boolean
zeroCopy) {
+ super(channel, engine);
+ this.channel = channel;
+ this.zeroCopy = zeroCopy;
+ }
+
+ @Override
+ public void writeResponse(Response response, ProtocolSession session) {
+ super.writeResponse(response, session);
+
+ if (response instanceof POP3StreamResponse) {
+
+ InputStream stream = ((POP3StreamResponse) response).getStream();
+ if (stream != null && channel.isConnected()) {
+
+ 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 ex) {
+ // Catch the exception and just pass it so we get the
exception later
+ channel.write(new ChunkedStream(stream));
+
+ }
+ } else {
+ channel.write(new ChunkedStream(stream));
+
+ }
+ }
+ channel.write(ChannelBuffers.wrappedBuffer(".\r\n".getBytes()));
+ }
+ }
+
+}
Propchange:
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ProtocolTransport.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified:
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ResponseEncoder.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ResponseEncoder.java?rev=1172041&r1=1172040&r2=1172041&view=diff
==============================================================================
---
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ResponseEncoder.java
(original)
+++
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ResponseEncoder.java
Sat Sep 17 18:33:25 2011
@@ -18,34 +18,34 @@
****************************************************************/
package org.apache.james.pop3server.netty;
-import static org.jboss.netty.channel.Channels.write;
+import static org.jboss.netty.buffer.ChannelBuffers.copiedBuffer;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
+import java.util.List;
import org.apache.james.pop3server.POP3Response;
import org.apache.james.pop3server.POP3StreamResponse;
-import org.apache.james.protocols.impl.ResponseEncoder;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelEvent;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.DefaultFileRegion;
import org.jboss.netty.channel.MessageEvent;
+import org.jboss.netty.channel.SimpleChannelDownstreamHandler;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
import org.jboss.netty.handler.stream.ChunkedNioFile;
import org.jboss.netty.handler.stream.ChunkedStream;
-public class POP3ResponseEncoder extends ResponseEncoder{
+public class POP3ResponseEncoder extends SimpleChannelDownstreamHandler{
private boolean zeroCopy;
-
+ private Charset charset = Charset.forName("US-ASCII");
public POP3ResponseEncoder(boolean zeroCopy) {
- super(POP3Response.class, Charset.forName("US-ASCII"));
this.zeroCopy = zeroCopy;
}
@@ -55,31 +55,41 @@ public class POP3ResponseEncoder extends
if (evt instanceof MessageEvent) {
MessageEvent e = (MessageEvent) evt;
Object originalMessage = e.getMessage();
+ Channel channel = ctx.getChannel();
- super.handleDownstream(ctx, evt);
-
+ if (originalMessage instanceof POP3Response) {
+ StringBuilder builder = new StringBuilder();
+ POP3Response response = (POP3Response) originalMessage;
+ List<CharSequence> lines = response.getLines();
+ for (int i = 0; i < lines.size(); i++) {
+ builder.append(lines.get(i));
+ if (i < lines.size()) {
+ builder.append("\r\n");
+ }
+ }
+ channel.write(copiedBuffer(builder.toString(), charset));
+ }
if (originalMessage instanceof POP3StreamResponse) {
InputStream stream = ((POP3StreamResponse)
originalMessage).getStream();
- Channel channel = ctx.getChannel();
if (stream != null && channel.isConnected()) {
if (stream instanceof FileInputStream &&
channel.getFactory() instanceof NioServerSocketChannelFactory) {
FileChannel fc = ((FileInputStream)
stream).getChannel();
try {
if (zeroCopy) {
- write(ctx, e.getFuture(), new
DefaultFileRegion(fc, fc.position(), fc.size()), e.getRemoteAddress());
+ channel.write(new DefaultFileRegion(fc,
fc.position(), fc.size()));
} else {
- write(ctx, e.getFuture(), new
ChunkedNioFile(fc, 8192), e.getRemoteAddress());
+ channel.write(new ChunkedNioFile(fc, 8192),
e.getRemoteAddress());
}
} catch (IOException ex) {
// Catch the exception and just pass it so we get
the exception later
- write(ctx, e.getFuture(), new
ChunkedStream(stream), e.getRemoteAddress());
+ channel.write(new ChunkedStream(stream));
}
} else {
- write(ctx, e.getFuture(), new ChunkedStream(stream),
e.getRemoteAddress());
+ channel.write(new ChunkedStream(stream));
}
}
Modified:
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java?rev=1172041&r1=1172040&r2=1172041&view=diff
==============================================================================
---
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
(original)
+++
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
Sat Sep 17 18:33:25 2011
@@ -18,8 +18,11 @@
****************************************************************/
package org.apache.james.pop3server.netty;
+import java.nio.charset.Charset;
+
import org.apache.james.pop3server.POP3HandlerConfigurationData;
import org.apache.james.pop3server.POP3Protocol;
+import org.apache.james.pop3server.POP3Response;
import org.apache.james.pop3server.core.CoreCmdHandlerLoader;
import org.apache.james.pop3server.jmx.JMXHandlersLoader;
import org.apache.james.protocols.api.HandlersPackage;
@@ -38,7 +41,7 @@ import org.jboss.netty.handler.stream.Ch
*/
public class POP3Server extends AbstractProtocolAsyncServer implements
POP3ServerMBean {
- private final static ResponseEncoder POP3_RESPONSE_ENCODER = new
POP3ResponseEncoder(false);
+ private final static ResponseEncoder POP3_RESPONSE_ENCODER = new
ResponseEncoder(POP3Response.class, Charset.forName("US-ASCII"));
/**
* The configuration data to be passed to the handler
*/
@@ -91,7 +94,7 @@ public class POP3Server extends Abstract
protected void preInit() throws Exception {
super.preInit();
POP3Protocol protocol = new POP3Protocol(getProtocolHandlerChain(),
theConfigData, getLogger());
- coreHandler = new
BasicChannelUpstreamHandler(getProtocolHandlerChain(),
protocol.getProtocolSessionFactory(), getLogger(), getSSLContext(),
getEnabledCipherSuites());
+ coreHandler = new
POP3ChannelUpstreamHandler(getProtocolHandlerChain(),
protocol.getProtocolSessionFactory(), getLogger(), getSSLContext(),
getEnabledCipherSuites(), false);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]