Skip to content

Commit b2789d5

Browse files
committed
Fix ChannelResolver check for MultiThreadIoEventLoopGroup
1 parent 2f6525f commit b2789d5

File tree

3 files changed

+19
-12
lines changed

3 files changed

+19
-12
lines changed

http-clients/netty-nio-client/src/main/java/software/amazon/awssdk/http/nio/netty/SdkEventLoopGroup.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import io.netty.channel.Channel;
1919
import io.netty.channel.ChannelFactory;
2020
import io.netty.channel.EventLoopGroup;
21+
import io.netty.channel.IoHandlerFactory;
2122
import io.netty.channel.MultiThreadIoEventLoopGroup;
2223
import io.netty.channel.nio.NioIoHandler;
2324
import io.netty.channel.socket.DatagramChannel;
@@ -125,6 +126,10 @@ public static SdkEventLoopGroup create(EventLoopGroup eventLoopGroup, ChannelFac
125126
* <p>
126127
* {@link ChannelFactory} will be resolved based on the type of {@link EventLoopGroup} provided. IllegalArgumentException will
127128
* be thrown for any unknown EventLoopGroup type.
129+
* <p>
130+
* If {@link MultiThreadIoEventLoopGroup} is passed in, {@link NioSocketChannel} and {@link NioDatagramChannel} will be
131+
* resolved, regardless of the transport {@link IoHandlerFactory} passed in. This is because it is not possible to
132+
* determine the type of transport factory from a given {@link MultiThreadIoEventLoopGroup}.
128133
*
129134
* @param eventLoopGroup the EventLoopGroup to be used
130135
* @return a new instance of SdkEventLoopGroup

http-clients/netty-nio-client/src/main/java/software/amazon/awssdk/http/nio/netty/internal/utils/ChannelResolver.java

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ public static ChannelFactory<? extends Channel> resolveSocketChannelFactory(Even
6868
return resolveSocketChannelFactory(((DelegatingEventLoopGroup) eventLoopGroup).getDelegate());
6969
}
7070

71-
if (isNioGroup(eventLoopGroup)) {
72-
return NioSocketChannel::new;
73-
}
7471
if (eventLoopGroup instanceof EpollEventLoopGroup) {
7572
return EpollSocketChannel::new;
7673
}
74+
if (eventLoopGroup instanceof MultiThreadIoEventLoopGroup) {
75+
return NioSocketChannel::new;
76+
}
7777

7878
String socketFqcn = KNOWN_EL_GROUPS_SOCKET_CHANNELS.get(eventLoopGroup.getClass().getName());
7979
if (socketFqcn == null) {
@@ -96,12 +96,12 @@ public static ChannelFactory<? extends DatagramChannel> resolveDatagramChannelFa
9696
return resolveDatagramChannelFactory(((DelegatingEventLoopGroup) eventLoopGroup).getDelegate());
9797
}
9898

99-
if (isNioGroup(eventLoopGroup)) {
100-
return NioDatagramChannel::new;
101-
}
10299
if (eventLoopGroup instanceof EpollEventLoopGroup) {
103100
return EpollDatagramChannel::new;
104101
}
102+
if (eventLoopGroup instanceof MultiThreadIoEventLoopGroup) {
103+
return NioDatagramChannel::new;
104+
}
105105

106106
String datagramFqcn = KNOWN_EL_GROUPS_DATAGRAM_CHANNELS.get(eventLoopGroup.getClass().getName());
107107
if (datagramFqcn == null) {
@@ -110,10 +110,4 @@ public static ChannelFactory<? extends DatagramChannel> resolveDatagramChannelFa
110110

111111
return invokeSafely(() -> new ReflectiveChannelFactory(Class.forName(datagramFqcn)));
112112
}
113-
114-
private static boolean isNioGroup(EventLoopGroup group) {
115-
return group instanceof NioEventLoopGroup ||
116-
group instanceof MultiThreadIoEventLoopGroup;
117-
}
118-
119113
}

http-clients/netty-nio-client/src/test/java/software/amazon/awssdk/http/nio/netty/internal/utils/ChannelResolverTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919
import static software.amazon.awssdk.http.nio.netty.internal.utils.ChannelResolver.resolveDatagramChannelFactory;
2020
import static software.amazon.awssdk.http.nio.netty.internal.utils.ChannelResolver.resolveSocketChannelFactory;
2121

22+
import io.netty.channel.MultiThreadIoEventLoopGroup;
2223
import io.netty.channel.epoll.Epoll;
2324
import io.netty.channel.epoll.EpollDatagramChannel;
2425
import io.netty.channel.epoll.EpollEventLoopGroup;
2526
import io.netty.channel.epoll.EpollSocketChannel;
2627
import io.netty.channel.nio.NioEventLoopGroup;
28+
import io.netty.channel.nio.NioIoHandler;
2729
import io.netty.channel.oio.OioEventLoopGroup;
2830
import io.netty.channel.socket.nio.NioDatagramChannel;
2931
import io.netty.channel.socket.nio.NioSocketChannel;
@@ -41,6 +43,12 @@ public void canDetectFactoryForStandardNioEventLoopGroup() {
4143
assertThat(resolveDatagramChannelFactory(new NioEventLoopGroup()).newChannel()).isInstanceOf(NioDatagramChannel.class);
4244
}
4345

46+
@Test
47+
public void multiThreadIoEventLoopGroup_returnsNioChannels() {
48+
assertThat(resolveSocketChannelFactory(new MultiThreadIoEventLoopGroup(NioIoHandler.newFactory())).newChannel()).isInstanceOf(NioSocketChannel.class);
49+
assertThat(resolveDatagramChannelFactory(new MultiThreadIoEventLoopGroup(NioIoHandler.newFactory())).newChannel()).isInstanceOf(NioDatagramChannel.class);
50+
}
51+
4452
@Test
4553
public void canDetectEpollEventLoopGroupFactory() {
4654
Assumptions.assumeTrue(Epoll.isAvailable());

0 commit comments

Comments
 (0)