Suppress Java Serializer warnings when extending NoSerializationVerificationNeeded (#19963) (#20785)

This commit is contained in:
Richard Imaoka 2016-07-06 18:48:15 +09:00 committed by Konrad Malawski
parent 625413e413
commit 08aa41c818
4 changed files with 82 additions and 5 deletions

View file

@ -0,0 +1,14 @@
/**
* Copyright (C) 2009-2016 Lightbend Inc. <http://www.lightbend.com>
*/
package test.akka.serialization
import akka.actor.NoSerializationVerificationNeeded
/**
* This is currently used in NoSerializationVerificationNeeded test cases in SerializeSpec,
* as they needed a serializable class whose top package is not akka.
*/
class NoVerification extends NoSerializationVerificationNeeded with java.io.Serializable {
}

View file

@ -17,6 +17,8 @@ import scala.beans.BeanInfo
import com.typesafe.config._ import com.typesafe.config._
import akka.pattern.ask import akka.pattern.ask
import org.apache.commons.codec.binary.Hex.encodeHex import org.apache.commons.codec.binary.Hex.encodeHex
import akka.actor.NoSerializationVerificationNeeded
import test.akka.serialization.NoVerification
object SerializationTests { object SerializationTests {
@ -424,18 +426,18 @@ class DefaultSerializationWarningSpec extends AkkaSpec(
ConfigFactory.parseString("akka.actor.warn-about-java-serializer-usage = on")) { ConfigFactory.parseString("akka.actor.warn-about-java-serializer-usage = on")) {
val ser = SerializationExtension(system) val ser = SerializationExtension(system)
val messagePrefix = "Using the default Java serializer for class.*" val messagePrefix = "Using the default Java serializer for class"
"Using the default Java serializer" must { "Using the default Java serializer" must {
"log a warning when serializing classes outside of java.lang package" in { "log a warning when serializing classes outside of java.lang package" in {
EventFilter.warning(message = messagePrefix) intercept { EventFilter.warning(start = messagePrefix, occurrences = 1) intercept {
ser.serializerFor(classOf[java.math.BigDecimal]) ser.serializerFor(classOf[java.math.BigDecimal])
} }
} }
"not log warning when serializing classes from java.lang package" in { "not log warning when serializing classes from java.lang package" in {
EventFilter.warning(message = messagePrefix, occurrences = 0) intercept { EventFilter.warning(start = messagePrefix, occurrences = 0) intercept {
ser.serializerFor(classOf[java.lang.String]) ser.serializerFor(classOf[java.lang.String])
} }
} }
@ -444,6 +446,54 @@ class DefaultSerializationWarningSpec extends AkkaSpec(
} }
class NoVerificationWarningSpec extends AkkaSpec(
ConfigFactory.parseString(
"akka.actor.warn-about-java-serializer-usage = on\n" +
"akka.actor.warn-on-no-serialization-verification = on")) {
val ser = SerializationExtension(system)
val messagePrefix = "Using the default Java serializer for class"
"When warn-on-no-serialization-verification = on, using the default Java serializer" must {
"log a warning on classes without extending NoSerializationVerificationNeeded" in {
EventFilter.warning(start = messagePrefix, occurrences = 1) intercept {
ser.serializerFor(classOf[java.math.BigDecimal])
}
}
"still log warning on classes extending NoSerializationVerificationNeeded" in {
EventFilter.warning(start = messagePrefix, occurrences = 1) intercept {
ser.serializerFor(classOf[NoVerification])
}
}
}
}
class NoVerificationWarningOffSpec extends AkkaSpec(
ConfigFactory.parseString(
"akka.actor.warn-about-java-serializer-usage = on\n" +
"akka.actor.warn-on-no-serialization-verification = off")) {
val ser = SerializationExtension(system)
val messagePrefix = "Using the default Java serializer for class"
"When warn-on-no-serialization-verification = off, using the default Java serializer" must {
"log a warning on classes without extending NoSerializationVerificationNeeded" in {
EventFilter.warning(start = messagePrefix, occurrences = 1) intercept {
ser.serializerFor(classOf[java.math.BigDecimal])
}
}
"not log warning on classes extending NoSerializationVerificationNeeded" in {
EventFilter.warning(start = messagePrefix, occurrences = 0) intercept {
ser.serializerFor(classOf[NoVerification])
}
}
}
}
protected[akka] trait TestSerializable protected[akka] trait TestSerializable
protected[akka] class TestSerializer extends Serializer { protected[akka] class TestSerializer extends Serializer {

View file

@ -590,6 +590,12 @@ akka {
# you can turn this off. # you can turn this off.
warn-about-java-serializer-usage = on warn-about-java-serializer-usage = on
# To be used with the above warn-about-java-serializer-usage
# When warn-about-java-serializer-usage = on, and this warn-on-no-serialization-verification = off,
# warnings are suppressed for classes extending NoSerializationVerificationNeeded
# to reduce noize.
warn-on-no-serialization-verification = on
# Configuration namespace of serialization identifiers. # Configuration namespace of serialization identifiers.
# Each serializer implementation must have an entry in the following format: # Each serializer implementation must have an entry in the following format:
# `akka.actor.serialization-identifiers."FQCN" = ID` # `akka.actor.serialization-identifiers."FQCN" = ID`

View file

@ -247,13 +247,20 @@ class Serialization(val system: ExtendedActorSystem) extends Extension {
Map(NullSerializer.identifier NullSerializer) ++ serializers map { case (_, v) (v.identifier, v) } Map(NullSerializer.identifier NullSerializer) ++ serializers map { case (_, v) (v.identifier, v) }
private val isJavaSerializationWarningEnabled = settings.config.getBoolean("akka.actor.warn-about-java-serializer-usage") private val isJavaSerializationWarningEnabled = settings.config.getBoolean("akka.actor.warn-about-java-serializer-usage")
private val isWarningOnNoVerificationEnabled = settings.config.getBoolean("akka.actor.warn-on-no-serialization-verification")
private def shouldWarnAboutJavaSerializer(serializedClass: Class[_], serializer: Serializer) = { private def shouldWarnAboutJavaSerializer(serializedClass: Class[_], serializer: Serializer) = {
def suppressWarningOnNonSerializationVerification(serializedClass: Class[_]) = {
//suppressed, only when warn-on-no-serialization-verification = off, and extending NoSerializationVerificationNeeded
!isWarningOnNoVerificationEnabled && classOf[NoSerializationVerificationNeeded].isAssignableFrom(serializedClass)
}
isJavaSerializationWarningEnabled && isJavaSerializationWarningEnabled &&
serializer.isInstanceOf[JavaSerializer] && serializer.isInstanceOf[JavaSerializer] &&
!serializedClass.getName.startsWith("akka.") && !serializedClass.getName.startsWith("akka.") &&
!serializedClass.getName.startsWith("java.lang.") !serializedClass.getName.startsWith("java.lang.") &&
} !suppressWarningOnNonSerializationVerification(serializedClass)
}
} }