chore: prepare showcase for Graal SDK 23.x#3574
Conversation
| @@ -0,0 +1,3 @@ | |||
| Args = --initialize-at-build-time=io.grpc.internal.TimeProvider,\ | |||
There was a problem hiding this comment.
Do we know why they have to be added? Are they showcase specific or we have to add them to common modules like Gax as well?
There was a problem hiding this comment.
It's definitely at the grpc level. I'll test with another library to see if it happens and possible move this config to gax.
There was a problem hiding this comment.
I obtained this from trying the native tests in java-firestore
JUnit Vintage:SpannerClientTest
ClassSource [className = 'com.google.cloud.spanner.v1.SpannerClientTest', filePosition = null]
=> org.opentest4j.MultipleFailuresError: Multiple Failures (2 failures)
java.lang.NoClassDefFoundError: Could not initialize class io.grpc.internal.TimeProvider
java.lang.NullPointerException: <no message>
io.grpc.internal.CallTracer$1.create(CallTracer.java:74)
io.grpc.internal.ServerImpl.<init>(ServerImpl.java:164)
io.grpc.internal.ServerImplBuilder.build(ServerImplBuilder.java:245)
io.grpc.ForwardingServerBuilder.build(ForwardingServerBuilder.java:201)
com.google.api.gax.grpc.testing.MockServiceHelper.<init>(MockServiceHelper.java:62)
[...]
com.google.cloud.spanner.v1.SpannerClientTest.stopServer(SpannerClientTest.java:112)
java.base@23.0.1/java.lang.reflect.Method.invoke(Method.java:580)
I'll move this to gax
There was a problem hiding this comment.
So if I understand correctly, TimeProvider and InstantTimeProvider are now used during client initialization by grpc-java, hence we have to add them to native-image.properties? This is not due to GraalVM upgrade but rather a grpc upgrade?
There was a problem hiding this comment.
Thanks, Diego! I think the solution makes sense.
However, looking at the change in grpc, we should've run into this error since two months ago, do we know why only GraalSDK 23.x triggered this error?
There was a problem hiding this comment.
I'll look into commits and release notes of the Graal SDK.
There was a problem hiding this comment.
Looks like Graal SDK 22 introduced a new class initialization strategy called strict image heap, which is enforced by default.
Since this is a behavior change affecting which classes are initialized, I'm leaning towards this new strategy being the cause.
There was a problem hiding this comment.
This is the parent feature: oracle/graal#4684
This was followed by the new strategy by default: oracle/graal#7474
There was a problem hiding this comment.
Perfect, thanks! Do you mind adding these info to the description? Also be mindful that this change may affect handwritten libraries as well.
|
|
### Approach Register `java.time.Instant` to the reflection configuration of gax-grpc (see [grpc code interacting with this class](grpc/grpc-java#11604)) This comes from a behavior change in Graal for JDK 22, which introduced a new class initialization strategy called strict image heap, which is [enforced by default since then](https://www.graalvm.org/release-notes/JDK_22/). ### Proof: ``` com.google.showcase.v1beta1.EchoClientTest > blockExceptionTest SUCCESSFUL Test run finished after 95953 ms [ 30 containers found ] [ 0 containers skipped ] [ 30 containers started ] [ 0 containers aborted ] [ 30 containers successful ] [ 0 containers failed ] [ 337 tests found ] [ 1 tests skipped ] [ 336 tests started ] [ 0 tests aborted ] [ 336 tests successful ] [ 0 tests failed ] [INFO] [INFO] --- jacoco:0.8.12:report (report) @ gapic-showcase --- [INFO] Loading execution data file /usr/local/google/home/diegomarquezp/google/sdk-platform-java/showcase/gapic-showcase/target/jacoco.exec [INFO] Analyzed bundle 'GAPIC Showcase Client' with 125 classes [WARNING] Classes in bundle 'GAPIC Showcase Client' do not match with execution data. For report generation the same class files must be used as at runtime. [WARNING] Execution data for class com/google/showcase/v1beta1/stub/HttpJsonSequenceServiceStub does not match. [WARNING] Execution data for class com/google/showcase/v1beta1/stub/HttpJsonMessagingCallableFactory does not match. [WARNING] Execution data for class com/google/showcase/v1beta1/stub/HttpJsonSequenceServiceCallableFactory does not match. [WARNING] Execution data for class com/google/showcase/v1beta1/stub/HttpJsonTestingCallableFactory does not match. [WARNING] Execution data for class com/google/showcase/v1beta1/stub/HttpJsonTestingStub does not match. [WARNING] Execution data for class com/google/showcase/v1beta1/stub/HttpJsonMessagingStub does not match. [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary for GAPIC Showcase Client Core Parent 0.0.1-SNAPSHOT: [INFO] [INFO] GAPIC Showcase Client Core Parent .................. SUCCESS [ 1.709 s] [INFO] proto-gapic-showcase-v1beta1 ....................... SUCCESS [ 0.900 s] [INFO] grpc-gapic-showcase-v1beta1 ........................ SUCCESS [ 0.385 s] [INFO] GAPIC Showcase Client .............................. SUCCESS [05:29 min] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 05:34 min [INFO] Finished at: 2025-01-20T19:04:42Z [INFO] ------------------------------------------------------------------------ ```



Approach
Register
java.time.Instantto the reflection configuration of gax-grpc (see grpc code interacting with this class)This comes from a behavior change in Graal for JDK 22, which introduced a new class initialization strategy called strict image heap, which is enforced by default since then.
Proof: