diff --git a/akka-actor-tests/src/test/scala/akka/pattern/AskSpec.scala b/akka-actor-tests/src/test/scala/akka/pattern/AskSpec.scala index 71dbe1b45e..ff3d05eb5c 100644 --- a/akka-actor-tests/src/test/scala/akka/pattern/AskSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/pattern/AskSpec.scala @@ -67,6 +67,15 @@ class AskSpec extends AkkaSpec { }.getMessage must be === expectedMsg } + "include target information in AskTimeout" in { + implicit val timeout = Timeout(0.5 seconds) + val silentOne = system.actorOf(Props.empty, "silent") + val f = silentOne ? "noreply" + intercept[AskTimeoutException] { + Await.result(f, remaining) + }.getMessage.contains("/user/silent") must be(true) + } + "work for ActorSelection" in { implicit val timeout = Timeout(5 seconds) import system.dispatcher diff --git a/akka-actor/src/main/scala/akka/pattern/AskSupport.scala b/akka-actor/src/main/scala/akka/pattern/AskSupport.scala index c741c53803..2ebe7d3c70 100644 --- a/akka-actor/src/main/scala/akka/pattern/AskSupport.scala +++ b/akka-actor/src/main/scala/akka/pattern/AskSupport.scala @@ -136,7 +136,7 @@ final class AskableActorRef(val actorRef: ActorRef) extends AnyVal { if (timeout.duration.length <= 0) Future.failed[Any](new IllegalArgumentException(s"Timeout length must not be negative, question not sent to [$actorRef]")) else { - val a = PromiseActorRef(ref.provider, timeout) + val a = PromiseActorRef(ref.provider, timeout, targetName = actorRef.toString) actorRef.tell(message, a) a.result.future } @@ -157,7 +157,7 @@ final class AskableActorSelection(val actorSel: ActorSelection) extends AnyVal { Future.failed[Any]( new IllegalArgumentException(s"Timeout length must not be negative, question not sent to [$actorSel]")) else { - val a = PromiseActorRef(ref.provider, timeout) + val a = PromiseActorRef(ref.provider, timeout, targetName = actorSel.toString) actorSel.tell(message, a) a.result.future } @@ -326,12 +326,14 @@ private[akka] object PromiseActorRef { private case object Stopped private case class StoppedWithPath(path: ActorPath) - def apply(provider: ActorRefProvider, timeout: Timeout): PromiseActorRef = { + def apply(provider: ActorRefProvider, timeout: Timeout, targetName: String): PromiseActorRef = { val result = Promise[Any]() val scheduler = provider.guardian.underlying.system.scheduler val a = new PromiseActorRef(provider, result) implicit val ec = a.internalCallingThreadExecutionContext - val f = scheduler.scheduleOnce(timeout.duration) { result tryComplete Failure(new AskTimeoutException("Timed out")) } + val f = scheduler.scheduleOnce(timeout.duration) { + result tryComplete Failure(new AskTimeoutException(s"Ask timed out on [$targetName]")) + } result.future onComplete { _ ⇒ try a.stop() finally f.cancel() } a } diff --git a/akka-actor/src/main/scala/akka/pattern/GracefulStopSupport.scala b/akka-actor/src/main/scala/akka/pattern/GracefulStopSupport.scala index 0cdc5df377..c66df64a0e 100644 --- a/akka-actor/src/main/scala/akka/pattern/GracefulStopSupport.scala +++ b/akka-actor/src/main/scala/akka/pattern/GracefulStopSupport.scala @@ -49,7 +49,7 @@ trait GracefulStopSupport { if (target.isTerminated) Future successful true else { val internalTarget = target.asInstanceOf[InternalActorRef] - val ref = PromiseActorRef(internalTarget.provider, Timeout(timeout)) + val ref = PromiseActorRef(internalTarget.provider, Timeout(timeout), targetName = target.toString) internalTarget.sendSystemMessage(Watch(internalTarget, ref)) target.tell(stopMessage, Actor.noSender) ref.result.future.transform( diff --git a/akka-remote/src/main/scala/akka/remote/transport/ThrottlerTransportAdapter.scala b/akka-remote/src/main/scala/akka/remote/transport/ThrottlerTransportAdapter.scala index 94c47241c0..4f54ee05dc 100644 --- a/akka-remote/src/main/scala/akka/remote/transport/ThrottlerTransportAdapter.scala +++ b/akka-remote/src/main/scala/akka/remote/transport/ThrottlerTransportAdapter.scala @@ -284,7 +284,7 @@ private[transport] class ThrottlerManager(wrappedTransport: Transport) extends A if (target.isTerminated) Future successful SetThrottleAck else { val internalTarget = target.asInstanceOf[InternalActorRef] - val ref = PromiseActorRef(internalTarget.provider, timeout) + val ref = PromiseActorRef(internalTarget.provider, timeout, target.toString) internalTarget.sendSystemMessage(Watch(internalTarget, ref)) target.tell(mode, ref) ref.result.future.transform({