add CoordinatedShutdown, #21537
* CoordinatedShutdown that can run tasks for configured phases in order (DAG) * coordinate handover/shutdown of singleton with cluster exiting/shutdown * phase config obj with depends-on list * integrate graceful leaving of sharding in coordinated shutdown * add timeout and recover * add some missing artery ports to tests * leave via CoordinatedShutdown.run * optionally exit-jvm in last phase * run via jvm shutdown hook * send ExitingConfirmed to leader before shutdown of Exiting to not have to wait for failure detector to mark it as unreachable before removing * the unreachable signal is still kept as a safe guard if message is lost or leader dies * PhaseClusterExiting vs MemberExited in ClusterSingletonManager * terminate ActorSystem when cluster shutdown (via Down) * add more predefined and custom phases * reference documentation * migration guide * problem when the leader order was sys2, sys1, sys3, then sys3 could not perform it's duties and move Leving sys1 to Exiting because it was observing sys1 as unreachable * exclude Leaving with exitingConfirmed from convergence condidtion
This commit is contained in:
parent
4a9c753710
commit
84ade6fdc3
69 changed files with 1778 additions and 339 deletions
|
|
@ -13,6 +13,7 @@ import akka.cluster.ClusterEvent._
|
|||
import akka.cluster.MemberStatus._
|
||||
import akka.event.EventStream
|
||||
import akka.dispatch.{ UnboundedMessageQueueSemantics, RequiresMessageQueue }
|
||||
import akka.actor.DeadLetterSuppression
|
||||
|
||||
/**
|
||||
* Domain events published to the event bus.
|
||||
|
|
@ -199,7 +200,7 @@ object ClusterEvent {
|
|||
* This event is published when the cluster node is shutting down,
|
||||
* before the final [[MemberRemoved]] events are published.
|
||||
*/
|
||||
final case object ClusterShuttingDown extends ClusterDomainEvent
|
||||
final case object ClusterShuttingDown extends ClusterDomainEvent with DeadLetterSuppression
|
||||
|
||||
/**
|
||||
* Java API: get the singleton instance of `ClusterShuttingDown` event
|
||||
|
|
@ -335,9 +336,9 @@ object ClusterEvent {
|
|||
private[cluster] def diffSeen(oldGossip: Gossip, newGossip: Gossip, selfUniqueAddress: UniqueAddress): immutable.Seq[SeenChanged] =
|
||||
if (newGossip eq oldGossip) Nil
|
||||
else {
|
||||
val newConvergence = newGossip.convergence(selfUniqueAddress)
|
||||
val newConvergence = newGossip.convergence(selfUniqueAddress, Set.empty)
|
||||
val newSeenBy = newGossip.seenBy
|
||||
if (newConvergence != oldGossip.convergence(selfUniqueAddress) || newSeenBy != oldGossip.seenBy)
|
||||
if (newConvergence != oldGossip.convergence(selfUniqueAddress, Set.empty) || newSeenBy != oldGossip.seenBy)
|
||||
List(SeenChanged(newConvergence, newSeenBy.map(_.address)))
|
||||
else Nil
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue