Netty epoll support. Now with updated pom.xml and features.xml to bring in the dependencies
Showing
4 changed files
with
46 additions
and
12 deletions
| ... | @@ -15,6 +15,7 @@ | ... | @@ -15,6 +15,7 @@ |
| 15 | <bundle>mvn:io.netty/netty-transport/4.0.23.Final</bundle> | 15 | <bundle>mvn:io.netty/netty-transport/4.0.23.Final</bundle> |
| 16 | <bundle>mvn:io.netty/netty-handler/4.0.23.Final</bundle> | 16 | <bundle>mvn:io.netty/netty-handler/4.0.23.Final</bundle> |
| 17 | <bundle>mvn:io.netty/netty-codec/4.0.23.Final</bundle> | 17 | <bundle>mvn:io.netty/netty-codec/4.0.23.Final</bundle> |
| 18 | + <bundle>io.netty/netty-transport-native-epoll/4.0.23.Final</bundle> | ||
| 18 | <bundle>mvn:commons-pool/commons-pool/1.6</bundle> | 19 | <bundle>mvn:commons-pool/commons-pool/1.6</bundle> |
| 19 | 20 | ||
| 20 | <bundle>mvn:com.hazelcast/hazelcast/3.3</bundle> | 21 | <bundle>mvn:com.hazelcast/hazelcast/3.3</bundle> | ... | ... |
| ... | @@ -312,6 +312,11 @@ | ... | @@ -312,6 +312,11 @@ |
| 312 | <artifactId>netty-codec</artifactId> | 312 | <artifactId>netty-codec</artifactId> |
| 313 | <version>${netty4.version}</version> | 313 | <version>${netty4.version}</version> |
| 314 | </dependency> | 314 | </dependency> |
| 315 | + <dependency> | ||
| 316 | + <groupId>io.netty</groupId> | ||
| 317 | + <artifactId>netty-transport-native-epoll</artifactId> | ||
| 318 | + <version>${netty4.version}</version> | ||
| 319 | + </dependency> | ||
| 315 | </dependencies> | 320 | </dependencies> |
| 316 | </dependencyManagement> | 321 | </dependencyManagement> |
| 317 | 322 | ... | ... |
| ... | @@ -55,6 +55,10 @@ | ... | @@ -55,6 +55,10 @@ |
| 55 | <groupId>io.netty</groupId> | 55 | <groupId>io.netty</groupId> |
| 56 | <artifactId>netty-codec</artifactId> | 56 | <artifactId>netty-codec</artifactId> |
| 57 | </dependency> | 57 | </dependency> |
| 58 | + <dependency> | ||
| 59 | + <groupId>io.netty</groupId> | ||
| 60 | + <artifactId>netty-transport-native-epoll</artifactId> | ||
| 61 | + </dependency> | ||
| 58 | </dependencies> | 62 | </dependencies> |
| 59 | 63 | ||
| 60 | </project> | 64 | </project> | ... | ... |
| ... | @@ -16,7 +16,12 @@ import io.netty.channel.ChannelHandlerContext; | ... | @@ -16,7 +16,12 @@ import io.netty.channel.ChannelHandlerContext; |
| 16 | import io.netty.channel.ChannelInitializer; | 16 | import io.netty.channel.ChannelInitializer; |
| 17 | import io.netty.channel.ChannelOption; | 17 | import io.netty.channel.ChannelOption; |
| 18 | import io.netty.channel.EventLoopGroup; | 18 | import io.netty.channel.EventLoopGroup; |
| 19 | +import io.netty.channel.ServerChannel; | ||
| 19 | import io.netty.channel.SimpleChannelInboundHandler; | 20 | import io.netty.channel.SimpleChannelInboundHandler; |
| 21 | +import io.netty.channel.epoll.Epoll; | ||
| 22 | +import io.netty.channel.epoll.EpollEventLoopGroup; | ||
| 23 | +import io.netty.channel.epoll.EpollServerSocketChannel; | ||
| 24 | +import io.netty.channel.epoll.EpollSocketChannel; | ||
| 20 | import io.netty.channel.nio.NioEventLoopGroup; | 25 | import io.netty.channel.nio.NioEventLoopGroup; |
| 21 | import io.netty.channel.socket.SocketChannel; | 26 | import io.netty.channel.socket.SocketChannel; |
| 22 | import io.netty.channel.socket.nio.NioServerSocketChannel; | 27 | import io.netty.channel.socket.nio.NioServerSocketChannel; |
| ... | @@ -40,9 +45,6 @@ public class NettyMessagingService implements MessagingService { | ... | @@ -40,9 +45,6 @@ public class NettyMessagingService implements MessagingService { |
| 40 | 45 | ||
| 41 | private final int port; | 46 | private final int port; |
| 42 | private final Endpoint localEp; | 47 | private final Endpoint localEp; |
| 43 | - private final EventLoopGroup bossGroup = new NioEventLoopGroup(); | ||
| 44 | - private EventLoopGroup workerGroup; | ||
| 45 | - private Class<? extends Channel> channelClass; | ||
| 46 | private final ConcurrentMap<String, MessageHandler> handlers = new ConcurrentHashMap<>(); | 48 | private final ConcurrentMap<String, MessageHandler> handlers = new ConcurrentHashMap<>(); |
| 47 | private final Cache<Long, AsyncResponse> responseFutures = CacheBuilder.newBuilder() | 49 | private final Cache<Long, AsyncResponse> responseFutures = CacheBuilder.newBuilder() |
| 48 | .maximumSize(100000) | 50 | .maximumSize(100000) |
| ... | @@ -53,10 +55,32 @@ public class NettyMessagingService implements MessagingService { | ... | @@ -53,10 +55,32 @@ public class NettyMessagingService implements MessagingService { |
| 53 | private final GenericKeyedObjectPool<Endpoint, Channel> channels | 55 | private final GenericKeyedObjectPool<Endpoint, Channel> channels |
| 54 | = new GenericKeyedObjectPool<Endpoint, Channel>(new OnosCommunicationChannelFactory()); | 56 | = new GenericKeyedObjectPool<Endpoint, Channel>(new OnosCommunicationChannelFactory()); |
| 55 | 57 | ||
| 56 | - // TODO: make this configurable. | 58 | + private EventLoopGroup serverGroup; |
| 59 | + private EventLoopGroup clientGroup; | ||
| 60 | + private Class<? extends ServerChannel> serverChannelClass; | ||
| 61 | + private Class<? extends Channel> clientChannelClass; | ||
| 62 | + | ||
| 57 | private void initEventLoopGroup() { | 63 | private void initEventLoopGroup() { |
| 58 | - workerGroup = new NioEventLoopGroup(); | 64 | + // try Epoll first and if that does work, use nio. |
| 59 | - channelClass = NioSocketChannel.class; | 65 | + // TODO: make this configurable. |
| 66 | + try { | ||
| 67 | + if (Epoll.isAvailable()) { | ||
| 68 | + clientGroup = new EpollEventLoopGroup(); | ||
| 69 | + serverGroup = new EpollEventLoopGroup(); | ||
| 70 | + serverChannelClass = EpollServerSocketChannel.class; | ||
| 71 | + clientChannelClass = EpollSocketChannel.class; | ||
| 72 | + return; | ||
| 73 | + } else { | ||
| 74 | + log.info("Netty epoll support is not available. Proceeding with nio."); | ||
| 75 | + } | ||
| 76 | + | ||
| 77 | + } catch (Throwable t) { | ||
| 78 | + log.warn("Failed to initialize epoll sockets. Proceeding with nio.", t); | ||
| 79 | + } | ||
| 80 | + clientGroup = new NioEventLoopGroup(); | ||
| 81 | + serverGroup = new NioEventLoopGroup(); | ||
| 82 | + serverChannelClass = NioServerSocketChannel.class; | ||
| 83 | + clientChannelClass = NioSocketChannel.class; | ||
| 60 | } | 84 | } |
| 61 | 85 | ||
| 62 | public NettyMessagingService() { | 86 | public NettyMessagingService() { |
| ... | @@ -84,8 +108,8 @@ public class NettyMessagingService implements MessagingService { | ... | @@ -84,8 +108,8 @@ public class NettyMessagingService implements MessagingService { |
| 84 | 108 | ||
| 85 | public void deactivate() throws Exception { | 109 | public void deactivate() throws Exception { |
| 86 | channels.close(); | 110 | channels.close(); |
| 87 | - bossGroup.shutdownGracefully(); | 111 | + serverGroup.shutdownGracefully(); |
| 88 | - workerGroup.shutdownGracefully(); | 112 | + clientGroup.shutdownGracefully(); |
| 89 | } | 113 | } |
| 90 | 114 | ||
| 91 | @Override | 115 | @Override |
| ... | @@ -149,8 +173,8 @@ public class NettyMessagingService implements MessagingService { | ... | @@ -149,8 +173,8 @@ public class NettyMessagingService implements MessagingService { |
| 149 | b.option(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 8 * 1024); | 173 | b.option(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 8 * 1024); |
| 150 | // TODO: Need JVM options to configure PooledByteBufAllocator. | 174 | // TODO: Need JVM options to configure PooledByteBufAllocator. |
| 151 | b.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); | 175 | b.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); |
| 152 | - b.group(bossGroup, workerGroup) | 176 | + b.group(serverGroup, clientGroup) |
| 153 | - .channel(NioServerSocketChannel.class) | 177 | + .channel(serverChannelClass) |
| 154 | .childHandler(new OnosCommunicationChannelInitializer()) | 178 | .childHandler(new OnosCommunicationChannelInitializer()) |
| 155 | .option(ChannelOption.SO_BACKLOG, 128) | 179 | .option(ChannelOption.SO_BACKLOG, 128) |
| 156 | .childOption(ChannelOption.SO_KEEPALIVE, true); | 180 | .childOption(ChannelOption.SO_KEEPALIVE, true); |
| ... | @@ -178,10 +202,10 @@ public class NettyMessagingService implements MessagingService { | ... | @@ -178,10 +202,10 @@ public class NettyMessagingService implements MessagingService { |
| 178 | bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); | 202 | bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); |
| 179 | bootstrap.option(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, 32 * 1024); | 203 | bootstrap.option(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, 32 * 1024); |
| 180 | bootstrap.option(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 8 * 1024); | 204 | bootstrap.option(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 8 * 1024); |
| 181 | - bootstrap.group(workerGroup); | 205 | + bootstrap.group(clientGroup); |
| 182 | // TODO: Make this faster: | 206 | // TODO: Make this faster: |
| 183 | // http://normanmaurer.me/presentations/2014-facebook-eng-netty/slides.html#37.0 | 207 | // http://normanmaurer.me/presentations/2014-facebook-eng-netty/slides.html#37.0 |
| 184 | - bootstrap.channel(channelClass); | 208 | + bootstrap.channel(clientChannelClass); |
| 185 | bootstrap.option(ChannelOption.SO_KEEPALIVE, true); | 209 | bootstrap.option(ChannelOption.SO_KEEPALIVE, true); |
| 186 | bootstrap.handler(new OnosCommunicationChannelInitializer()); | 210 | bootstrap.handler(new OnosCommunicationChannelInitializer()); |
| 187 | // Start the client. | 211 | // Start the client. | ... | ... |
-
Please register or login to post a comment