Skip to content

Commit ff2d118

Browse files
authored
fix: Add native image reflect-config.json to gax-grpc (#1251)
* fix: Add native image reflect-config.json to gax-grpc * fix: Place all netty reflect configurations in GrpcNettyFeature.java * fix: format * ci: downstream test graalvm native image compilation on java-kms and java-os-login * fix: register full classes for reflection * fix: format * fix: add java17-required add-opens=java.base config to native-image.properties * fix: change add-opens argument to java.base/java.time
1 parent 2dae391 commit ff2d118

File tree

4 files changed

+316
-4
lines changed

4 files changed

+316
-4
lines changed

.kokoro/presubmit/common.cfg

+2-3
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ env_vars: {
3636
# builds.
3737
env_vars: {
3838
key: "MODULES_UNDER_TEST"
39-
value: "java-os-login,java-asset" # OS login's ITSystemTest exercises gax-java's native image
40-
# reflect-config.json.
41-
# Asset not required - added only as a sanity check.
39+
value: "java-kms,java-os-login" # KMS's ITKmsTest exercises gax-java's native image
40+
# reflect-config.json. OS Login has a similar issue.
4241
}

gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/nativeimage/GrpcNettyFeature.java

+25
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,13 @@ private static void loadGrpcNettyClasses(BeforeAnalysisAccess access) {
7878
registerClassForReflection(access, "io.grpc.netty.shaded.io.netty.util.ReferenceCountUtil");
7979
registerClassForReflection(
8080
access, "io.grpc.netty.shaded.io.netty.buffer.AbstractByteBufAllocator");
81+
registerForUnsafeFieldAccess(
82+
access, "io.grpc.netty.shaded.io.netty.buffer.AbstractReferenceCountedByteBuf", "refCnt");
83+
registerForUnsafeFieldAccess(
84+
access, "io.grpc.netty.shaded.io.netty.util.AbstractReferenceCounted", "refCnt");
85+
registerClassForReflection(access, "io.grpc.netty.shaded.io.netty.channel.DefaultFileRegion");
86+
registerClassForReflection(
87+
access, "io.grpc.netty.shaded.io.netty.channel.unix.PeerCredentials");
8188

8289
// Epoll Libraries
8390
registerClassForReflection(access, "io.grpc.netty.shaded.io.netty.channel.epoll.Epoll");
@@ -89,6 +96,24 @@ private static void loadGrpcNettyClasses(BeforeAnalysisAccess access) {
8996
access, "io.grpc.netty.shaded.io.netty.channel.epoll.EpollServerSocketChannel");
9097
registerForReflectiveInstantiation(
9198
access, "io.grpc.netty.shaded.io.netty.channel.epoll.EpollSocketChannel");
99+
registerClassForReflection(
100+
access,
101+
"io.grpc.netty.shaded.io.netty.channel.epoll.NativeDatagramPacketArray$NativeDatagramPacket");
102+
103+
// tcnative
104+
registerClassForReflection(
105+
access, "io.grpc.netty.shaded.io.netty.internal.tcnative.CertificateCallback");
106+
registerClassForReflection(
107+
access, "io.grpc.netty.shaded.io.netty.internal.tcnative.CertificateCallbackTask");
108+
registerClassForReflection(
109+
access, "io.grpc.netty.shaded.io.netty.internal.tcnative.SSLContext");
110+
registerClassForReflection(
111+
access, "io.grpc.netty.shaded.io.netty.internal.tcnative.SSLPrivateKeyMethodDecryptTask");
112+
registerClassForReflection(
113+
access, "io.grpc.netty.shaded.io.netty.internal.tcnative.SSLPrivateKeyMethodSignTask");
114+
registerClassForReflection(
115+
access, "io.grpc.netty.shaded.io.netty.internal.tcnative.SSLPrivateKeyMethodTask");
116+
registerClassForReflection(access, "io.grpc.netty.shaded.io.netty.internal.tcnative.SSLTask");
92117

93118
// Unsafe field accesses
94119
registerForUnsafeFieldAccess(

gax-java/gax-grpc/src/main/resources/META-INF/native-image/com.google.api/gax-grpc/native-image.properties

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
Args = --initialize-at-run-time=io.grpc.netty.shaded.io.netty.handler.ssl.OpenSsl,\
1+
Args=--add-opens=java.base/java.time=ALL-UNNAMED \
2+
--initialize-at-run-time=io.grpc.netty.shaded.io.netty.handler.ssl.OpenSsl,\
23
io.grpc.netty.shaded.io.netty.internal.tcnative.SSL,\
34
io.grpc.netty.shaded.io.netty.internal.tcnative.CertificateVerifier,\
45
io.grpc.netty.shaded.io.netty.internal.tcnative.SSLPrivateKeyMethod,\
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,287 @@
1+
[
2+
{
3+
"name": "[B"
4+
},
5+
{
6+
"name": "com.google.auth.Credentials",
7+
"allDeclaredFields": true
8+
},
9+
{
10+
"name": "com.google.auth.appengine.AppEngineCredentials"
11+
},
12+
{
13+
"name": "com.google.auth.oauth2.AccessToken",
14+
"allDeclaredFields": true
15+
},
16+
{
17+
"name": "com.google.auth.oauth2.GoogleCredentials",
18+
"allDeclaredFields": true,
19+
"methods": [
20+
{
21+
"name": "getQuotaProjectId",
22+
"parameterTypes": []
23+
}
24+
]
25+
},
26+
{
27+
"name": "com.google.auth.oauth2.OAuth2Credentials",
28+
"allDeclaredFields": true
29+
},
30+
{
31+
"name": "com.google.auth.oauth2.OAuth2Credentials$OAuthValue",
32+
"allDeclaredFields": true
33+
},
34+
{
35+
"name": "com.google.auth.oauth2.UserCredentials",
36+
"allDeclaredFields": true
37+
},
38+
{
39+
"name": "com.google.protobuf.ExtensionRegistry",
40+
"methods": [
41+
{
42+
"name": "getEmptyRegistry",
43+
"parameterTypes": []
44+
}
45+
]
46+
},
47+
{
48+
"name": "com.sun.crypto.provider.TlsMasterSecretGenerator",
49+
"methods": [
50+
{
51+
"name": "<init>",
52+
"parameterTypes": []
53+
}
54+
]
55+
},
56+
{
57+
"name": "com.sun.jndi.dns.DnsContextFactory"
58+
},
59+
{
60+
"name": "io.grpc.internal.DnsNameResolverProvider"
61+
},
62+
{
63+
"name": "io.grpc.internal.JndiResourceResolverFactory",
64+
"methods": [
65+
{
66+
"name": "<init>",
67+
"parameterTypes": []
68+
}
69+
]
70+
},
71+
{
72+
"name": "io.grpc.internal.PickFirstLoadBalancerProvider"
73+
},
74+
{
75+
"name": "io.grpc.util.SecretRoundRobinLoadBalancerProvider$Provider",
76+
"methods": [
77+
{
78+
"name": "<init>",
79+
"parameterTypes": []
80+
}
81+
]
82+
},
83+
{
84+
"name": "java.io.FileDescriptor"
85+
},
86+
{
87+
"name": "java.lang.Exception"
88+
},
89+
{
90+
"name": "java.lang.IllegalArgumentException"
91+
},
92+
{
93+
"name": "java.lang.NullPointerException"
94+
},
95+
{
96+
"name": "java.lang.Object",
97+
"allDeclaredFields": true,
98+
"queryAllDeclaredMethods": true
99+
},
100+
{
101+
"name": "java.lang.OutOfMemoryError"
102+
},
103+
{
104+
"name": "java.lang.String"
105+
},
106+
{
107+
"name": "java.lang.Throwable",
108+
"methods": [
109+
{
110+
"name": "addSuppressed",
111+
"parameterTypes": [
112+
"java.lang.Throwable"
113+
]
114+
}
115+
]
116+
},
117+
{
118+
"name": "java.nio.Bits",
119+
"fields": [
120+
{
121+
"name": "UNALIGNED"
122+
}
123+
]
124+
},
125+
{
126+
"name": "java.nio.Buffer",
127+
"fields": [
128+
{
129+
"name": "address"
130+
}
131+
]
132+
},
133+
{
134+
"name": "java.nio.ByteBuffer",
135+
"methods": [
136+
{
137+
"name": "alignedSlice",
138+
"parameterTypes": [
139+
"int"
140+
]
141+
}
142+
]
143+
},
144+
{
145+
"name": "java.nio.DirectByteBuffer",
146+
"methods": [
147+
{
148+
"name": "<init>",
149+
"parameterTypes": [
150+
"long",
151+
"int"
152+
]
153+
}
154+
]
155+
},
156+
{
157+
"name": "java.nio.channels.FileChannel"
158+
},
159+
{
160+
"name": "java.security.AlgorithmParametersSpi"
161+
},
162+
{
163+
"name": "java.security.KeyStoreSpi"
164+
},
165+
{
166+
"name": "java.security.MessageDigestSpi"
167+
},
168+
{
169+
"name": "java.security.SecureRandomParameters"
170+
},
171+
{
172+
"name": "java.sql.Date"
173+
},
174+
{
175+
"name": "java.time.Duration",
176+
"allDeclaredFields": true
177+
},
178+
{
179+
"name": "java.util.AbstractMap",
180+
"allDeclaredFields": true
181+
},
182+
{
183+
"name": "java.util.concurrent.atomic.LongAdder",
184+
"queryAllPublicConstructors": true,
185+
"methods": [
186+
{
187+
"name": "<init>",
188+
"parameterTypes": []
189+
},
190+
{
191+
"name": "add",
192+
"parameterTypes": [
193+
"long"
194+
]
195+
},
196+
{
197+
"name": "sum",
198+
"parameterTypes": []
199+
}
200+
]
201+
},
202+
{
203+
"name": "javax.naming.directory.InitialDirContext"
204+
},
205+
{
206+
"name": "javax.security.auth.x500.X500Principal",
207+
"fields": [
208+
{
209+
"name": "thisX500Name"
210+
}
211+
],
212+
"methods": [
213+
{
214+
"name": "<init>",
215+
"parameterTypes": [
216+
"sun.security.x509.X500Name"
217+
]
218+
}
219+
]
220+
},
221+
{
222+
"name": "jdk.internal.misc.Unsafe",
223+
"methods": [
224+
{
225+
"name": "getUnsafe",
226+
"parameterTypes": []
227+
}
228+
]
229+
},
230+
{
231+
"name": "sun.misc.Unsafe",
232+
"fields": [
233+
{
234+
"name": "theUnsafe"
235+
}
236+
],
237+
"methods": [
238+
{
239+
"name": "copyMemory",
240+
"parameterTypes": [
241+
"java.lang.Object",
242+
"long",
243+
"java.lang.Object",
244+
"long",
245+
"long"
246+
]
247+
},
248+
{
249+
"name": "getAndAddLong",
250+
"parameterTypes": [
251+
"java.lang.Object",
252+
"long",
253+
"long"
254+
]
255+
},
256+
{
257+
"name": "getAndSetObject",
258+
"parameterTypes": [
259+
"java.lang.Object",
260+
"long",
261+
"java.lang.Object"
262+
]
263+
},
264+
{
265+
"name": "invokeCleaner",
266+
"parameterTypes": [
267+
"java.nio.ByteBuffer"
268+
]
269+
},
270+
{
271+
"name": "storeFence",
272+
"parameterTypes": []
273+
}
274+
]
275+
},
276+
{
277+
"name": "sun.nio.ch.SelectorImpl",
278+
"fields": [
279+
{
280+
"name": "publicSelectedKeys"
281+
},
282+
{
283+
"name": "selectedKeys"
284+
}
285+
]
286+
}
287+
]

0 commit comments

Comments
 (0)