taoensso/nippy

GraalVM native-image fail when serializing Exception

BrunoBonacci opened this issue · 5 comments

Hi,

I tried to use Nippy with a GraalVM compiled project and I stumbled into an issue.
It seems that Nippy, when compiled via GraalVM, can't serialize Exceptions.
Other data-types seems to work fine.

See the sample project here on how to reproduce the problem.
https://github.com/BrunoBonacci/graalvm-clojure/tree/master/nippy

Do you have any idea why would that be the case?

Hi Bruno, not off hand- sorry!

But based on the error you're seeing:

Exception in thread "main" clojure.lang.ExceptionInfo: Unfreezable type: class clojure.lang.ExceptionInfo {:type clojure.lang.ExceptionInfo, :as-str "#error {\n :cause "ExInfo"\n :data {:data "data"}\n :via\n [{:type clojure.lang.ExceptionInfo\n :message "ExInfo"\n :data {:data "data"}}]\n :trace\n []}"}

Which comes from here, via here - I suspect that this util may be returning falsey.

I'd suggest experimenting a bit with the util to see precisely what the issue seems to be. Could be the util needs to be tweaked.

PRs welcome!

EDIT: As an alternative to figuring out why the Serializable fallback isn't working, you could probably also just add a specific freeze+thaw implementation for Exception or ExceptionInfo.

I see,
The reason it fails is because of this (Class/forName class-name) call here

By default, the native-image will throw a java.lang.ClassNotFoundException because of the close-world assumption.
There are ways to hint that the class is already loaded via a special config (see here)

I will experiment a bit more to see if it can be solved via configuration only.
thx

So, after providing the correct Reflective config I get another error:
com.oracle.svm.core.jdk.UnsupportedFeatureError: ObjectOutputStream.writeObject()

Which is due to the fact that serialization isn't supported yet:
oracle/graal#460

I will close this issue for the moment, as there is no general way to fix this. Thanks for your help.

This is fixed in GraalVM 21.3.0. @ptaoussanis would you like to accept the PR with the necessary configuration to support this?

See here

@FieryCod Would be happy to look at a PR, thanks Karol 👍