From f89dd499546751b7c58dd40939e0d6e3a7fac644 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Thu, 31 Jan 2013 09:24:12 +0100 Subject: [PATCH] Share same instance of deadLetters between LARP and RARP, see #2983 --- .../src/main/scala/akka/actor/ActorRefProvider.scala | 12 ++++++++---- .../scala/akka/remote/RemoteActorRefProvider.scala | 6 ++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala index a593c6dde8..3271537e82 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala @@ -326,13 +326,15 @@ private[akka] object SystemGuardian { * * Depending on this class is not supported, only the [[ActorRefProvider]] interface is supported. */ -class LocalActorRefProvider( +class LocalActorRefProvider private[akka] ( _systemName: String, override val settings: ActorSystem.Settings, val eventStream: EventStream, override val scheduler: Scheduler, val dynamicAccess: DynamicAccess, - override val deployer: Deployer) extends ActorRefProvider { + override val deployer: Deployer, + _deadLetters: Option[ActorPath ⇒ InternalActorRef]) + extends ActorRefProvider { // this is the constructor needed for reflectively instantiating the provider def this(_systemName: String, @@ -345,13 +347,15 @@ class LocalActorRefProvider( eventStream, scheduler, dynamicAccess, - new Deployer(settings, dynamicAccess)) + new Deployer(settings, dynamicAccess), + None) override val rootPath: ActorPath = RootActorPath(Address("akka", _systemName)) private[akka] val log: LoggingAdapter = Logging(eventStream, "LocalActorRefProvider(" + rootPath.address + ")") - override val deadLetters: InternalActorRef = new DeadLetterActorRef(this, rootPath / "deadLetters", eventStream) + override val deadLetters: InternalActorRef = + _deadLetters.getOrElse((p: ActorPath) ⇒ new DeadLetterActorRef(this, p, eventStream)).apply(rootPath / "deadLetters") /* * generate name for temporary actor refs diff --git a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala index a64b9b3a71..d8fcab4fcd 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala @@ -77,6 +77,7 @@ object RemoteActorRefProvider { } override def specialHandle(msg: Any): Boolean = msg match { + // unwrap again in case the original message was DeadLetter(EndpointManager.Send(m)) case EndpointManager.Send(m, _, _) ⇒ super.specialHandle(m) case _ ⇒ super.specialHandle(msg) } @@ -111,14 +112,15 @@ class RemoteActorRefProvider( */ protected def createDeployer: RemoteDeployer = new RemoteDeployer(settings, dynamicAccess) - private val local = new LocalActorRefProvider(systemName, settings, eventStream, scheduler, dynamicAccess, deployer) + private val local = new LocalActorRefProvider(systemName, settings, eventStream, scheduler, dynamicAccess, deployer, + Some(deadLettersPath ⇒ new RemoteDeadLetterActorRef(this, deadLettersPath, eventStream))) @volatile private var _log = local.log def log: LoggingAdapter = _log override def rootPath: ActorPath = local.rootPath - override val deadLetters: InternalActorRef = new RemoteDeadLetterActorRef(this, rootPath / "deadLetters", eventStream) + override def deadLetters: InternalActorRef = local.deadLetters // these are only available after init() override def rootGuardian: InternalActorRef = local.rootGuardian