handle longer network partitions, #21399
* system messages in flight should not trigger premature quarantine in case of longer network partitions, therefore we keep the control stream alive * add give-up-system-message-after property that is used by both SystemMessageDelivery and AeronSink in the control stream * also unwrap SystemMessageEnvelope in RemoteDeadLetterActorRef * skip sending control messages after shutdown, can be triggered by scheduled compression advertisment
This commit is contained in:
parent
cd4a31e74d
commit
1584c52190
12 changed files with 181 additions and 31 deletions
|
|
@ -20,6 +20,7 @@ import akka.dispatch.{ RequiresMessageQueue, UnboundedMessageQueueSemantics }
|
|||
import akka.remote.artery.ArteryTransport
|
||||
import akka.util.OptionVal
|
||||
import akka.remote.artery.OutboundEnvelope
|
||||
import akka.remote.artery.SystemMessageDelivery.SystemMessageEnvelope
|
||||
|
||||
/**
|
||||
* INTERNAL API
|
||||
|
|
@ -98,14 +99,19 @@ private[akka] object RemoteActorRefProvider {
|
|||
// the dead letter status
|
||||
if (seqOpt.isEmpty) super.!(DeadLetter(m, senderOption.getOrElse(_provider.deadLetters), recipient))
|
||||
case env: OutboundEnvelope ⇒
|
||||
super.!(DeadLetter(env.message, env.sender.getOrElse(_provider.deadLetters),
|
||||
super.!(DeadLetter(unwrapSystemMessageEnvelope(env.message), env.sender.getOrElse(_provider.deadLetters),
|
||||
env.recipient.getOrElse(_provider.deadLetters)))
|
||||
case DeadLetter(env: OutboundEnvelope, _, _) ⇒
|
||||
super.!(DeadLetter(env.message, env.sender.getOrElse(_provider.deadLetters),
|
||||
super.!(DeadLetter(unwrapSystemMessageEnvelope(env.message), env.sender.getOrElse(_provider.deadLetters),
|
||||
env.recipient.getOrElse(_provider.deadLetters)))
|
||||
case _ ⇒ super.!(message)(sender)
|
||||
}
|
||||
|
||||
private def unwrapSystemMessageEnvelope(msg: AnyRef): AnyRef = msg match {
|
||||
case SystemMessageEnvelope(m, _, _) ⇒ m
|
||||
case _ ⇒ msg
|
||||
}
|
||||
|
||||
@throws(classOf[java.io.ObjectStreamException])
|
||||
override protected def writeReplace(): AnyRef = DeadLetterActorRef.serialized
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue