From fbd96162a0007fd5954bc870ad9d8aace8d3f47c Mon Sep 17 00:00:00 2001 From: Roland Date: Thu, 22 Nov 2012 14:40:54 +0100 Subject: [PATCH 1/2] add ActorRefProvider.getDefaultAddress, see #2732 - use it in ConsistentHashingRouter instead of relying on provider.rootPath.address - remove transport.address from RemoteActorRefProvider.rootPath --- .../src/main/scala/akka/actor/ActorRefProvider.scala | 7 +++++++ .../scala/akka/routing/ConsistentHashingRouter.scala | 2 +- .../scala/akka/remote/RemoteActorRefProvider.scala | 12 +++++------- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala index b0b4c3d939..fcb0a6ddc9 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala @@ -146,6 +146,11 @@ trait ActorRefProvider { * attempt is made to verify actual reachability). */ def getExternalAddressFor(addr: Address): Option[Address] + + /** + * Obtain the external address of the default transport. + */ + def getDefaultAddress: Address } /** @@ -597,4 +602,6 @@ class LocalActorRefProvider( } def getExternalAddressFor(addr: Address): Option[Address] = if (addr == rootPath.address) Some(addr) else None + + def getDefaultAddress: Address = rootPath.address } diff --git a/akka-actor/src/main/scala/akka/routing/ConsistentHashingRouter.scala b/akka-actor/src/main/scala/akka/routing/ConsistentHashingRouter.scala index 0214c6736e..e88195f577 100644 --- a/akka-actor/src/main/scala/akka/routing/ConsistentHashingRouter.scala +++ b/akka-actor/src/main/scala/akka/routing/ConsistentHashingRouter.scala @@ -237,7 +237,7 @@ trait ConsistentHashingLike { this: RouterConfig ⇒ } val log = Logging(routeeProvider.context.system, routeeProvider.context.self) - val selfAddress = routeeProvider.context.system.asInstanceOf[ExtendedActorSystem].provider.rootPath.address + val selfAddress = routeeProvider.context.system.asInstanceOf[ExtendedActorSystem].provider.getDefaultAddress val vnodes = if (virtualNodesFactor == 0) routeeProvider.context.system.settings.DefaultVirtualNodesFactor else virtualNodesFactor diff --git a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala index 48fca0af08..d7800e8d96 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala @@ -32,9 +32,7 @@ class RemoteActorRefProvider( private var _log = local.log def log: LoggingAdapter = _log - @volatile - private var _rootPath = local.rootPath - override def rootPath: ActorPath = _rootPath + override def rootPath: ActorPath = local.rootPath override def deadLetters: InternalActorRef = local.deadLetters // these are only available after init() @@ -63,7 +61,7 @@ class RemoteActorRefProvider( def init(system: ActorSystemImpl): Unit = { local.init(system) - _remoteDaemon = new RemoteSystemDaemon(system, local.rootPath / "remote", rootGuardian, log, untrustedMode = remoteSettings.UntrustedMode) + _remoteDaemon = new RemoteSystemDaemon(system, rootPath / "remote", rootGuardian, log, untrustedMode = remoteSettings.UntrustedMode) local.registerExtraNames(Map(("remote", remoteDaemon))) _serialization = SerializationExtension(system) @@ -84,8 +82,6 @@ class RemoteActorRefProvider( // this enables reception of remote requests _transport.start() - _rootPath = RootActorPath(local.rootPath.address.copy(host = transport.address.host, port = transport.address.port)) - val remoteClientLifeCycleHandler = system.systemActorOf(Props(new Actor { def receive = { case RemoteClientError(cause, remote, address) ⇒ remote.shutdownClientConnection(address) @@ -201,8 +197,10 @@ class RemoteActorRefProvider( } } + def getDefaultAddress: Address = transport.address + private def isSelfAddress(address: Address): Boolean = - address == local.rootPath.address || address == rootPath.address || address == transport.address + address == rootPath.address || address == transport.address } From 5e2127a6c7a70ef942d60a93763a80ef14c3a3a3 Mon Sep 17 00:00:00 2001 From: Roland Date: Thu, 22 Nov 2012 15:14:24 +0100 Subject: [PATCH 2/2] clarify internal nature of ActorRefProvider impls --- .../src/main/scala/akka/actor/ActorRefProvider.scala | 7 +++++-- .../main/scala/akka/remote/RemoteActorRefProvider.scala | 4 ++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala index fcb0a6ddc9..df1599da30 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala @@ -42,8 +42,7 @@ trait ActorRefProvider { def deadLetters: ActorRef /** - * The root path for all actors within this actor system, including remote - * address if enabled. + * The root path for all actors within this actor system, not including any remote address information. */ def rootPath: ActorPath @@ -322,6 +321,10 @@ private[akka] object SystemGuardian { /** * Local ActorRef provider. + * + * INTERNAL API! + * + * Depending on this class is not supported, only the [[ActorRefProvider]] interface is supported. */ class LocalActorRefProvider( _systemName: String, diff --git a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala index d7800e8d96..f65e8b6ad2 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala @@ -14,6 +14,10 @@ import scala.util.control.NonFatal /** * Remote ActorRefProvider. Starts up actor on remote node and creates a RemoteActorRef representing it. + * + * INTERNAL API! + * + * Depending on this class is not supported, only the [[ActorRefProvider]] interface is supported. */ class RemoteActorRefProvider( val systemName: String,