aboutsummaryrefslogtreecommitdiff
path: root/core/src/test
diff options
context:
space:
mode:
authorFei Wang <wangfei1@huawei.com>2015-12-08 21:32:31 -0800
committerDavies Liu <davies.liu@gmail.com>2015-12-08 21:32:31 -0800
commit3934562d34bbe08d91c54b4bbee27870e93d7571 (patch)
tree44bbd6f2148f7127aecbec993493577384c36b92 /core/src/test
parenta0046e379bee0852c39ece4ea719cde70d350b0e (diff)
downloadspark-3934562d34bbe08d91c54b4bbee27870e93d7571.tar.gz
spark-3934562d34bbe08d91c54b4bbee27870e93d7571.tar.bz2
spark-3934562d34bbe08d91c54b4bbee27870e93d7571.zip
[SPARK-12222] [CORE] Deserialize RoaringBitmap using Kryo serializer throw Buffer underflow exception
Jira: https://issues.apache.org/jira/browse/SPARK-12222 Deserialize RoaringBitmap using Kryo serializer throw Buffer underflow exception: ``` com.esotericsoftware.kryo.KryoException: Buffer underflow. at com.esotericsoftware.kryo.io.Input.require(Input.java:156) at com.esotericsoftware.kryo.io.Input.skip(Input.java:131) at com.esotericsoftware.kryo.io.Input.skip(Input.java:264) ``` This is caused by a bug of kryo's `Input.skip(long count)`(https://github.com/EsotericSoftware/kryo/issues/119) and we call this method in `KryoInputDataInputBridge`. Instead of upgrade kryo's version, this pr bypass the kryo's `Input.skip(long count)` by directly call another `skip` method in kryo's Input.java(https://github.com/EsotericSoftware/kryo/blob/kryo-2.21/src/com/esotericsoftware/kryo/io/Input.java#L124), i.e. write the bug-fixed version of `Input.skip(long count)` in KryoInputDataInputBridge's `skipBytes` method. more detail link to https://github.com/apache/spark/pull/9748#issuecomment-162860246 Author: Fei Wang <wangfei1@huawei.com> Closes #10213 from scwf/patch-1.
Diffstat (limited to 'core/src/test')
-rw-r--r--core/src/test/scala/org/apache/spark/serializer/KryoSerializerSuite.scala28
1 files changed, 27 insertions, 1 deletions
diff --git a/core/src/test/scala/org/apache/spark/serializer/KryoSerializerSuite.scala b/core/src/test/scala/org/apache/spark/serializer/KryoSerializerSuite.scala
index f81fe31131..9fcc22b608 100644
--- a/core/src/test/scala/org/apache/spark/serializer/KryoSerializerSuite.scala
+++ b/core/src/test/scala/org/apache/spark/serializer/KryoSerializerSuite.scala
@@ -17,17 +17,21 @@
package org.apache.spark.serializer
-import java.io.{ByteArrayInputStream, ByteArrayOutputStream}
+import java.io.{ByteArrayInputStream, ByteArrayOutputStream, FileOutputStream, FileInputStream}
import scala.collection.JavaConverters._
import scala.collection.mutable
import scala.reflect.ClassTag
import com.esotericsoftware.kryo.Kryo
+import com.esotericsoftware.kryo.io.{Input => KryoInput, Output => KryoOutput}
+
+import org.roaringbitmap.RoaringBitmap
import org.apache.spark.{SharedSparkContext, SparkConf, SparkFunSuite}
import org.apache.spark.scheduler.HighlyCompressedMapStatus
import org.apache.spark.serializer.KryoTest._
+import org.apache.spark.util.Utils
import org.apache.spark.storage.BlockManagerId
class KryoSerializerSuite extends SparkFunSuite with SharedSparkContext {
@@ -350,6 +354,28 @@ class KryoSerializerSuite extends SparkFunSuite with SharedSparkContext {
assert(thrown.getMessage.contains(kryoBufferMaxProperty))
}
+ test("SPARK-12222: deserialize RoaringBitmap throw Buffer underflow exception") {
+ val dir = Utils.createTempDir()
+ val tmpfile = dir.toString + "/RoaringBitmap"
+ val outStream = new FileOutputStream(tmpfile)
+ val output = new KryoOutput(outStream)
+ val bitmap = new RoaringBitmap
+ bitmap.add(1)
+ bitmap.add(3)
+ bitmap.add(5)
+ bitmap.serialize(new KryoOutputDataOutputBridge(output))
+ output.flush()
+ output.close()
+
+ val inStream = new FileInputStream(tmpfile)
+ val input = new KryoInput(inStream)
+ val ret = new RoaringBitmap
+ ret.deserialize(new KryoInputDataInputBridge(input))
+ input.close()
+ assert(ret == bitmap)
+ Utils.deleteRecursively(dir)
+ }
+
test("getAutoReset") {
val ser = new KryoSerializer(new SparkConf).newInstance().asInstanceOf[KryoSerializerInstance]
assert(ser.getAutoReset)