Dear Pulsar community,

I would like to start a discussion about having a plan to make Pulsar
runtime-compatible with JDK 17.


The goal is to run Pulsar using JDK17 at runtime, benefitting from the
latest JVM performance improvements and features.


The non-goal is to deprecate JDK8 or JDK11 runtime compatibility. The java
compiler *release* flag will be kept to 8 (this change deserves another
discussion thread).


*Build*


At the moment, the build command (mvn clean install -DskipTests) works well
using JDK17.


We fixed a lot of unit tests and other issues found using JDK17 removing
PowerMockito improper usages: https://github.com/apache/pulsar/pull/14098

Other small pulls were merged fixing other kinds of issues (all related to
the tests themself and not the production code).


*Runtime compatibility*


Currently I haven't seen severe issues running Pulsar on JDK17.

For testing purposes, I’ve created a simple image which pulls the Pulsar
master and installs JDK17-zulu instead of JDK11.

I've tried running the docker image in a Kubernetes environment (deploying
it with the Apache Pulsar helm chart), testing a few scenario:

* Produce and consume message (pulsar cli, pulsar perf)

* Functions/Connectors (embedding Nar files)


All the components/pods are working without visible issues. However my
tests weren't under high traffic and a lot of Pulsar features were not
involved in the tests.


The main problems might be caused by the restrictions around reflection
usage introduced in JDK17 JEP 403: Strongly Encapsulate JDK Internals
<https://openjdk.java.net/jeps/403>

We may need to unlock some packages to reflection to keep some
optimizations, for example for BookKeeper Native IO (
https://github.com/apache/bookkeeper/blob/master/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/NativeIO.java#L98
)


It would be great to chase other improvements to be explicitly unlocked for
other low-level libraries (Netty, GRPC...)



*Continuous Integration*

To maintain the support for JDK17 we need to switch all the CI jobs to
JDK17; the idea is to replace JDK11 completely. We could - not sure - keep
a single job for JDK11 compatibility, like we do with JDK8.



*Docker distribution*

After we get the Pulsar master CI stable, we can move the official Docker
images to JDK17 (currently on JDK11).



*Proposal plan*

We can start moving the CI to JDK17 after the branch-2.10 has been cut and
targeting JDK17 runtime support for Pulsar 2.11




WDYT?

BR,
Nicolò Boschi

Reply via email to