Allow to configure number of threads used by Netty's EventLoopGroups 50/9650/4
authorMichal Polkorab <michal.polkorab@pantheon.sk>
Mon, 4 Aug 2014 14:04:10 +0000 (16:04 +0200)
committerMichal Polkorab <michal.polkorab@pantheon.sk>
Thu, 28 Aug 2014 08:11:46 +0000 (08:11 +0000)
Change-Id: I07e95b45069bcc3437add607cf5dc990f263eb0d
Signed-off-by: Michal Polkorab <michal.polkorab@pantheon.sk>
openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/connection/ConnectionConfiguration.java
openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/connection/ThreadConfiguration.java [new file with mode: 0644]
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/connection/SwitchConnectionProviderImpl.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/TcpHandler.java
openflow-protocol-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflow/_switch/connection/provider/impl/rev140328/SwitchConnectionProviderModule.java
openflow-protocol-impl/src/main/yang/openflow-switch-connection-provider-impl.yang
openflow-protocol-it/src/test/java/org/opendaylight/openflowjava/protocol/it/integration/ConnectionConfigurationImpl.java

index d877c0ccad238b825c912ceac6c4d8a5791a52c7..8b3447694391cddca13c10020bd90cc23dc69982 100644 (file)
@@ -50,5 +50,9 @@ public interface ConnectionConfiguration {
      * @return seed for {@link SSLEngine}
      */
     public Object getSslContext();
-
-}
+    
+    /**
+     * @return thread numbers for TcpHandler's eventloopGroups
+     */
+    public ThreadConfiguration getThreadConfiguration();
+}
\ No newline at end of file
diff --git a/openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/connection/ThreadConfiguration.java b/openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/connection/ThreadConfiguration.java
new file mode 100644 (file)
index 0000000..6ce39ee
--- /dev/null
@@ -0,0 +1,26 @@
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.api.connection;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public interface ThreadConfiguration {\r
+\r
+    /**\r
+     * @return desired number of workerThreads processing the Openflow I/O\r
+     */\r
+    public int getWorkerThreadCount();\r
+\r
+    /**\r
+     * @return desired number of bossThreads registering incomming Openflow connections\r
+     */\r
+    public int getBossThreadCount();\r
+}\r
index 39a9829bdc662a643aff78d5927c3821475e8613..b3785de612b7e48965b71fba09e899c877eac273 100644 (file)
@@ -128,6 +128,7 @@ public class SwitchConnectionProviderImpl implements SwitchConnectionProvider {
         factory.setSerializationFactory(serializationFactory);
         factory.setDeserializationFactory(deserializationFactory);
         server.setChannelInitializer(factory.createPublishingChannelInitializer());
+        server.setThreadConfig(connConfig.getThreadConfiguration());
         return server;
     }
 
