-
Notifications
You must be signed in to change notification settings - Fork 3.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
=clt #18232 Serializer for ClusterSingleton
- Loading branch information
Showing
4 changed files
with
118 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
63 changes: 63 additions & 0 deletions
63
...ls/src/main/scala/akka/cluster/singleton/protobuf/ClusterSingletonMessageSerializer.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
/** | ||
* Copyright (C) 2015 Typesafe Inc. <http://www.typesafe.com> | ||
*/ | ||
package akka.cluster.singleton.protobuf | ||
|
||
import akka.actor.ExtendedActorSystem | ||
import akka.cluster.singleton.ClusterSingletonManager.Internal.HandOverDone | ||
import akka.cluster.singleton.ClusterSingletonManager.Internal.HandOverInProgress | ||
import akka.cluster.singleton.ClusterSingletonManager.Internal.HandOverToMe | ||
import akka.cluster.singleton.ClusterSingletonManager.Internal.TakeOverFromMe | ||
import akka.serialization.BaseSerializer | ||
import akka.serialization.SerializationExtension | ||
import akka.serialization.SerializerWithStringManifest | ||
|
||
/** | ||
* INTERNAL API: Serializer of ClusterSingleton messages. | ||
* It is actually not using protobuf, but if we add more messages to | ||
* the ClusterSingleton we want to make protobuf representations of them. | ||
*/ | ||
private[akka] class ClusterSingletonMessageSerializer(val system: ExtendedActorSystem) | ||
extends SerializerWithStringManifest with BaseSerializer { | ||
|
||
private lazy val serialization = SerializationExtension(system) | ||
|
||
private val HandOverToMeManifest = "A" | ||
private val HandOverInProgressManifest = "B" | ||
private val HandOverDoneManifest = "C" | ||
private val TakeOverFromMeManifest = "D" | ||
|
||
private val emptyByteArray = Array.empty[Byte] | ||
|
||
private val fromBinaryMap = collection.immutable.HashMap[String, Array[Byte] ⇒ AnyRef]( | ||
HandOverToMeManifest -> { _ ⇒ HandOverToMe }, | ||
HandOverInProgressManifest -> { _ ⇒ HandOverInProgress }, | ||
HandOverDoneManifest -> { _ ⇒ HandOverDone }, | ||
TakeOverFromMeManifest -> { _ ⇒ TakeOverFromMe }) | ||
|
||
override def manifest(obj: AnyRef): String = obj match { | ||
case HandOverToMe ⇒ HandOverToMeManifest | ||
case HandOverInProgress ⇒ HandOverInProgressManifest | ||
case HandOverDone ⇒ HandOverDoneManifest | ||
case TakeOverFromMe ⇒ TakeOverFromMeManifest | ||
case _ ⇒ | ||
throw new IllegalArgumentException(s"Can't serialize object of type ${obj.getClass} in [${getClass.getName}]") | ||
} | ||
|
||
override def toBinary(obj: AnyRef): Array[Byte] = obj match { | ||
case HandOverToMe ⇒ emptyByteArray | ||
case HandOverInProgress ⇒ emptyByteArray | ||
case HandOverDone ⇒ emptyByteArray | ||
case TakeOverFromMe ⇒ emptyByteArray | ||
case _ ⇒ | ||
throw new IllegalArgumentException(s"Can't serialize object of type ${obj.getClass} in [${getClass.getName}]") | ||
} | ||
|
||
override def fromBinary(bytes: Array[Byte], manifest: String): AnyRef = | ||
fromBinaryMap.get(manifest) match { | ||
case Some(f) ⇒ f(bytes) | ||
case None ⇒ throw new IllegalArgumentException( | ||
s"Unimplemented deserialization of message with manifest [$manifest] in [${getClass.getName}]") | ||
} | ||
|
||
} |
32 changes: 32 additions & 0 deletions
32
...rc/test/scala/akka/cluster/singleton/protobuf/ClusterSingletonMessageSerializerSpec.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
/** | ||
* Copyright (C) 2015 Typesafe Inc. <http://www.typesafe.com> | ||
*/ | ||
package akka.cluster.singleton.protobuf | ||
|
||
import akka.actor.ExtendedActorSystem | ||
import akka.testkit.AkkaSpec | ||
import akka.cluster.singleton.ClusterSingletonManager.Internal.HandOverDone | ||
import akka.cluster.singleton.ClusterSingletonManager.Internal.HandOverInProgress | ||
import akka.cluster.singleton.ClusterSingletonManager.Internal.HandOverToMe | ||
import akka.cluster.singleton.ClusterSingletonManager.Internal.TakeOverFromMe | ||
|
||
class ClusterSingletonMessageSerializerSpec extends AkkaSpec { | ||
|
||
val serializer = new ClusterSingletonMessageSerializer(system.asInstanceOf[ExtendedActorSystem]) | ||
|
||
def checkSerialization(obj: AnyRef): Unit = { | ||
val blob = serializer.toBinary(obj) | ||
val ref = serializer.fromBinary(blob, serializer.manifest(obj)) | ||
ref should ===(obj) | ||
} | ||
|
||
"ClusterSingletonMessages" must { | ||
|
||
"be serializable" in { | ||
checkSerialization(HandOverDone) | ||
checkSerialization(HandOverInProgress) | ||
checkSerialization(HandOverToMe) | ||
checkSerialization(TakeOverFromMe) | ||
} | ||
} | ||
} |