Skip to content

Commit 506f2a3

Browse files
authored
fix: use shaded netty transport jar (#1694)
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
1 parent ecc3c31 commit 506f2a3

3 files changed

Lines changed: 15 additions & 41 deletions

File tree

providers/flagd/pom.xml

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
<properties>
1717
<!-- exclusion expression for e2e tests -->
1818
<testExclusions>**/e2e/*.java</testExclusions>
19-
<io.grpc.version>1.77.0</io.grpc.version>
19+
<io.grpc.version>1.79.0</io.grpc.version>
2020
<!-- caution - updating this will break compatibility with older protobuf-java versions -->
2121
<protobuf-java.min.version>3.25.6</protobuf-java.min.version>
2222
</properties>
@@ -44,7 +44,7 @@
4444

4545
<dependency>
4646
<groupId>io.grpc</groupId>
47-
<artifactId>grpc-netty</artifactId>
47+
<artifactId>grpc-netty-shaded</artifactId>
4848
<version>${io.grpc.version}</version>
4949
</dependency>
5050

@@ -60,14 +60,7 @@
6060
<version>${io.grpc.version}</version>
6161
</dependency>
6262

63-
<dependency>
64-
<!-- we only support unix sockets on linux, via epoll native lib -->
65-
<groupId>io.netty</groupId>
66-
<artifactId>netty-transport-native-epoll</artifactId>
67-
<version>4.2.7.Final</version>
68-
<!-- TODO: with 5+ (still alpha), arm is support and we should package multiple versions -->
69-
<classifier>linux-x86_64</classifier>
70-
</dependency>
63+
<!-- grpc-netty-shaded bundles netty with epoll support for unix sockets -->
7164

7265
<dependency>
7366
<groupId>com.fasterxml.jackson.core</groupId>

providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/common/ChannelBuilder.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,12 @@
1313
import io.grpc.MethodDescriptor;
1414
import io.grpc.NameResolverRegistry;
1515
import io.grpc.Status.Code;
16-
import io.grpc.netty.GrpcSslContexts;
17-
import io.grpc.netty.NettyChannelBuilder;
18-
import io.netty.channel.MultiThreadIoEventLoopGroup;
19-
import io.netty.channel.epoll.Epoll;
20-
import io.netty.channel.epoll.EpollDomainSocketChannel;
21-
import io.netty.channel.epoll.EpollIoHandler;
22-
import io.netty.channel.unix.DomainSocketAddress;
23-
import io.netty.handler.ssl.SslContextBuilder;
16+
import io.grpc.netty.shaded.io.grpc.netty.GrpcSslContexts;
17+
import io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder;
18+
import io.grpc.netty.shaded.io.netty.channel.epoll.Epoll;
19+
import io.grpc.netty.shaded.io.netty.channel.epoll.EpollDomainSocketChannel;
20+
import io.grpc.netty.shaded.io.netty.channel.unix.DomainSocketAddress;
21+
import io.grpc.netty.shaded.io.netty.handler.ssl.SslContextBuilder;
2422
import java.io.File;
2523
import java.net.URI;
2624
import java.net.URISyntaxException;
@@ -107,7 +105,6 @@ public static ManagedChannel nettyChannel(final FlagdOptions options) {
107105
}
108106
var channelBuilder = NettyChannelBuilder.forAddress(new DomainSocketAddress(options.getSocketPath()))
109107
.keepAliveTime(keepAliveMs, TimeUnit.MILLISECONDS)
110-
.eventLoopGroup(new MultiThreadIoEventLoopGroup(EpollIoHandler.newFactory()))
111108
.channelType(EpollDomainSocketChannel.class)
112109
.usePlaintext()
113110
.defaultServiceConfig(buildRetryPolicy(options))

providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/common/ChannelBuilderTest.java

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,6 @@
77
import static org.mockito.ArgumentMatchers.anyList;
88
import static org.mockito.ArgumentMatchers.anyLong;
99
import static org.mockito.ArgumentMatchers.anyString;
10-
import static org.mockito.Mockito.any;
11-
import static org.mockito.Mockito.anyLong;
12-
import static org.mockito.Mockito.anyString;
1310
import static org.mockito.Mockito.doReturn;
1411
import static org.mockito.Mockito.mock;
1512
import static org.mockito.Mockito.mockStatic;
@@ -19,15 +16,12 @@
1916
import dev.openfeature.contrib.providers.flagd.FlagdOptions;
2017
import io.grpc.ClientInterceptor;
2118
import io.grpc.ManagedChannel;
22-
import io.grpc.netty.GrpcSslContexts;
23-
import io.grpc.netty.NettyChannelBuilder;
24-
import io.netty.channel.IoHandlerFactory;
25-
import io.netty.channel.MultiThreadIoEventLoopGroup;
26-
import io.netty.channel.epoll.Epoll;
27-
import io.netty.channel.epoll.EpollDomainSocketChannel;
28-
import io.netty.channel.epoll.EpollIoHandler;
29-
import io.netty.channel.unix.DomainSocketAddress;
30-
import io.netty.handler.ssl.SslContextBuilder;
19+
import io.grpc.netty.shaded.io.grpc.netty.GrpcSslContexts;
20+
import io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder;
21+
import io.grpc.netty.shaded.io.netty.channel.epoll.Epoll;
22+
import io.grpc.netty.shaded.io.netty.channel.epoll.EpollDomainSocketChannel;
23+
import io.grpc.netty.shaded.io.netty.channel.unix.DomainSocketAddress;
24+
import io.grpc.netty.shaded.io.netty.handler.ssl.SslContextBuilder;
3125
import java.io.File;
3226
import java.util.ArrayList;
3327
import java.util.List;
@@ -46,12 +40,10 @@ class ChannelBuilderTest {
4640
@EnabledOnOs(OS.LINUX)
4741
void testNettyChannel_withSocketPath() {
4842
try (MockedStatic<Epoll> epollMock = mockStatic(Epoll.class);
49-
MockedStatic<EpollIoHandler> nativeMock = mockStatic(EpollIoHandler.class);
5043
MockedStatic<NettyChannelBuilder> nettyMock = mockStatic(NettyChannelBuilder.class)) {
5144

5245
// Mocks
5346
epollMock.when(Epoll::isAvailable).thenReturn(true);
54-
nativeMock.when(EpollIoHandler::newFactory).thenReturn(mock(IoHandlerFactory.class));
5547
NettyChannelBuilder mockBuilder = mock(NettyChannelBuilder.class);
5648
ManagedChannel mockChannel = mock(ManagedChannel.class);
5749

@@ -60,8 +52,6 @@ void testNettyChannel_withSocketPath() {
6052
.thenReturn(mockBuilder);
6153

6254
when(mockBuilder.keepAliveTime(anyLong(), any(TimeUnit.class))).thenReturn(mockBuilder);
63-
when(mockBuilder.eventLoopGroup(any(MultiThreadIoEventLoopGroup.class)))
64-
.thenReturn(mockBuilder);
6555
when(mockBuilder.channelType(EpollDomainSocketChannel.class)).thenReturn(mockBuilder);
6656
when(mockBuilder.defaultServiceConfig(any())).thenReturn(mockBuilder);
6757
when(mockBuilder.maxRetryAttempts(anyInt())).thenReturn(mockBuilder);
@@ -82,7 +72,6 @@ void testNettyChannel_withSocketPath() {
8272
assertThat(channel).isEqualTo(mockChannel);
8373
nettyMock.verify(() -> NettyChannelBuilder.forAddress(new DomainSocketAddress("/path/to/socket")));
8474
verify(mockBuilder).keepAliveTime(1000, TimeUnit.MILLISECONDS);
85-
verify(mockBuilder).eventLoopGroup(any(MultiThreadIoEventLoopGroup.class));
8675
verify(mockBuilder).channelType(EpollDomainSocketChannel.class);
8776
verify(mockBuilder).usePlaintext();
8877
verify(mockBuilder).build();
@@ -93,12 +82,10 @@ void testNettyChannel_withSocketPath() {
9382
@EnabledOnOs(OS.LINUX)
9483
void testNettyChannel_withSocketPath_withRetryPolicy() {
9584
try (MockedStatic<Epoll> epollMock = mockStatic(Epoll.class);
96-
MockedStatic<EpollIoHandler> nativeMock = mockStatic(EpollIoHandler.class);
9785
MockedStatic<NettyChannelBuilder> nettyMock = mockStatic(NettyChannelBuilder.class)) {
9886

9987
// Mocks
10088
epollMock.when(Epoll::isAvailable).thenReturn(true);
101-
nativeMock.when(EpollIoHandler::newFactory).thenReturn(mock(IoHandlerFactory.class));
10289
NettyChannelBuilder mockBuilder = mock(NettyChannelBuilder.class);
10390
ManagedChannel mockChannel = mock(ManagedChannel.class);
10491

@@ -113,8 +100,6 @@ void testNettyChannel_withSocketPath_withRetryPolicy() {
113100
.thenReturn(mockBuilder);
114101

115102
when(mockBuilder.keepAliveTime(anyLong(), any(TimeUnit.class))).thenReturn(mockBuilder);
116-
when(mockBuilder.eventLoopGroup(any(MultiThreadIoEventLoopGroup.class)))
117-
.thenReturn(mockBuilder);
118103
when(mockBuilder.channelType(EpollDomainSocketChannel.class)).thenReturn(mockBuilder);
119104
when(mockBuilder.defaultServiceConfig(ChannelBuilder.buildRetryPolicy(options)))
120105
.thenReturn(mockBuilder);
@@ -129,7 +114,6 @@ void testNettyChannel_withSocketPath_withRetryPolicy() {
129114
assertThat(channel).isEqualTo(mockChannel);
130115
nettyMock.verify(() -> NettyChannelBuilder.forAddress(new DomainSocketAddress("/path/to/socket")));
131116
verify(mockBuilder).keepAliveTime(1000, TimeUnit.MILLISECONDS);
132-
verify(mockBuilder).eventLoopGroup(any(MultiThreadIoEventLoopGroup.class));
133117
verify(mockBuilder).channelType(EpollDomainSocketChannel.class);
134118
verify(mockBuilder).defaultServiceConfig(ChannelBuilder.buildRetryPolicy(options));
135119
verify(mockBuilder).usePlaintext();

0 commit comments

Comments
 (0)