Additional fix stack overflow for dead letters message adapter, #31241 (#31265)

This commit is contained in:
Patrik Nordwall 2022-03-21 12:20:38 +01:00 committed by GitHub
parent af18e824b4
commit b08a91597e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -849,7 +849,9 @@ private[akka] class VirtualPathContainer(
*/ */
@InternalApi private[akka] object FunctionRef { @InternalApi private[akka] object FunctionRef {
def deadLetterMessageHandler(system: ActorSystem): (ActorRef, Any) => Unit = { (sender, msg) => def deadLetterMessageHandler(system: ActorSystem): (ActorRef, Any) => Unit = { (sender, msg) =>
system.deadLetters.tell(msg, sender) // avoid infinite loop (StackOverflow) if FunctionRef is used for subscribing to DeadLetter from eventStream
if (!msg.isInstanceOf[DeadLetter])
system.deadLetters.tell(msg, sender)
} }
} }
@ -971,11 +973,11 @@ private[akka] class VirtualPathContainer(
} }
override def stop(): Unit = { override def stop(): Unit = {
sendTerminated()
// The messageHandler function may close over a large object graph (such as an Akka Stream) // The messageHandler function may close over a large object graph (such as an Akka Stream)
// so we replace the messageHandler function to make that available for garbage collection. // so we replace the messageHandler function to make that available for garbage collection.
// Doesn't matter if the change isn't visible immediately, volatile not needed. // Doesn't matter if the change isn't visible immediately, volatile not needed.
messageHandler = FunctionRef.deadLetterMessageHandler(system) messageHandler = FunctionRef.deadLetterMessageHandler(system)
sendTerminated()
} }
private def addWatcher(watchee: ActorRef, watcher: ActorRef): Unit = { private def addWatcher(watchee: ActorRef, watcher: ActorRef): Unit = {