Murrah
Murrah

Reputation: 1690

Quarkus native build Random/SplittableRandom exception with Vert.x Redis Client

I am doing a native build of my Quarkus app and am hitting the UnsupportedFeatureException: Detected an instance of Random/SplittableRandom on a few Vertx Redis Client classes.

I am building using the docker container method: ./mvnw package -Dnative -Dquarkus.native.container-build=true

I have fixed some of the exceptions by including in the pom.xml:

<quarkus.native.additional-build-args>
  --initialize-at-run-time=io.vertx.redis.client.impl.RedisSentinelClient
</quarkus.native.additional-build-args>

but am stuck on this one:

Fatal error: com.oracle.graal.pointsto.util.AnalysisError$ParsingError: Error encountered while parsing
io.vertx.redis.client.impl.RedisClusterConnection.send(io.vertx.redis.client.Request) 
Parsing context:
   at io.vertx.redis.client.impl.RedisClusterConnection.send(RedisClusterConnection.java:117)
   at io.vertx.redis.client.impl.BaseRedisClient.lambda$send$1(BaseRedisClient.java:45)
   at io.vertx.redis.client.impl.BaseRedisClient$$Lambda$1711/0x00000007c1ea57e8.apply(Unknown Source)

I have tried adding

--initialize-at-run-time=io.vertx.redis.client.impl.RedisSentinelClient\,io.vertx.redis.client.impl.RedisClusterConnection
--initialize-at-run-time=io.vertx.redis.client.impl.RedisSentinelClient\,io.vertx.redis.client.impl.BaseRedisClient

and even

--initialize-at-run-time=io.vertx.redis.client.impl.RedisSentinelClient\,io.vertx.redis.client.impl.RedisReplicationConnection.send(io.vertx.redis.client.Request)

but the error persists.

I am fairly new to Java and very new to native building / GraalVM etc

Can anyone shed any light on what class I should add, please?

Thanks, Murray

Upvotes: 0

Views: 429

Answers (2)

Murrah
Murrah

Reputation: 1690

Ok, this seems to fix it: EDIT: No it doesn't. See below.

<quarkus.native.additional-build-args>
  --initialize-at-run-time=io.vertx.redis.client.impl.RedisSentinelClient\,io.vertx.redis.client.impl.RedisReplicationConnection
</quarkus.native.additional-build-args>

The full profiles section in the pom.xml looks like this, for anyone else new to all this.

<profiles>
  <profile>
    <id>native</id>
    <activation>
      <property>
        <name>native</name>
      </property>
    </activation>
    <properties>
      <skipITs>false</skipITs>
      <quarkus.package.type>native</quarkus.package.type>
      <quarkus.native.additional-build-args>
        --initialize-at-run-time=io.vertx.redis.client.impl.RedisSentinelClient\,io.vertx.redis.client.impl.RedisReplicationConnection
      </quarkus.native.additional-build-args>
    </properties>
  </profile>
</profiles>

I have different errors now, so still not building, but at least this seems to fix that specific issue.


EDIT: The problem persists...

If I build with the pom as described above, ie:

<quarkus.native.additional-build-args>
  --initialize-at-run-time=io.vertx.redis.client.impl.RedisSentinelClient\,io.vertx.redis.client.impl.RedisReplicationConnection
</quarkus.native.additional-build-args>

I now get:

Error: Classes that should be initialized at run time got initialized during image building:
io.vertx.redis.client.impl.RedisReplicationConnection 
the class was requested to be initialized at run time 
(from command line with 'io.vertx.redis.client.impl.RedisReplicationConnection').

So, I guess that is not the right class afterall.

If I remove that class from the list I revert to the Random exception. (Showing more detail)

[1/7] Initializing...                                                                                    (3.7s @ 0.10GB)
 Version info: 'GraalVM 22.3.1.0-Final Java 17 Mandrel Distribution'
 Java version info: '17.0.6+10'
 C compiler: gcc (linux, x86_64, 11.3.0)
 Garbage collector: Serial GC
 4 user-specific feature(s)
 - io.quarkus.runner.Feature: Auto-generated class by Quarkus from the existing extensions
 - io.quarkus.runtime.graal.DisableLoggingFeature: Disables INFO logging during the analysis phase for the [org.jboss.threads] categories
 - io.quarkus.runtime.graal.ResourcesFeature: Register each line in META-INF/quarkus-native-resources.txt as a resource on Substrate VM
 - io.quarkus.websockets.client.runtime.DisableLoggingFeature: Disables INFO logging during the analysis phase for the [io.undertow.websockets] categories
[2/7] Performing analysis...  [*]                                                                       (14.1s @ 3.37GB)
  12,032 (89.58%) of 13,432 classes reachable
  17,778 (59.65%) of 29,803 fields reachable
  61,621 (57.16%) of 107,809 methods reachable
     541 classes,   150 fields, and 2,655 methods registered for reflection

Fatal error: com.oracle.graal.pointsto.util.AnalysisError$ParsingError: Error encountered while parsing io.vertx.redis.client.impl.RedisReplicationConnection.send(io.vertx.redis.client.Request) 
Parsing context:
   at io.vertx.redis.client.impl.RedisReplicationConnection.send(RedisReplicationConnection.java:111)
   at io.vertx.redis.client.RedisConnection.send(RedisConnection.java:83)
   at io.vertx.redis.client.impl.RedisReplicationClient.getNodes(RedisReplicationClient.java:183)
   at io.vertx.redis.client.impl.RedisReplicationClient.lambda$connect$4(RedisReplicationClient.java:126)
   at io.vertx.redis.client.impl.RedisReplicationClient$$Lambda$2203/0x00000007c1630f60.handle(Unknown Source)
   at io.vertx.core.impl.future.FutureImpl$1.onSuccess(FutureImpl.java:91)

{etc}

I am beginning to think I have an error / issue in my code where I am using the Vert.x Redis Client. I am trying to narrow it down by trial and error.

Any other suggestions are most welcome.

Upvotes: 0

Paulo Lopes
Paulo Lopes

Reputation: 5811

I believe we can propose a change to vert.x redis client to avoid the split random use. The randomness is there mostly to share the load across nodes. It is not used for any security related features. For this reason, a proposal to either round-robin would probably make more sense as a solution to this issue.

Upvotes: 1

Related Questions