2018-10-29 17:19:37 +08:00
|
|
|
/*
|
2020-01-02 07:24:59 -05:00
|
|
|
* Copyright (C) 2009-2020 Lightbend Inc. <https://www.lightbend.com>
|
2015-05-17 12:28:47 +02:00
|
|
|
*/
|
2018-03-13 23:45:55 +09:00
|
|
|
|
2015-05-17 12:28:47 +02:00
|
|
|
package akka.cluster.ddata
|
|
|
|
|
|
|
|
|
|
import akka.actor.ActorRef
|
|
|
|
|
import akka.actor.ActorSystem
|
2019-12-05 16:01:23 +01:00
|
|
|
import akka.actor.ClassicActorSystemProvider
|
2015-05-17 12:28:47 +02:00
|
|
|
import akka.actor.ExtendedActorSystem
|
|
|
|
|
import akka.actor.Extension
|
|
|
|
|
import akka.actor.ExtensionId
|
|
|
|
|
import akka.actor.ExtensionIdProvider
|
2018-12-14 15:53:08 -05:00
|
|
|
import akka.cluster.{ Cluster, UniqueAddress }
|
2019-06-03 09:31:28 +02:00
|
|
|
import akka.event.Logging
|
2015-05-17 12:28:47 +02:00
|
|
|
|
|
|
|
|
object DistributedData extends ExtensionId[DistributedData] with ExtensionIdProvider {
|
|
|
|
|
override def get(system: ActorSystem): DistributedData = super.get(system)
|
2019-12-05 16:01:23 +01:00
|
|
|
override def get(system: ClassicActorSystemProvider): DistributedData = super.get(system)
|
2015-05-17 12:28:47 +02:00
|
|
|
|
|
|
|
|
override def lookup = DistributedData
|
|
|
|
|
|
|
|
|
|
override def createExtension(system: ExtendedActorSystem): DistributedData =
|
|
|
|
|
new DistributedData(system)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Akka extension for convenient configuration and use of the
|
|
|
|
|
* [[Replicator]]. Configuration settings are defined in the
|
|
|
|
|
* `akka.cluster.ddata` section, see `reference.conf`.
|
|
|
|
|
*/
|
|
|
|
|
class DistributedData(system: ExtendedActorSystem) extends Extension {
|
|
|
|
|
|
2018-12-14 15:53:08 -05:00
|
|
|
private val settings = ReplicatorSettings(system)
|
2015-05-17 12:28:47 +02:00
|
|
|
|
2018-12-14 15:53:08 -05:00
|
|
|
implicit val selfUniqueAddress: SelfUniqueAddress = SelfUniqueAddress(Cluster(system).selfUniqueAddress)
|
2015-05-17 12:28:47 +02:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* `ActorRef` of the [[Replicator]] .
|
|
|
|
|
*/
|
|
|
|
|
val replicator: ActorRef =
|
|
|
|
|
if (isTerminated) {
|
2019-06-03 09:31:28 +02:00
|
|
|
val log = Logging(system, getClass)
|
|
|
|
|
if (Cluster(system).isTerminated)
|
|
|
|
|
log.warning("Replicator points to dead letters, because Cluster is terminated.")
|
|
|
|
|
else
|
|
|
|
|
log.warning(
|
|
|
|
|
"Replicator points to dead letters. Make sure the cluster node has the proper role. " +
|
2019-08-24 08:46:39 +02:00
|
|
|
"Node has roles [{}], Distributed Data is configured for roles [{}].",
|
2019-06-03 09:31:28 +02:00
|
|
|
Cluster(system).selfRoles.mkString(","),
|
2019-08-24 08:46:39 +02:00
|
|
|
settings.roles.mkString(","): Any)
|
2015-05-17 12:28:47 +02:00
|
|
|
system.deadLetters
|
|
|
|
|
} else {
|
2018-12-14 15:53:08 -05:00
|
|
|
system.systemActorOf(Replicator.props(settings), ReplicatorSettings.name(system, None))
|
2015-05-17 12:28:47 +02:00
|
|
|
}
|
2018-12-14 15:53:08 -05:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Returns true if this member is not tagged with the role configured for the
|
|
|
|
|
* replicas.
|
|
|
|
|
*/
|
|
|
|
|
def isTerminated: Boolean =
|
|
|
|
|
Cluster(system).isTerminated || !settings.roles.subsetOf(Cluster(system).selfRoles)
|
|
|
|
|
|
2015-05-17 12:28:47 +02:00
|
|
|
}
|
2018-12-14 15:53:08 -05:00
|
|
|
|
|
|
|
|
/**
|
2019-09-04 07:10:57 -07:00
|
|
|
* Cluster non-specific (typed vs classic) wrapper for [[akka.cluster.UniqueAddress]].
|
2018-12-14 15:53:08 -05:00
|
|
|
*/
|
|
|
|
|
@SerialVersionUID(1L)
|
|
|
|
|
final case class SelfUniqueAddress(uniqueAddress: UniqueAddress)
|