Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LambdaDeserializer makes incorrect call to JDK's altMetafactory which raises an IllegalArgumentException on JDK 17 #12419

Closed
SethTisue opened this issue Jun 21, 2021 · 14 comments
Assignees
Milestone

Comments

@SethTisue
Copy link
Member

SethTisue commented Jun 21, 2021

✗ jabba install openjdk@17-ea+27=tgz+https://download.java.net/java/early_access/jdk17/27/GPL/openjdk-17-ea+27_macos-x64_bin.tar.gz 

✗ jabba use openjdk@17-ea+27a

✗ SV=2.12.14; scalac --scala-version $SV -d /tmp test/files/run/lambda-serialization.scala && scala --scala-version $SV -cp /tmp Test
java.io.InvalidObjectException: ReflectiveOperationException during deserialization
	at java.base/java.lang.invoke.SerializedLambda.readResolve(SerializedLambda.java:280)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at java.base/java.io.ObjectStreamClass.invokeReadResolve(ObjectStreamClass.java:1321)
	at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2251)
	at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1742)
	at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:514)
	at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:472)
	at Test$.serializeDeserialize(lambda-serialization.scala:69)
	at Test$.$anonfun$allRealLambdasRoundTrip$1(lambda-serialization.scala:38)
	at Test$.$anonfun$allRealLambdasRoundTrip$1$adapted(lambda-serialization.scala:38)
	at scala.collection.immutable.List.map(List.scala:293)
	at Test$.allRealLambdasRoundTrip(lambda-serialization.scala:38)
	at Test$.main(lambda-serialization.scala:33)
	at Test.main(lambda-serialization.scala)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at scala.reflect.internal.util.RichClassLoader$.$anonfun$run$extension$1(ScalaClassLoader.scala:101)
	at scala.reflect.internal.util.RichClassLoader$.run$extension(ScalaClassLoader.scala:36)
	at scala.tools.nsc.CommonRunner.run(ObjectRunner.scala:29)
	at scala.tools.nsc.CommonRunner.run$(ObjectRunner.scala:27)
	at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:46)
	at scala.tools.nsc.CommonRunner.runAndCatch(ObjectRunner.scala:36)
	at scala.tools.nsc.CommonRunner.runAndCatch$(ObjectRunner.scala:35)
	at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:46)
	at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:73)
	at scala.tools.nsc.MainGenericRunner.run$1(MainGenericRunner.scala:92)
	at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:103)
	at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:108)
	at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
Caused by: java.lang.reflect.InvocationTargetException
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at java.base/java.lang.invoke.SerializedLambda.readResolve(SerializedLambda.java:278)
	... 33 more
Caused by: java.lang.IllegalArgumentException: too many arguments
	at java.base/java.lang.invoke.LambdaMetafactory.altMetafactory(LambdaMetafactory.java:511)
	at scala.runtime.LambdaDeserializer$.makeCallSite$1(LambdaDeserializer.scala:105)
	at scala.runtime.LambdaDeserializer$.deserializeLambda(LambdaDeserializer.scala:114)
	at scala.runtime.LambdaDeserialize.deserializeLambda(LambdaDeserialize.java:38)
	at C.$deserializeLambda$(lambda-serialization.scala)
	... 38 more
@retronym
Copy link
Member

retronym commented Jun 21, 2021

openjdk/jdk@fc08af5#diff-d19e5ac459022586c38dfa9f2b111ac223484586091eaff12a24fb6d417a9506R510

openjdk/jdk#4346

We need to determine ASAP if this is a JDK bug or if we were relying on unspecified behaviour.

@retronym
Copy link
Member

Found a real, but unrelated bug in LambdaDeserializer. The description of that ticket explains the terrain so could be useful for figuring out this one: #12418

@retronym
Copy link
Member

The bug might not repro on typelevel/scalacheck:main because of a bug introduced to the SerializationTest in April. I'd guess the community build is using an older version (YAY!)

@SethTisue
Copy link
Member Author

I'd guess the community build is using an older version (YAY!)

I don't think so... all the recent runs have used scalacheck commits from June 2021.

@SethTisue
Copy link
Member Author

SethTisue commented Jun 21, 2021

I am now able to reproduce this locally on MacOS, using 17-ea+27-2476. (On Jenkins, we presently have 17-ea+26-2439.)

(Before, it wasn't reproducing either because I was on 17-ea+22-1964 or because I was confused, not entirely sure which.)

@SethTisue SethTisue transferred this issue from scala/community-build Jun 21, 2021
@SethTisue
Copy link
Member Author

I've transferred this to scala-dev now that we know it isn't a community build phantom. Perhaps we'll transfer it again, to scala/bug :-)

@retronym retronym self-assigned this Jun 22, 2021
@retronym
Copy link
Member

Spotted the problem, mea culpa.

@retronym retronym changed the title core repos failing in JDK 17 build, related to lambda deserialization LambdaDeserializer makes incorrect call to JDK's altMetafactory which raises an IllegalArgumentException on JDK 17 Jun 22, 2021
@retronym retronym transferred this issue from scala/scala-dev Jun 22, 2021
@dwijnand dwijnand added this to the 2.12.15 milestone Jun 22, 2021
@lrytz lrytz closed this as completed Jun 22, 2021
@SethTisue
Copy link
Member Author

@retronym which 2.12.x versions are affected?

@retronym
Copy link
Member

@SethTisue I believe this would affect any version of 2.12 or 2.13

@smarter
Copy link
Member

smarter commented Jun 22, 2021

2.13 shouldn't be affected thanks to scala/scala@82fd591 :)

@retronym
Copy link
Member

Indeed! Just noticed that.

@bmarwaha-godaddy
Copy link

what was the fix for it. I started seeing this in intellij out of sudden (with Amazon Corretto 17.0.5) and scala 2.12.8. I did not face this issue a week back.

@Jasper-M
Copy link
Member

The fix is upgrading to the latest 2.12.x release. 2.12.8 is pretty old. Support for JDK 17 wasn't added until 2.12.15.

@bmarwaha-godaddy
Copy link

Thanks. upgrade to 2.12.17 fixed this issue.

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

No branches or pull requests

7 participants