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