From 682ad9e6098616057efdd40ed16aeef92ab4c895 Mon Sep 17 00:00:00 2001 From: liaojiayi Date: Mon, 27 Apr 2020 13:17:46 +0800 Subject: [PATCH] reproduce exception with PriorityQueue with lambda expression --- build.sbt | 4 +- .../twitter/chill/java/TestPriorityQueue.java | 55 +++++++++++++++++++ .../chill/java/PriorityQueueTest.scala | 24 ++++++-- 3 files changed, 76 insertions(+), 7 deletions(-) create mode 100644 chill-java/src/test/java/com/twitter/chill/java/TestPriorityQueue.java diff --git a/build.sbt b/build.sbt index 603684d2..10803e8e 100644 --- a/build.sbt +++ b/build.sbt @@ -31,8 +31,8 @@ val sharedSettings = mimaDefaultSettings ++ Seq( scalariformPreferences := formattingPreferences, scalariformAutoformat := false, // Twitter Hadoop needs this, sorry 1.7 fans - javacOptions ++= Seq("-target", "1.6", "-source", "1.6", "-Xlint:-options"), - javacOptions in doc := Seq("-source", "1.6"), + javacOptions ++= Seq("-target", "1.8", "-source", "1.8", "-Xlint:-options"), + javacOptions in doc := Seq("-source", "1.8"), resolvers ++= Seq( Opts.resolver.sonatypeSnapshots, Opts.resolver.sonatypeReleases diff --git a/chill-java/src/test/java/com/twitter/chill/java/TestPriorityQueue.java b/chill-java/src/test/java/com/twitter/chill/java/TestPriorityQueue.java new file mode 100644 index 00000000..db53625d --- /dev/null +++ b/chill-java/src/test/java/com/twitter/chill/java/TestPriorityQueue.java @@ -0,0 +1,55 @@ +package com.twitter.chill.java; + +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; + +import java.util.Comparator; +import java.util.PriorityQueue; + +public class TestPriorityQueue { + + private static final Kryo kryo = new Kryo(); + + private static final PriorityQueue test_priority_queue1 = + new PriorityQueue<>((o1, o2) -> o1.length() - o2.length() - 1); + + private static final PriorityQueue test_priority_queue2 = + new PriorityQueue<>(new Comparator() { + @Override + public int compare(String o1, String o2) { + return o1.length() - o2.length() - 1; + } + }); + + static { + test_priority_queue1.add("12345"); + test_priority_queue1.add("123"); + test_priority_queue1.add("12456789"); + + test_priority_queue2.add("12345"); + test_priority_queue2.add("123"); + test_priority_queue2.add("12456789"); + } + + public static PriorityQueue serializeAndDeserializeQueue1() { + Output output = new Output(1000, -1); + kryo.writeClassAndObject(output, test_priority_queue1); + Input input = new Input(output.toBytes()); + return (PriorityQueue) kryo.readClassAndObject(input); + } + + public static PriorityQueue serializeAndDeserializeQueue1(Kryo kryo) { + Output output = new Output(1000, -1); + kryo.writeClassAndObject(output, test_priority_queue1); + Input input = new Input(output.toBytes()); + return (PriorityQueue) kryo.readClassAndObject(input); + } + + public static PriorityQueue serializeAndDeserializeQueue2(Kryo kryo) { + Output output = new Output(1000, -1); + kryo.writeClassAndObject(output, test_priority_queue2); + Input input = new Input(output.toBytes()); + return (PriorityQueue) kryo.readClassAndObject(input); + } +} diff --git a/chill-java/src/test/scala/com/twitter/chill/java/PriorityQueueTest.scala b/chill-java/src/test/scala/com/twitter/chill/java/PriorityQueueTest.scala index 3eb6ecb1..68f01626 100644 --- a/chill-java/src/test/scala/com/twitter/chill/java/PriorityQueueTest.scala +++ b/chill-java/src/test/scala/com/twitter/chill/java/PriorityQueueTest.scala @@ -16,12 +16,8 @@ limitations under the License. package com.twitter.chill.java -import org.scalatest._ - import com.esotericsoftware.kryo.Kryo -import com.esotericsoftware.kryo.io.Input -import com.esotericsoftware.kryo.io.Output - +import com.esotericsoftware.kryo.io.{Input, Output} import org.objenesis.strategy.StdInstantiatorStrategy import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec @@ -34,6 +30,24 @@ class PriorityQueueSpec extends AnyWordSpec with Matchers { k.readClassAndObject(in).asInstanceOf[A] } + "A PriorityQueue Serializer" should { + "serialize PriorityQueue with lambda expression" in { + + val kryo = new Kryo() + kryo.setInstantiatorStrategy(new StdInstantiatorStrategy) + PriorityQueueSerializer.registrar()(kryo) + + // this works well without registered PriorityQueueSerializer + TestPriorityQueue.serializeAndDeserializeQueue1() + + // this works well with registered PriorityQueueSerializer and PriorityQueue instance (with non-lambda expression) + TestPriorityQueue.serializeAndDeserializeQueue2(kryo) + + // this should work well but failed with PriorityQueueSerializer registered in kryo and PriorityQueue instance (with lambda expression) + TestPriorityQueue.serializeAndDeserializeQueue1(kryo) + } + } + "A PriorityQueue Serializer" should { "handle PriorityQueue" in { import scala.collection.JavaConverters._