index 77e1bce6ff71e52497b4432177896513912992cb..72c5d07df0149704840c168e90d299128552185b 100644 (file)
@@ -21,6 +21,7 @@ import io.netty.util.concurrent.GenericFutureListener;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 
+import org.opendaylight.openflowjava.protocol.api.connection.ThreadConfiguration;
 import org.opendaylight.openflowjava.protocol.impl.connection.ServerFacade;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -53,6 +54,7 @@ public class TcpHandler implements ServerFacade {
     private NioEventLoopGroup workerGroup;
     private NioEventLoopGroup bossGroup;
     private final SettableFuture<Boolean> isOnlineFuture;
+    private ThreadConfiguration threadConfig;
 
     private PublishingChannelInitializer channelInitializer;
 
@@ -81,8 +83,13 @@ public class TcpHandler implements ServerFacade {
      */
     @Override
     public void run() {
-        bossGroup = new NioEventLoopGroup();
-        workerGroup = new NioEventLoopGroup();
+        if (threadConfig != null) {
+            bossGroup = new NioEventLoopGroup(threadConfig.getBossThreadCount());
+            workerGroup = new NioEventLoopGroup(threadConfig.getWorkerThreadCount());
+        } else {
+            bossGroup = new NioEventLoopGroup();
+            workerGroup = new NioEventLoopGroup();
+        }
 
         /*
          * We generally do not perform IO-unrelated tasks, so we want to have
@@ -194,4 +201,10 @@ public class TcpHandler implements ServerFacade {
         this.channelInitializer = channelInitializer;
     }
 
+    /**
+     * @param threadConfig EventLoopGroup configuration
+     */
+    public void setThreadConfig(ThreadConfiguration threadConfig) {
+        this.threadConfig = threadConfig;
+    }
 }
index 04d16aab53596387bdbbb59120c154129a592bcd..1a22723a037b70f2941df5bef9979761228a4e18 100644 (file)
@@ -13,6 +13,7 @@ import java.net.InetAddress;
 import java.net.UnknownHostException;
 
 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionConfiguration;
+import org.opendaylight.openflowjava.protocol.api.connection.ThreadConfiguration;
 import org.opendaylight.openflowjava.protocol.api.connection.TlsConfiguration;
 import org.opendaylight.openflowjava.protocol.impl.connection.SwitchConnectionProviderImpl;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
@@ -77,6 +78,7 @@ public final class SwitchConnectionProviderModule extends org.opendaylight.yang.
         final Integer port = getPort();
         final long switchIdleTimeout = getSwitchIdleTimeout();
         final Tls tlsConfig = getTls();
+        final Threads threads = getThreads();
         
         return new ConnectionConfiguration() {
             @Override
@@ -145,6 +147,24 @@ public final class SwitchConnectionProviderModule extends org.opendaylight.yang.
                 // TODO Auto-generated method stub
                 return null;
             }
+            @Override
+            public ThreadConfiguration getThreadConfiguration() {
+                if (threads == null) {
+                    return null;
+                }
+                return new ThreadConfiguration() {
+                    
+                    @Override
+                    public int getWorkerThreadCount() {
+                        return threads.getWorkerThreads();
+                    }
+                    
+                    @Override
+                    public int getBossThreadCount() {
+                        return threads.getBossThreads();
+                    }
+                };
+            }
         };
     }
 
index fe19560c0018b34fb6eef9e8626159861bed78d2..dbc48866b02d1aed551d2382111d84122ed56939 100644 (file)
@@ -79,6 +79,14 @@ module openflow-switch-connection-provider-impl {
                     type string;
                 }
             }
+            container threads {
+                leaf boss-threads {
+                    type uint16;
+                }
+                leaf worker-threads {
+                    type uint16;
+                }
+            }
         }
     }
 }
\ No newline at end of file
index 17058269439a977735cbf637476224413c05e393..d0a76c8f95884d75f15ad81dbd4f67565f2748a7 100644 (file)
@@ -11,6 +11,7 @@ package org.opendaylight.openflowjava.protocol.it.integration;
 import java.net.InetAddress;
 
 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionConfiguration;
+import org.opendaylight.openflowjava.protocol.api.connection.ThreadConfiguration;
 import org.opendaylight.openflowjava.protocol.api.connection.TlsConfiguration;
 
 /**
@@ -24,6 +25,7 @@ public class ConnectionConfigurationImpl implements ConnectionConfiguration {
     private Object transferProtocol;
     private TlsConfiguration tlsConfig;
     private long switchIdleTimeout;
+    private ThreadConfiguration threadConfig;
 
     /**
      * Creates {@link ConnectionConfigurationImpl}
@@ -70,4 +72,15 @@ public class ConnectionConfigurationImpl implements ConnectionConfiguration {
         return tlsConfig;
     }
 
-}
+    @Override
+    public ThreadConfiguration getThreadConfiguration() {
+        return threadConfig;
+    }
+
+    /**
+     * @param threadConfig thread model configuration (configures threads used)
+     */
+    public void setThreadConfiguration(ThreadConfiguration threadConfig) {
+        this.threadConfig = threadConfig;
+    }
+}
\ No newline at end of file