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 2010/04/18 20:15:32 UTC
svn commit: r935385 - in /james/server/trunk:
imapserver/src/main/java/org/apache/james/imapserver/netty/
netty-socket/src/main/java/org/apache/james/socket/netty/
pop3server/src/main/java/org/apache/james/pop3server/netty/
remotemanager/src/main/java/...
Author: norman
Date: Sun Apr 18 18:15:31 2010
New Revision: 935385
URL: http://svn.apache.org/viewvc?rev=935385&view=rev
Log:
Support connection limiting with netty
Added:
james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/ConnectionLimitUpstreamHandler.java
james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/ConnectionPerIpLimitUpstreamHandler.java
Modified:
james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/NioImapServer.java
james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractAsyncServer.java
james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractChannelPipelineFactory.java
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/NioPOP3Server.java
james/server/trunk/remotemanager/src/main/java/org/apache/james/remotemanager/netty/NioRemoteManager.java
james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/NioSMTPServer.java
Modified: james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/NioImapServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/NioImapServer.java?rev=935385&r1=935384&r2=935385&view=diff
==============================================================================
--- james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/NioImapServer.java (original)
+++ james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/NioImapServer.java Sun Apr 18 18:15:31 2010
@@ -30,6 +30,8 @@ import org.apache.james.imap.decode.Imap
import org.apache.james.imap.encode.ImapEncoder;
import org.apache.james.imap.main.ImapRequestStreamHandler;
import org.apache.james.socket.netty.AbstractAsyncServer;
+import org.apache.james.socket.netty.ConnectionLimitUpstreamHandler;
+import org.apache.james.socket.netty.ConnectionPerIpLimitUpstreamHandler;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.handler.ssl.SslHandler;
@@ -93,6 +95,10 @@ public class NioImapServer extends Abstr
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = pipeline();
+ pipeline.addLast("connectionLimit", new ConnectionLimitUpstreamHandler(NioImapServer.this.connectionLimit));
+
+ pipeline.addLast("connectionPerIpLimit", new ConnectionPerIpLimitUpstreamHandler(NioImapServer.this.connPerIP));
+
if (isSSLSocket()) {
pipeline.addFirst("sslHandler", new SslHandler(getSSLContext().createSSLEngine()));
}
Modified: james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractAsyncServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractAsyncServer.java?rev=935385&r1=935384&r2=935385&view=diff
==============================================================================
--- james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractAsyncServer.java (original)
+++ james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractAsyncServer.java Sun Apr 18 18:15:31 2010
@@ -87,13 +87,13 @@ public abstract class AbstractAsyncServe
private boolean enabled;
- private int connPerIP;
+ protected int connPerIP;
private boolean useStartTLS;
private boolean useSSL;
- private int connectionLimit;
+ protected int connectionLimit;
private String helloName;
Modified: james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractChannelPipelineFactory.java
URL: http://svn.apache.org/viewvc/james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractChannelPipelineFactory.java?rev=935385&r1=935384&r2=935385&view=diff
==============================================================================
--- james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractChannelPipelineFactory.java (original)
+++ james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractChannelPipelineFactory.java Sun Apr 18 18:15:31 2010
@@ -47,7 +47,12 @@ public abstract class AbstractChannelPip
public ChannelPipeline getPipeline() throws Exception {
// Create a default pipeline implementation.
ChannelPipeline pipeline = pipeline();
+
+ pipeline.addLast("connectionLimit", new ConnectionLimitUpstreamHandler(getMaxConnections()));
+ pipeline.addLast("connectionPerIpLimit", new ConnectionPerIpLimitUpstreamHandler(getMaxConnectionsPerIP()));
+
+
// Add the text line codec combination first,
// decoder
pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
@@ -85,5 +90,19 @@ public abstract class AbstractChannelPip
protected abstract int getTimeout();
+ /**
+ * Return the max connections
+ *
+ * @return max connections
+ */
+ protected abstract int getMaxConnections();
+
+ /**
+ * Return the max connections per ip
+ *
+ * @return max connections per ip
+ */
+ protected abstract int getMaxConnectionsPerIP();
+
}
Added: james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/ConnectionLimitUpstreamHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/ConnectionLimitUpstreamHandler.java?rev=935385&view=auto
==============================================================================
--- james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/ConnectionLimitUpstreamHandler.java (added)
+++ james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/ConnectionLimitUpstreamHandler.java Sun Apr 18 18:15:31 2010
@@ -0,0 +1,64 @@
+/****************************************************************
+ * 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.socket.netty;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.channel.ChannelStateEvent;
+import org.jboss.netty.channel.ChannelUpstreamHandler;
+import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
+
+/**
+ * {@link ChannelUpstreamHandler} which limit the concurrent connection
+ *
+ */
+
+public class ConnectionLimitUpstreamHandler extends SimpleChannelUpstreamHandler{
+
+ private final AtomicInteger connections = new AtomicInteger(0);
+ private final int maxConnections;
+
+ public ConnectionLimitUpstreamHandler(int maxConnections) {
+ this.maxConnections = maxConnections;
+ }
+ @Override
+ public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
+ if (maxConnections > 0) {
+ int currentCount = connections.getAndIncrement();
+
+ System.out.println("MAX = " + maxConnections + " CON = " + currentCount);
+
+ if (currentCount > maxConnections) {
+ ctx.getChannel().close();
+ connections.decrementAndGet();
+ }
+ }
+
+ super.channelOpen(ctx, e);
+ }
+
+ @Override
+ public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
+ if (maxConnections > 0) {
+ connections.decrementAndGet();
+ }
+ super.channelClosed(ctx, e);
+ }
+}
Added: james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/ConnectionPerIpLimitUpstreamHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/ConnectionPerIpLimitUpstreamHandler.java?rev=935385&view=auto
==============================================================================
--- james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/ConnectionPerIpLimitUpstreamHandler.java (added)
+++ james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/ConnectionPerIpLimitUpstreamHandler.java Sun Apr 18 18:15:31 2010
@@ -0,0 +1,77 @@
+/****************************************************************
+ * 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.socket.netty;
+
+import java.net.InetSocketAddress;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.channel.ChannelStateEvent;
+import org.jboss.netty.channel.ChannelUpstreamHandler;
+import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
+
+/**
+ * {@link ChannelUpstreamHandler} which limit connections per IP
+ *
+ */
+public class ConnectionPerIpLimitUpstreamHandler extends SimpleChannelUpstreamHandler{
+
+ private final ConcurrentHashMap<String, AtomicInteger> connections = new ConcurrentHashMap<String, AtomicInteger>();
+ private final int maxConnectionsPerIp;
+
+ public ConnectionPerIpLimitUpstreamHandler(int maxConnectionsPerIp) {
+ this.maxConnectionsPerIp = maxConnectionsPerIp;
+ }
+ @Override
+ public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
+
+ if (maxConnectionsPerIp > 0) {
+ InetSocketAddress remoteAddress = (InetSocketAddress) ctx.getChannel().getRemoteAddress();
+ String remoteIp = remoteAddress.getAddress().getHostAddress();
+ AtomicInteger count = connections.get(remoteIp);
+ System.out.println("MAX = " + maxConnectionsPerIp + " CON = " + count);
+
+ if (count == null) {
+ count = new AtomicInteger(1);
+ connections.put(remoteIp, count);
+ } else {
+ int connectionCount = count.incrementAndGet();
+ if (connectionCount > maxConnectionsPerIp) {
+ ctx.getChannel().close();
+ count.decrementAndGet();
+ }
+ }
+
+ }
+
+ super.channelOpen(ctx, e);
+ }
+ @Override
+ public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
+ if (maxConnectionsPerIp > 0) {
+ InetSocketAddress remoteAddress = (InetSocketAddress) ctx.getChannel().getRemoteAddress();
+ String remoteIp = remoteAddress.getAddress().getHostAddress();
+ AtomicInteger count = connections.get(remoteIp);
+ if (count != null)
+ count.decrementAndGet();
+ }
+ super.channelClosed(ctx, e);
+ }
+}
Modified: james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/NioPOP3Server.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/NioPOP3Server.java?rev=935385&r1=935384&r2=935385&view=diff
==============================================================================
--- james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/NioPOP3Server.java (original)
+++ james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/NioPOP3Server.java Sun Apr 18 18:15:31 2010
@@ -157,6 +157,16 @@ public class NioPOP3Server extends Abstr
protected boolean isSSLSocket() {
return NioPOP3Server.this.isSSLSocket();
}
+
+ @Override
+ protected int getMaxConnections() {
+ return NioPOP3Server.this.connectionLimit;
+ }
+
+ @Override
+ protected int getMaxConnectionsPerIP() {
+ return NioPOP3Server.this.connPerIP;
+ }
};
}
Modified: james/server/trunk/remotemanager/src/main/java/org/apache/james/remotemanager/netty/NioRemoteManager.java
URL: http://svn.apache.org/viewvc/james/server/trunk/remotemanager/src/main/java/org/apache/james/remotemanager/netty/NioRemoteManager.java?rev=935385&r1=935384&r2=935385&view=diff
==============================================================================
--- james/server/trunk/remotemanager/src/main/java/org/apache/james/remotemanager/netty/NioRemoteManager.java (original)
+++ james/server/trunk/remotemanager/src/main/java/org/apache/james/remotemanager/netty/NioRemoteManager.java Sun Apr 18 18:15:31 2010
@@ -142,6 +142,16 @@ public class NioRemoteManager extends Ab
protected int getTimeout() {
return NioRemoteManager.this.getTimeout();
}
+
+ @Override
+ protected int getMaxConnections() {
+ return NioRemoteManager.this.connectionLimit;
+ }
+
+ @Override
+ protected int getMaxConnectionsPerIP() {
+ return NioRemoteManager.this.connPerIP;
+ }
};
}
Modified: james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/NioSMTPServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/NioSMTPServer.java?rev=935385&r1=935384&r2=935385&view=diff
==============================================================================
--- james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/NioSMTPServer.java (original)
+++ james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/NioSMTPServer.java Sun Apr 18 18:15:31 2010
@@ -318,6 +318,16 @@ public class NioSMTPServer extends Abstr
protected boolean isSSLSocket() {
return NioSMTPServer.this.isSSLSocket();
}
+
+ @Override
+ protected int getMaxConnections() {
+ return NioSMTPServer.this.connectionLimit;
+ }
+
+ @Override
+ protected int getMaxConnectionsPerIP() {
+ return NioSMTPServer.this.connPerIP;
+ }
};
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org