|
17 | 17 |
|
18 | 18 | package org.apache.spark.serializer
|
19 | 19 |
|
| 20 | +import java.io.ByteArrayOutputStream |
| 21 | + |
20 | 22 | import scala.collection.mutable
|
21 | 23 | import scala.reflect.ClassTag
|
22 | 24 |
|
@@ -319,6 +321,37 @@ class KryoSerializerSuite extends FunSuite with SharedSparkContext {
|
319 | 321 | val ser2 = new KryoSerializer(conf).newInstance().asInstanceOf[KryoSerializerInstance]
|
320 | 322 | assert(!ser2.getAutoReset)
|
321 | 323 | }
|
| 324 | + |
| 325 | + private def testSerializerInstanceReuse(autoReset: Boolean, referenceTracking: Boolean): Unit = { |
| 326 | + val conf = new SparkConf(loadDefaults = false) |
| 327 | + .set("spark.kryo.referenceTracking", referenceTracking.toString) |
| 328 | + if (!autoReset) { |
| 329 | + conf.set("spark.kryo.registrator", classOf[RegistratorWithoutAutoReset].getName) |
| 330 | + } |
| 331 | + val ser = new KryoSerializer(conf) |
| 332 | + val serInstance = ser.newInstance().asInstanceOf[KryoSerializerInstance] |
| 333 | + assert (serInstance.getAutoReset() === autoReset) |
| 334 | + val obj = ("Hello", "World") |
| 335 | + def serializeObjects(): Array[Byte] = { |
| 336 | + val baos = new ByteArrayOutputStream() |
| 337 | + val serStream = serInstance.serializeStream(baos) |
| 338 | + serStream.writeObject(obj) |
| 339 | + serStream.writeObject(obj) |
| 340 | + serStream.close() |
| 341 | + baos.toByteArray |
| 342 | + } |
| 343 | + val output1: Array[Byte] = serializeObjects() |
| 344 | + val output2: Array[Byte] = serializeObjects() |
| 345 | + assert (output1 === output2) |
| 346 | + } |
| 347 | + |
| 348 | + // Regression test for SPARK-7766, an issue where disabling auto-reset and enabling |
| 349 | + // reference-tracking would lead to corrupted output when serializer instances are re-used |
| 350 | + for (referenceTracking <- Set(true, false); autoReset <- Set(true, false)) { |
| 351 | + test(s"instance reuse with autoReset = $autoReset, referenceTracking = $referenceTracking") { |
| 352 | + testSerializerInstanceReuse(autoReset = autoReset, referenceTracking = referenceTracking) |
| 353 | + } |
| 354 | + } |
322 | 355 | }
|
323 | 356 |
|
324 | 357 |
|
|
0 commit comments