Skip to content

[SPARK-XXXXX][CORE] Tolerate missing jdk.internal.ref.Cleaner on JDK 26+#56952

Open
krishnamanchikalapudi wants to merge 1 commit into
apache:masterfrom
krishnamanchikalapudi:SPARK-XXXXX-jdk26-platform-cleaner
Open

[SPARK-XXXXX][CORE] Tolerate missing jdk.internal.ref.Cleaner on JDK 26+#56952
krishnamanchikalapudi wants to merge 1 commit into
apache:masterfrom
krishnamanchikalapudi:SPARK-XXXXX-jdk26-platform-cleaner

Conversation

@krishnamanchikalapudi

Copy link
Copy Markdown

on normal GC instead — the same fallback already
used when --add-opens java.base/jdk.internal.ref=ALL-UNNAMED isn't granted.

How was this patch tested?

Manually verified the logic change; recommend running the existing
PlatformSuite in common/unsafe on both an older JDK and JDK 26 to confirm
cleanerCreateMethodIsDefined() returns false (rather than throwing) on JDK 26.
Platform's static initializer treated any failure to load
jdk.internal.ref.Cleaner as fatal, wrapping it in an IllegalStateException
that aborted class init. On JDK 26 the class was removed outright
(ClassNotFoundException) rather than merely made inaccessible, which wasn't
handled the same way as the existing --add-opens-denied case, so
SparkContext creation failed with ExceptionInInitializerError.

Now ClassNotFoundException/NoSuchMethodException from the Cleaner lookup
falls back to CLEANER_CREATE_METHOD = null, same as when reflective access
is denied. Direct-buffer allocation already checks for null and simply
skips the eager-cleanup optimization, relying on normal GC instead.

What changes were proposed in this pull request?

Why are the changes needed?

Does this PR introduce any user-facing change?

How was this patch tested?

Was this patch authored or co-authored using generative AI tooling?

Platform's static initializer treated any failure to load
jdk.internal.ref.Cleaner as fatal, wrapping it in an IllegalStateException
that aborted class init. On JDK 26 the class was removed outright
(ClassNotFoundException) rather than merely made inaccessible, which wasn't
handled the same way as the existing --add-opens-denied case, so
SparkContext creation failed with ExceptionInInitializerError.

Now ClassNotFoundException/NoSuchMethodException from the Cleaner lookup
falls back to CLEANER_CREATE_METHOD = null, same as when reflective access
is denied. Direct-buffer allocation already checks for null and simply
skips the eager-cleanup optimization, relying on normal GC instead.
@pan3793

pan3793 commented Jul 2, 2026

Copy link
Copy Markdown
Member

I don't think it's the right fix direction, we should make the cleaner work on JDK 26 instead

@pan3793

pan3793 commented Jul 2, 2026

Copy link
Copy Markdown
Member

I opened #56954 with a different solution.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants