[#2308] Use SelectorProvider.open*() to open NIO channels and so remove condition when create new NIO channels.
Motivation: At the moment we use SocketChannel.open(), ServerSocketChannel.open() and DatagramSocketChannel.open(...) within the constructor of our NIO channels. This introduces a bottleneck if you create a lot of connections as these calls delegate to SelectorProvider.provider() which uses synchronized internal. This change removed the bottleneck. Modifications: Obtain a static instance of the SelectorProvider and use SelectorProvider.openSocketChannel(), SelectorProvider.openServerSocketChannel() and SelectorProvider.openDatagramChannel(). This eliminates the bottleneck as SelectorProvider.provider() is not called on every channel creation. Result: Less conditions when create new channels.
This commit is contained in:
parent
f396f40db9
commit
e0b2f34a37
1
pom.xml
1
pom.xml
@ -432,6 +432,7 @@
|
|||||||
<ignore>java.nio.channels.DatagramChannel</ignore>
|
<ignore>java.nio.channels.DatagramChannel</ignore>
|
||||||
<ignore>java.nio.channels.MembershipKey</ignore>
|
<ignore>java.nio.channels.MembershipKey</ignore>
|
||||||
<ignore>java.net.StandardProtocolFamily</ignore>
|
<ignore>java.net.StandardProtocolFamily</ignore>
|
||||||
|
<ignore>java.nio.channels.spi.SelectorProvider</ignore>
|
||||||
|
|
||||||
<!-- Used for NIO. 2 -->
|
<!-- Used for NIO. 2 -->
|
||||||
<ignore>java.nio.channels.AsynchronousChannel</ignore>
|
<ignore>java.nio.channels.AsynchronousChannel</ignore>
|
||||||
|
@ -45,6 +45,7 @@ import java.nio.ByteBuffer;
|
|||||||
import java.nio.channels.DatagramChannel;
|
import java.nio.channels.DatagramChannel;
|
||||||
import java.nio.channels.MembershipKey;
|
import java.nio.channels.MembershipKey;
|
||||||
import java.nio.channels.SelectionKey;
|
import java.nio.channels.SelectionKey;
|
||||||
|
import java.nio.channels.spi.SelectorProvider;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
@ -62,6 +63,7 @@ public final class NioDatagramChannel
|
|||||||
extends AbstractNioMessageChannel implements io.netty.channel.socket.DatagramChannel {
|
extends AbstractNioMessageChannel implements io.netty.channel.socket.DatagramChannel {
|
||||||
|
|
||||||
private static final ChannelMetadata METADATA = new ChannelMetadata(true);
|
private static final ChannelMetadata METADATA = new ChannelMetadata(true);
|
||||||
|
private static final SelectorProvider SELECTOR_PROVIDER = SelectorProvider.provider();
|
||||||
|
|
||||||
private final DatagramChannelConfig config;
|
private final DatagramChannelConfig config;
|
||||||
private final Map<InetAddress, List<MembershipKey>> memberships =
|
private final Map<InetAddress, List<MembershipKey>> memberships =
|
||||||
@ -71,7 +73,13 @@ public final class NioDatagramChannel
|
|||||||
|
|
||||||
private static DatagramChannel newSocket() {
|
private static DatagramChannel newSocket() {
|
||||||
try {
|
try {
|
||||||
return DatagramChannel.open();
|
/**
|
||||||
|
* Use the {@link SelectorProvider} to open {@link SocketChannel} and so remove condition in
|
||||||
|
* {@link SelectorProvider#provider()} which is called by each DatagramChannel.open() otherwise.
|
||||||
|
*
|
||||||
|
* See <a href="See https://github.com/netty/netty/issues/2308">#2308</a>.
|
||||||
|
*/
|
||||||
|
return SELECTOR_PROVIDER.openDatagramChannel();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new ChannelException("Failed to open a socket.", e);
|
throw new ChannelException("Failed to open a socket.", e);
|
||||||
}
|
}
|
||||||
@ -85,7 +93,7 @@ public final class NioDatagramChannel
|
|||||||
checkJavaVersion();
|
checkJavaVersion();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return DatagramChannel.open(ProtocolFamilyConverter.convert(ipFamily));
|
return SELECTOR_PROVIDER.openDatagramChannel(ProtocolFamilyConverter.convert(ipFamily));
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new ChannelException("Failed to open a socket.", e);
|
throw new ChannelException("Failed to open a socket.", e);
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,7 @@ import java.net.SocketAddress;
|
|||||||
import java.nio.channels.SelectionKey;
|
import java.nio.channels.SelectionKey;
|
||||||
import java.nio.channels.ServerSocketChannel;
|
import java.nio.channels.ServerSocketChannel;
|
||||||
import java.nio.channels.SocketChannel;
|
import java.nio.channels.SocketChannel;
|
||||||
|
import java.nio.channels.spi.SelectorProvider;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -40,12 +41,19 @@ public class NioServerSocketChannel extends AbstractNioMessageChannel
|
|||||||
implements io.netty.channel.socket.ServerSocketChannel {
|
implements io.netty.channel.socket.ServerSocketChannel {
|
||||||
|
|
||||||
private static final ChannelMetadata METADATA = new ChannelMetadata(false);
|
private static final ChannelMetadata METADATA = new ChannelMetadata(false);
|
||||||
|
private static final SelectorProvider SELECTOR_PROVIDER = SelectorProvider.provider();
|
||||||
|
|
||||||
private static final InternalLogger logger = InternalLoggerFactory.getInstance(NioServerSocketChannel.class);
|
private static final InternalLogger logger = InternalLoggerFactory.getInstance(NioServerSocketChannel.class);
|
||||||
|
|
||||||
private static ServerSocketChannel newSocket() {
|
private static ServerSocketChannel newSocket() {
|
||||||
try {
|
try {
|
||||||
return ServerSocketChannel.open();
|
/**
|
||||||
|
* Use the {@link SelectorProvider} to open {@link SocketChannel} and so remove condition in
|
||||||
|
* {@link SelectorProvider#provider()} which is called by each ServerSocketChannel.open() otherwise.
|
||||||
|
*
|
||||||
|
* See <a href="See https://github.com/netty/netty/issues/2308">#2308</a>.
|
||||||
|
*/
|
||||||
|
return SELECTOR_PROVIDER.openServerSocketChannel();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new ChannelException(
|
throw new ChannelException(
|
||||||
"Failed to open a server socket.", e);
|
"Failed to open a server socket.", e);
|
||||||
|
@ -36,6 +36,7 @@ import java.net.SocketAddress;
|
|||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.nio.channels.SelectionKey;
|
import java.nio.channels.SelectionKey;
|
||||||
import java.nio.channels.SocketChannel;
|
import java.nio.channels.SocketChannel;
|
||||||
|
import java.nio.channels.spi.SelectorProvider;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link io.netty.channel.socket.SocketChannel} which uses NIO selector based implementation.
|
* {@link io.netty.channel.socket.SocketChannel} which uses NIO selector based implementation.
|
||||||
@ -43,10 +44,17 @@ import java.nio.channels.SocketChannel;
|
|||||||
public class NioSocketChannel extends AbstractNioByteChannel implements io.netty.channel.socket.SocketChannel {
|
public class NioSocketChannel extends AbstractNioByteChannel implements io.netty.channel.socket.SocketChannel {
|
||||||
|
|
||||||
private static final ChannelMetadata METADATA = new ChannelMetadata(false);
|
private static final ChannelMetadata METADATA = new ChannelMetadata(false);
|
||||||
|
private static final SelectorProvider SELECTOR_PROVIDER = SelectorProvider.provider();
|
||||||
|
|
||||||
private static SocketChannel newSocket() {
|
private static SocketChannel newSocket() {
|
||||||
try {
|
try {
|
||||||
return SocketChannel.open();
|
/**
|
||||||
|
* Use the {@link SelectorProvider} to open {@link SocketChannel} and so remove condition in
|
||||||
|
* {@link SelectorProvider#provider()} which is called by each SocketChannel.open() otherwise.
|
||||||
|
*
|
||||||
|
* See <a href="See https://github.com/netty/netty/issues/2308">#2308</a>.
|
||||||
|
*/
|
||||||
|
return SELECTOR_PROVIDER.openSocketChannel();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new ChannelException("Failed to open a socket.", e);
|
throw new ChannelException("Failed to open a socket.", e);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user