Improve logging in DistributedData extension (#27051)

* and don't load extension from ClusterReceptionist since that will
  trigger the warning logging if role is defined
This commit is contained in:
Patrik Nordwall 2019-06-03 09:31:28 +02:00 committed by GitHub
parent c5e9b5918c
commit 375228273f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 6 deletions

View file

@ -23,6 +23,8 @@ akka.cluster.typed.receptionist {
# Settings for the Distributed Data replicator used by Receptionist. # Settings for the Distributed Data replicator used by Receptionist.
# Same layout as akka.cluster.distributed-data. # Same layout as akka.cluster.distributed-data.
distributed-data = ${akka.cluster.distributed-data} distributed-data = ${akka.cluster.distributed-data}
# make sure that by default it's for all roles (Play loads config in different way)
distributed-data.role = ""
} }
akka { akka {

View file

@ -6,6 +6,7 @@ package akka.cluster.ddata.typed.scaladsl
import akka.actor.typed.{ ActorRef, ActorSystem, Extension, ExtensionId, Props } import akka.actor.typed.{ ActorRef, ActorSystem, Extension, ExtensionId, Props }
import akka.actor.ExtendedActorSystem import akka.actor.ExtendedActorSystem
import akka.cluster.Cluster
import akka.cluster.{ ddata => dd } import akka.cluster.{ ddata => dd }
import akka.cluster.ddata.SelfUniqueAddress import akka.cluster.ddata.SelfUniqueAddress
@ -39,8 +40,15 @@ class DistributedData(system: ActorSystem[_]) extends Extension {
*/ */
val replicator: ActorRef[Replicator.Command] = val replicator: ActorRef[Replicator.Command] =
if (isTerminated) { if (isTerminated) {
system.log.warning( val log = system.log.withLoggerClass(getClass)
"Replicator points to dead letters: Make sure the cluster node is not terminated and has the proper role!") if (Cluster(untypedSystem).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. " +
"Node has roles [], Distributed Data is configured for roles []",
Cluster(untypedSystem).selfRoles.mkString(","),
settings.roles.mkString(","))
system.deadLetters system.deadLetters
} else { } else {
val underlyingReplicator = dd.DistributedData(untypedSystem).replicator val underlyingReplicator = dd.DistributedData(untypedSystem).replicator

View file

@ -12,7 +12,6 @@ import akka.actor.typed.scaladsl.{ ActorContext, Behaviors }
import akka.actor.typed.{ ActorRef, Behavior, Terminated } import akka.actor.typed.{ ActorRef, Behavior, Terminated }
import akka.annotation.InternalApi import akka.annotation.InternalApi
import akka.cluster.ClusterEvent.MemberRemoved import akka.cluster.ClusterEvent.MemberRemoved
import akka.cluster.ddata.typed.scaladsl.DistributedData
import akka.cluster.ddata.{ ORMultiMap, ORMultiMapKey, Replicator } import akka.cluster.ddata.{ ORMultiMap, ORMultiMapKey, Replicator }
import akka.cluster.{ Cluster, ClusterEvent, UniqueAddress } import akka.cluster.{ Cluster, ClusterEvent, UniqueAddress }
import akka.remote.AddressUidExtension import akka.remote.AddressUidExtension
@ -25,6 +24,7 @@ import akka.cluster.ClusterEvent.ClusterShuttingDown
import akka.cluster.ClusterEvent.MemberJoined import akka.cluster.ClusterEvent.MemberJoined
import akka.cluster.ClusterEvent.MemberUp import akka.cluster.ClusterEvent.MemberUp
import akka.cluster.ClusterEvent.MemberWeaklyUp import akka.cluster.ClusterEvent.MemberWeaklyUp
import akka.cluster.ddata.SelfUniqueAddress
// just to provide a log class // just to provide a log class
/** INTERNAL API */ /** INTERNAL API */
@ -75,7 +75,9 @@ private[typed] object ClusterReceptionist extends ReceptionistBehaviorProvider {
case _ => throw new IllegalStateException("Cannot actually happen") case _ => throw new IllegalStateException("Cannot actually happen")
} }
val cluster = Cluster(untypedSystem) val cluster = Cluster(untypedSystem)
implicit val selfNodeAddress = DistributedData(ctx.system).selfUniqueAddress // don't use DistributedData.selfUniqueAddress here, because that will initialize extension, which
// isn't used otherwise by the ClusterReceptionist
implicit val selfNodeAddress = SelfUniqueAddress(cluster.selfUniqueAddress)
val replicator = ctx.actorOf(Replicator.props(settings.replicatorSettings), "replicator") val replicator = ctx.actorOf(Replicator.props(settings.replicatorSettings), "replicator")

View file

@ -11,6 +11,7 @@ import akka.actor.Extension
import akka.actor.ExtensionId import akka.actor.ExtensionId
import akka.actor.ExtensionIdProvider import akka.actor.ExtensionIdProvider
import akka.cluster.{ Cluster, UniqueAddress } import akka.cluster.{ Cluster, UniqueAddress }
import akka.event.Logging
object DistributedData extends ExtensionId[DistributedData] with ExtensionIdProvider { object DistributedData extends ExtensionId[DistributedData] with ExtensionIdProvider {
override def get(system: ActorSystem): DistributedData = super.get(system) override def get(system: ActorSystem): DistributedData = super.get(system)
@ -37,8 +38,15 @@ class DistributedData(system: ExtendedActorSystem) extends Extension {
*/ */
val replicator: ActorRef = val replicator: ActorRef =
if (isTerminated) { if (isTerminated) {
system.log.warning( val log = Logging(system, getClass)
"Replicator points to dead letters: Make sure the cluster node is not terminated and has the proper role!") 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. " +
"Node has roles [], Distributed Data is configured for roles []",
Cluster(system).selfRoles.mkString(","),
settings.roles.mkString(","))
system.deadLetters system.deadLetters
} else { } else {
system.systemActorOf(Replicator.props(settings), ReplicatorSettings.name(system, None)) system.systemActorOf(Replicator.props(settings), ReplicatorSettings.name(system, None))