2 * Copyright © 2019 PANTHEON.tech, s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.ovsdb.lib.impl;
10 import com.google.common.util.concurrent.ThreadFactoryBuilder;
11 import io.netty.bootstrap.Bootstrap;
12 import io.netty.bootstrap.ServerBootstrap;
13 import io.netty.channel.AdaptiveRecvByteBufAllocator;
14 import io.netty.channel.ChannelOption;
15 import io.netty.channel.EventLoopGroup;
16 import io.netty.channel.epoll.Epoll;
17 import io.netty.channel.epoll.EpollEventLoopGroup;
18 import io.netty.channel.epoll.EpollServerSocketChannel;
19 import io.netty.channel.epoll.EpollSocketChannel;
20 import io.netty.channel.nio.NioEventLoopGroup;
21 import io.netty.channel.socket.nio.NioServerSocketChannel;
22 import io.netty.channel.socket.nio.NioSocketChannel;
23 import java.util.concurrent.ThreadFactory;
24 import javax.annotation.PreDestroy;
25 import javax.inject.Inject;
26 import javax.inject.Singleton;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
31 * A globally-instantiated context for use with OvsdbConnectionService.
34 public class NettyBootstrapFactory implements AutoCloseable {
35 private abstract static class Provider {
37 * Return user friendly name, suitable for system operators.
39 * @return An admin-friendly name.
41 abstract String name();
43 abstract EventLoopGroup createGroup(ThreadFactory threadFactory);
45 abstract Bootstrap createBootstrap();
47 abstract ServerBootstrap createServerBootstrap();
50 private static final class EpollProvider extends Provider {
57 EventLoopGroup createGroup(final ThreadFactory threadFactory) {
58 return new EpollEventLoopGroup(0, threadFactory);
62 Bootstrap createBootstrap() {
63 return new Bootstrap()
64 .channel(EpollSocketChannel.class);
68 ServerBootstrap createServerBootstrap() {
69 return new ServerBootstrap()
70 .channel(EpollServerSocketChannel.class);
74 private static final class NioProvider extends Provider {
81 EventLoopGroup createGroup(final ThreadFactory threadFactory) {
82 return new NioEventLoopGroup(0, threadFactory);
86 Bootstrap createBootstrap() {
87 return new Bootstrap()
88 .channel(NioSocketChannel.class);
92 ServerBootstrap createServerBootstrap() {
93 return new ServerBootstrap()
94 .channel(NioServerSocketChannel.class);
98 private static final Logger LOG = LoggerFactory.getLogger(NettyBootstrapFactory.class);
100 // Minimum footprint runtime-constant
101 private static final Provider PROVIDER = Epoll.isAvailable() ? new EpollProvider() : new NioProvider();
103 private final EventLoopGroup bossGroup;
104 private final EventLoopGroup workerGroup;
107 public NettyBootstrapFactory() {
108 bossGroup = PROVIDER.createGroup(new ThreadFactoryBuilder().setNameFormat("OVSDB listener-%d").build());
109 workerGroup = PROVIDER.createGroup(new ThreadFactoryBuilder().setNameFormat("OVSDB connection-%d").build());
110 LOG.info("OVSDB global Netty context started with {}", PROVIDER.name());
113 Bootstrap newClient() {
114 return PROVIDER.createBootstrap()
116 .option(ChannelOption.TCP_NODELAY, true)
117 .option(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(65535, 65535, 65535));
120 ServerBootstrap newServer() {
121 return PROVIDER.createServerBootstrap()
122 .group(bossGroup, workerGroup)
123 .option(ChannelOption.TCP_NODELAY, true)
124 .option(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(65535, 65535, 65535))
125 .option(ChannelOption.SO_BACKLOG, 100);
130 public void close() {
131 LOG.info("OVSDB global Netty context terminating");
132 bossGroup.shutdownGracefully().addListener(ignore -> {
133 LOG.info("OVSDB global server group terminated");
135 workerGroup.shutdownGracefully().addListener(ignore -> {
136 LOG.info("OVSDB global channel group terminated");