Use the target actor name in the temporary ask actor name (#29245)

* Allows specifying the large message channel for the response using wildcard patterns in config
 * Makes debugging asks somewhat easier
This commit is contained in:
Johan Andrén 2020-07-08 17:43:52 +02:00 committed by GitHub
parent 2f424b13dd
commit df995fe7bd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 101 additions and 35 deletions

View file

@ -4,19 +4,19 @@
package akka.pattern
import java.net.URLEncoder
import java.util.concurrent.TimeoutException
import scala.annotation.tailrec
import scala.concurrent.{ Future, Promise }
import scala.language.implicitConversions
import scala.util.{ Failure, Success }
import com.github.ghik.silencer.silent
import akka.actor._
import akka.annotation.{ InternalApi, InternalStableApi }
import akka.dispatch.ExecutionContexts
import akka.dispatch.sysmsg._
import akka.util.ByteString
import akka.util.{ Timeout, Unsafe }
import akka.util.unused
@ -340,7 +340,7 @@ final class AskableActorRef(val actorRef: ActorRef) extends AnyVal {
if (timeout.duration.length <= 0)
Future.failed[Any](AskableActorRef.negativeTimeoutException(actorRef, message, sender))
else {
PromiseActorRef(ref.provider, timeout, targetName = actorRef, message.getClass.getName, sender)
PromiseActorRef(ref.provider, timeout, targetName = actorRef, message.getClass.getName, ref.path.name, sender)
.ask(actorRef, message, timeout)
}
case _ => Future.failed[Any](AskableActorRef.unsupportedRecipientType(actorRef, message, sender))
@ -373,7 +373,7 @@ final class ExplicitlyAskableActorRef(val actorRef: ActorRef) extends AnyVal {
val message = messageFactory(ref.provider.deadLetters)
Future.failed[Any](AskableActorRef.negativeTimeoutException(actorRef, message, sender))
} else {
val a = PromiseActorRef(ref.provider, timeout, targetName = actorRef, "unknown", sender)
val a = PromiseActorRef(ref.provider, timeout, targetName = actorRef, "unknown", ref.path.name, sender)
val message = messageFactory(a)
a.messageClassName = message.getClass.getName
a.ask(actorRef, message, timeout)
@ -422,7 +422,8 @@ final class AskableActorSelection(val actorSel: ActorSelection) extends AnyVal {
if (timeout.duration.length <= 0)
Future.failed[Any](AskableActorRef.negativeTimeoutException(actorSel, message, sender))
else {
PromiseActorRef(ref.provider, timeout, targetName = actorSel, message.getClass.getName, sender)
val refPrefix = URLEncoder.encode(actorSel.pathString.replace("/", "_"), ByteString.UTF_8)
PromiseActorRef(ref.provider, timeout, targetName = actorSel, message.getClass.getName, refPrefix, sender)
.ask(actorSel, message, timeout)
}
case _ => Future.failed[Any](AskableActorRef.unsupportedRecipientType(actorSel, message, sender))
@ -450,7 +451,8 @@ final class ExplicitlyAskableActorSelection(val actorSel: ActorSelection) extend
val message = messageFactory(ref.provider.deadLetters)
Future.failed[Any](AskableActorRef.negativeTimeoutException(actorSel, message, sender))
} else {
val a = PromiseActorRef(ref.provider, timeout, targetName = actorSel, "unknown", sender)
val refPrefix = URLEncoder.encode(actorSel.pathString.replace("/", "_"), ByteString.UTF_8)
val a = PromiseActorRef(ref.provider, timeout, targetName = actorSel, "unknown", refPrefix, sender)
val message = messageFactory(a)
a.messageClassName = message.getClass.getName
a.ask(actorSel, message, timeout)
@ -476,7 +478,8 @@ final class ExplicitlyAskableActorSelection(val actorSel: ActorSelection) extend
private[akka] final class PromiseActorRef private (
val provider: ActorRefProvider,
val result: Promise[Any],
_mcn: String)
_mcn: String,
refPathPrefix: String)
extends MinimalActorRef {
import AbstractPromiseActorRef.{ stateOffset, watchedByOffset }
import PromiseActorRef._
@ -553,7 +556,7 @@ private[akka] final class PromiseActorRef private (
if (updateState(null, Registering)) {
var p: ActorPath = null
try {
p = provider.tempPath()
p = provider.tempPath(refPathPrefix)
provider.registerTempActor(this, p)
p
} finally {
@ -670,11 +673,14 @@ private[akka] object PromiseActorRef {
timeout: Timeout,
targetName: Any,
messageClassName: String,
refPathPrefix: String,
sender: ActorRef = Actor.noSender,
onTimeout: String => Throwable = defaultOnTimeout): PromiseActorRef = {
if (refPathPrefix.indexOf('/') > -1)
throw new IllegalArgumentException(s"refPathPrefix must not contain slash, was: $refPathPrefix")
val result = Promise[Any]()
val scheduler = provider.guardian.underlying.system.scheduler
val a = new PromiseActorRef(provider, result, messageClassName)
val a = new PromiseActorRef(provider, result, messageClassName, refPathPrefix)
implicit val ec = ExecutionContexts.parasitic
val f = scheduler.scheduleOnce(timeout.duration) {
val timedOut = result.tryComplete {