1919
2020package org .elasticsearch .transport .nio ;
2121
22+ import org .apache .logging .log4j .Logger ;
2223import org .elasticsearch .ElasticsearchException ;
2324import org .elasticsearch .action .ActionListener ;
2425import org .elasticsearch .cluster .node .DiscoveryNode ;
4647import java .io .IOException ;
4748import java .net .InetSocketAddress ;
4849import java .nio .ByteBuffer ;
49- import java .util .ArrayList ;
5050import java .util .concurrent .ConcurrentMap ;
51- import java .util .concurrent .ThreadFactory ;
5251import java .util .function .Consumer ;
5352import java .util .function .Supplier ;
5453
@@ -71,11 +70,8 @@ public class NioTransport extends TcpTransport {
7170
7271 private final PageCacheRecycler pageCacheRecycler ;
7372 private final ConcurrentMap <String , TcpChannelFactory > profileToChannelFactory = newConcurrentMap ();
74- private final ArrayList <AcceptingSelector > acceptors = new ArrayList <>();
75- private final ArrayList <SocketSelector > socketSelectors = new ArrayList <>();
76- private RoundRobinSelectorSupplier clientSelectorSupplier ;
77- private TcpChannelFactory clientChannelFactory ;
78- private int acceptorNumber ;
73+ private volatile NioGroup nioGroup ;
74+ private volatile TcpChannelFactory clientChannelFactory ;
7975
8076 public NioTransport (Settings settings , ThreadPool threadPool , NetworkService networkService , BigArrays bigArrays ,
8177 PageCacheRecycler pageCacheRecycler , NamedWriteableRegistry namedWriteableRegistry ,
@@ -87,14 +83,13 @@ public NioTransport(Settings settings, ThreadPool threadPool, NetworkService net
8783 @ Override
8884 protected TcpNioServerSocketChannel bind (String name , InetSocketAddress address ) throws IOException {
8985 TcpChannelFactory channelFactory = this .profileToChannelFactory .get (name );
90- AcceptingSelector selector = acceptors .get (++acceptorNumber % NioTransport .NIO_ACCEPTOR_COUNT .get (settings ));
91- return channelFactory .openNioServerSocketChannel (address , selector );
86+ return nioGroup .bindServerChannel (address , channelFactory );
9287 }
9388
9489 @ Override
9590 protected TcpNioSocketChannel initiateChannel (DiscoveryNode node , TimeValue connectTimeout , ActionListener <Void > connectListener )
9691 throws IOException {
97- TcpNioSocketChannel channel = clientChannelFactory . openNioChannel (node .getAddress ().address (), clientSelectorSupplier . get () );
92+ TcpNioSocketChannel channel = nioGroup . openChannel (node .getAddress ().address (), clientChannelFactory );
9893 channel .addConnectListener (connectListener );
9994 return channel ;
10095 }
@@ -103,42 +98,19 @@ protected TcpNioSocketChannel initiateChannel(DiscoveryNode node, TimeValue conn
10398 protected void doStart () {
10499 boolean success = false ;
105100 try {
106- int workerCount = NioTransport . NIO_WORKER_COUNT . get ( settings ) ;
107- for ( int i = 0 ; i < workerCount ; ++ i ) {
108- SocketSelector selector = new SocketSelector ( getSocketEventHandler ());
109- socketSelectors . add ( selector );
101+ int acceptorCount = 0 ;
102+ boolean useNetworkServer = NetworkService . NETWORK_SERVER . get ( settings );
103+ if ( useNetworkServer ) {
104+ acceptorCount = NioTransport . NIO_ACCEPTOR_COUNT . get ( settings );
110105 }
106+ nioGroup = new NioGroup (logger , daemonThreadFactory (this .settings , TRANSPORT_ACCEPTOR_THREAD_NAME_PREFIX ), acceptorCount ,
107+ AcceptorEventHandler ::new , daemonThreadFactory (this .settings , TRANSPORT_WORKER_THREAD_NAME_PREFIX ),
108+ NioTransport .NIO_WORKER_COUNT .get (settings ), this ::getSocketEventHandler );
111109
112- for (SocketSelector selector : socketSelectors ) {
113- if (selector .isRunning () == false ) {
114- ThreadFactory threadFactory = daemonThreadFactory (this .settings , TRANSPORT_WORKER_THREAD_NAME_PREFIX );
115- threadFactory .newThread (selector ::runLoop ).start ();
116- selector .isRunningFuture ().actionGet ();
117- }
118- }
119-
120- Consumer <NioSocketChannel > clientContextSetter = getContextSetter ("client-socket" );
121- clientSelectorSupplier = new RoundRobinSelectorSupplier (socketSelectors );
122110 ProfileSettings clientProfileSettings = new ProfileSettings (settings , "default" );
123- clientChannelFactory = new TcpChannelFactory (clientProfileSettings , clientContextSetter , getServerContextSetter ());
124-
125- if (NetworkService .NETWORK_SERVER .get (settings )) {
126- int acceptorCount = NioTransport .NIO_ACCEPTOR_COUNT .get (settings );
127- for (int i = 0 ; i < acceptorCount ; ++i ) {
128- Supplier <SocketSelector > selectorSupplier = new RoundRobinSelectorSupplier (socketSelectors );
129- AcceptorEventHandler eventHandler = new AcceptorEventHandler (logger , selectorSupplier );
130- AcceptingSelector acceptor = new AcceptingSelector (eventHandler );
131- acceptors .add (acceptor );
132- }
133-
134- for (AcceptingSelector acceptor : acceptors ) {
135- if (acceptor .isRunning () == false ) {
136- ThreadFactory threadFactory = daemonThreadFactory (this .settings , TRANSPORT_ACCEPTOR_THREAD_NAME_PREFIX );
137- threadFactory .newThread (acceptor ::runLoop ).start ();
138- acceptor .isRunningFuture ().actionGet ();
139- }
140- }
111+ clientChannelFactory = new TcpChannelFactory (clientProfileSettings , getContextSetter ("client" ), getServerContextSetter ());
141112
113+ if (useNetworkServer ) {
142114 // loop through all profiles and start them up, special handling for default one
143115 for (ProfileSettings profileSettings : profileSettings ) {
144116 String profileName = profileSettings .profileName ;
@@ -162,14 +134,15 @@ protected void doStart() {
162134
163135 @ Override
164136 protected void stopInternal () {
165- NioShutdown nioShutdown = new NioShutdown (logger );
166- nioShutdown .orderlyShutdown (acceptors , socketSelectors );
167-
137+ try {
138+ nioGroup .close ();
139+ } catch (Exception e ) {
140+ logger .warn ("unexpected exception while stopping nio group" , e );
141+ }
168142 profileToChannelFactory .clear ();
169- socketSelectors .clear ();
170143 }
171144
172- protected SocketEventHandler getSocketEventHandler () {
145+ protected SocketEventHandler getSocketEventHandler (Logger logger ) {
173146 return new SocketEventHandler (logger );
174147 }
175148
@@ -189,8 +162,7 @@ private Consumer<NioSocketChannel> getContextSetter(String profileName) {
189162 }
190163
191164 private void acceptChannel (NioSocketChannel channel ) {
192- TcpNioSocketChannel tcpChannel = (TcpNioSocketChannel ) channel ;
193- serverAcceptedChannel (tcpChannel );
165+ serverAcceptedChannel ((TcpNioSocketChannel ) channel );
194166
195167 }
196168
0 commit comments