replace unicode arrows
* ⇒, →, ← * because we don't want to show them in documentation snippets and then it's complicated to avoid that when snippets are located in src/test/scala in individual modules * dont replace object `→` in FSM.scala and PersistentFSM.scala
This commit is contained in:
parent
e4d38f92a4
commit
5c96a5f556
1521 changed files with 18846 additions and 18786 deletions
|
|
@ -256,7 +256,7 @@ object ClusterSingletonManager {
|
|||
// Using PhaseClusterExiting in the singleton because the graceful shutdown of sharding region
|
||||
// should preferably complete before stopping the singleton sharding coordinator on same node.
|
||||
val coordShutdown = CoordinatedShutdown(context.system)
|
||||
coordShutdown.addTask(CoordinatedShutdown.PhaseClusterExiting, "singleton-exiting-1") { () ⇒
|
||||
coordShutdown.addTask(CoordinatedShutdown.PhaseClusterExiting, "singleton-exiting-1") { () =>
|
||||
if (cluster.isTerminated || cluster.selfMember.status == MemberStatus.Down) {
|
||||
Future.successful(Done)
|
||||
} else {
|
||||
|
|
@ -272,7 +272,7 @@ object ClusterSingletonManager {
|
|||
def matchingRole(member: Member): Boolean =
|
||||
member.hasRole(selfDc) && role.forall(member.hasRole)
|
||||
|
||||
def trackChange(block: () ⇒ Unit): Unit = {
|
||||
def trackChange(block: () => Unit): Unit = {
|
||||
val before = membersByAge.headOption
|
||||
block()
|
||||
val after = membersByAge.headOption
|
||||
|
|
@ -281,13 +281,13 @@ object ClusterSingletonManager {
|
|||
}
|
||||
|
||||
def handleInitial(state: CurrentClusterState): Unit = {
|
||||
membersByAge = immutable.SortedSet.empty(ageOrdering) union state.members.filter(m ⇒
|
||||
membersByAge = immutable.SortedSet.empty(ageOrdering) union state.members.filter(m =>
|
||||
m.status == MemberStatus.Up && matchingRole(m))
|
||||
// If there is some removal in progress of an older node it's not safe to immediately become oldest,
|
||||
// removal of younger nodes doesn't matter. Note that it can also be started via restart after
|
||||
// ClusterSingletonManagerIsStuck.
|
||||
val selfUpNumber = state.members.collectFirst { case m if m.uniqueAddress == cluster.selfUniqueAddress ⇒ m.upNumber }.getOrElse(Int.MaxValue)
|
||||
val safeToBeOldest = !state.members.exists { m ⇒
|
||||
val selfUpNumber = state.members.collectFirst { case m if m.uniqueAddress == cluster.selfUniqueAddress => m.upNumber }.getOrElse(Int.MaxValue)
|
||||
val safeToBeOldest = !state.members.exists { m =>
|
||||
m.upNumber <= selfUpNumber && matchingRole(m) && (m.status == MemberStatus.Down || m.status == MemberStatus.Exiting || m.status == MemberStatus.Leaving)
|
||||
}
|
||||
val initial = InitialOldestState(membersByAge.headOption.map(_.uniqueAddress), safeToBeOldest)
|
||||
|
|
@ -296,7 +296,7 @@ object ClusterSingletonManager {
|
|||
|
||||
def add(m: Member): Unit = {
|
||||
if (matchingRole(m))
|
||||
trackChange { () ⇒
|
||||
trackChange { () =>
|
||||
// replace, it's possible that the upNumber is changed
|
||||
membersByAge = membersByAge.filterNot(_.uniqueAddress == m.uniqueAddress)
|
||||
membersByAge += m
|
||||
|
|
@ -305,7 +305,7 @@ object ClusterSingletonManager {
|
|||
|
||||
def remove(m: Member): Unit = {
|
||||
if (matchingRole(m))
|
||||
trackChange { () ⇒
|
||||
trackChange { () =>
|
||||
membersByAge = membersByAge.filterNot(_.uniqueAddress == m.uniqueAddress)
|
||||
}
|
||||
}
|
||||
|
|
@ -320,36 +320,36 @@ object ClusterSingletonManager {
|
|||
}
|
||||
|
||||
def receive = {
|
||||
case state: CurrentClusterState ⇒ handleInitial(state)
|
||||
case MemberUp(m) ⇒ add(m)
|
||||
case MemberRemoved(m, _) ⇒ remove(m)
|
||||
case MemberExited(m) if m.uniqueAddress != cluster.selfUniqueAddress ⇒
|
||||
case state: CurrentClusterState => handleInitial(state)
|
||||
case MemberUp(m) => add(m)
|
||||
case MemberRemoved(m, _) => remove(m)
|
||||
case MemberExited(m) if m.uniqueAddress != cluster.selfUniqueAddress =>
|
||||
remove(m)
|
||||
case SelfExiting ⇒
|
||||
case SelfExiting =>
|
||||
remove(cluster.readView.self)
|
||||
sender() ! Done // reply to ask
|
||||
case GetNext if changes.isEmpty ⇒
|
||||
case GetNext if changes.isEmpty =>
|
||||
context.become(deliverNext, discardOld = false)
|
||||
case GetNext ⇒
|
||||
case GetNext =>
|
||||
sendFirstChange()
|
||||
}
|
||||
|
||||
// the buffer was empty when GetNext was received, deliver next event immediately
|
||||
def deliverNext: Actor.Receive = {
|
||||
case state: CurrentClusterState ⇒
|
||||
case state: CurrentClusterState =>
|
||||
handleInitial(state)
|
||||
sendFirstChange()
|
||||
context.unbecome()
|
||||
case MemberUp(m) ⇒
|
||||
case MemberUp(m) =>
|
||||
add(m)
|
||||
deliverChanges()
|
||||
case MemberRemoved(m, _) ⇒
|
||||
case MemberRemoved(m, _) =>
|
||||
remove(m)
|
||||
deliverChanges()
|
||||
case MemberExited(m) if m.uniqueAddress != cluster.selfUniqueAddress ⇒
|
||||
case MemberExited(m) if m.uniqueAddress != cluster.selfUniqueAddress =>
|
||||
remove(m)
|
||||
deliverChanges()
|
||||
case SelfExiting ⇒
|
||||
case SelfExiting =>
|
||||
remove(cluster.readView.self)
|
||||
deliverChanges()
|
||||
sender() ! Done // reply to ask
|
||||
|
|
@ -364,8 +364,8 @@ object ClusterSingletonManager {
|
|||
|
||||
override def unhandled(msg: Any): Unit = {
|
||||
msg match {
|
||||
case _: MemberEvent ⇒ // ok, silence
|
||||
case _ ⇒ super.unhandled(msg)
|
||||
case _: MemberEvent => // ok, silence
|
||||
case _ => super.unhandled(msg)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -437,7 +437,7 @@ class ClusterSingletonManager(
|
|||
import ClusterSingletonManager.Internal._
|
||||
import ClusterSingletonManager.Internal.OldestChangedBuffer._
|
||||
import settings._
|
||||
import FSM.`→`
|
||||
import FSM.`->`
|
||||
|
||||
val cluster = Cluster(context.system)
|
||||
val selfUniqueAddressOption = Some(cluster.selfUniqueAddress)
|
||||
|
|
@ -473,22 +473,22 @@ class ClusterSingletonManager(
|
|||
var removed = Map.empty[UniqueAddress, Deadline]
|
||||
|
||||
def addRemoved(node: UniqueAddress): Unit =
|
||||
removed += node → (Deadline.now + 15.minutes)
|
||||
removed += node -> (Deadline.now + 15.minutes)
|
||||
|
||||
def cleanupOverdueNotMemberAnyMore(): Unit = {
|
||||
removed = removed filter { case (_, deadline) ⇒ deadline.hasTimeLeft }
|
||||
removed = removed filter { case (_, deadline) => deadline.hasTimeLeft }
|
||||
}
|
||||
|
||||
// for CoordinatedShutdown
|
||||
val coordShutdown = CoordinatedShutdown(context.system)
|
||||
val memberExitingProgress = Promise[Done]()
|
||||
coordShutdown.addTask(CoordinatedShutdown.PhaseClusterExiting, "wait-singleton-exiting") { () ⇒
|
||||
coordShutdown.addTask(CoordinatedShutdown.PhaseClusterExiting, "wait-singleton-exiting") { () =>
|
||||
if (cluster.isTerminated || cluster.selfMember.status == MemberStatus.Down)
|
||||
Future.successful(Done)
|
||||
else
|
||||
memberExitingProgress.future
|
||||
}
|
||||
coordShutdown.addTask(CoordinatedShutdown.PhaseClusterExiting, "singleton-exiting-2") { () ⇒
|
||||
coordShutdown.addTask(CoordinatedShutdown.PhaseClusterExiting, "singleton-exiting-2") { () =>
|
||||
if (cluster.isTerminated || cluster.selfMember.status == MemberStatus.Down) {
|
||||
Future.successful(Done)
|
||||
} else {
|
||||
|
|
@ -538,13 +538,13 @@ class ClusterSingletonManager(
|
|||
startWith(Start, Uninitialized)
|
||||
|
||||
when(Start) {
|
||||
case Event(StartOldestChangedBuffer, _) ⇒
|
||||
case Event(StartOldestChangedBuffer, _) =>
|
||||
oldestChangedBuffer = context.actorOf(Props(classOf[OldestChangedBuffer], role).
|
||||
withDispatcher(context.props.dispatcher))
|
||||
getNextOldestChanged()
|
||||
stay
|
||||
|
||||
case Event(InitialOldestState(oldestOption, safeToBeOldest), _) ⇒
|
||||
case Event(InitialOldestState(oldestOption, safeToBeOldest), _) =>
|
||||
oldestChangedReceived = true
|
||||
if (oldestOption == selfUniqueAddressOption && safeToBeOldest)
|
||||
// oldest immediately
|
||||
|
|
@ -556,14 +556,14 @@ class ClusterSingletonManager(
|
|||
}
|
||||
|
||||
when(Younger) {
|
||||
case Event(OldestChanged(oldestOption), YoungerData(previousOldestOption)) ⇒
|
||||
case Event(OldestChanged(oldestOption), YoungerData(previousOldestOption)) =>
|
||||
oldestChangedReceived = true
|
||||
if (oldestOption == selfUniqueAddressOption) {
|
||||
logInfo("Younger observed OldestChanged: [{} -> myself]", previousOldestOption.map(_.address))
|
||||
previousOldestOption match {
|
||||
case None ⇒ gotoOldest()
|
||||
case Some(prev) if removed.contains(prev) ⇒ gotoOldest()
|
||||
case Some(prev) ⇒
|
||||
case None => gotoOldest()
|
||||
case Some(prev) if removed.contains(prev) => gotoOldest()
|
||||
case Some(prev) =>
|
||||
peer(prev.address) ! HandOverToMe
|
||||
goto(BecomingOldest) using BecomingOldestData(previousOldestOption)
|
||||
}
|
||||
|
|
@ -573,25 +573,25 @@ class ClusterSingletonManager(
|
|||
stay using YoungerData(oldestOption)
|
||||
}
|
||||
|
||||
case Event(MemberDowned(m), _) if m.uniqueAddress == cluster.selfUniqueAddress ⇒
|
||||
case Event(MemberDowned(m), _) if m.uniqueAddress == cluster.selfUniqueAddress =>
|
||||
logInfo("Self downed, stopping ClusterSingletonManager")
|
||||
stop()
|
||||
|
||||
case Event(MemberRemoved(m, _), _) if m.uniqueAddress == cluster.selfUniqueAddress ⇒
|
||||
case Event(MemberRemoved(m, _), _) if m.uniqueAddress == cluster.selfUniqueAddress =>
|
||||
logInfo("Self removed, stopping ClusterSingletonManager")
|
||||
stop()
|
||||
|
||||
case Event(MemberRemoved(m, _), _) ⇒
|
||||
case Event(MemberRemoved(m, _), _) =>
|
||||
scheduleDelayedMemberRemoved(m)
|
||||
stay
|
||||
|
||||
case Event(DelayedMemberRemoved(m), YoungerData(Some(previousOldest))) if m.uniqueAddress == previousOldest ⇒
|
||||
case Event(DelayedMemberRemoved(m), YoungerData(Some(previousOldest))) if m.uniqueAddress == previousOldest =>
|
||||
logInfo("Previous oldest removed [{}]", m.address)
|
||||
addRemoved(m.uniqueAddress)
|
||||
// transition when OldestChanged
|
||||
stay using YoungerData(None)
|
||||
|
||||
case Event(HandOverToMe, _) ⇒
|
||||
case Event(HandOverToMe, _) =>
|
||||
// this node was probably quickly restarted with same hostname:port,
|
||||
// confirm that the old singleton instance has been stopped
|
||||
sender() ! HandOverDone
|
||||
|
|
@ -600,13 +600,13 @@ class ClusterSingletonManager(
|
|||
|
||||
when(BecomingOldest) {
|
||||
|
||||
case Event(HandOverInProgress, _) ⇒
|
||||
case Event(HandOverInProgress, _) =>
|
||||
// confirmation that the hand-over process has started
|
||||
logInfo("Hand-over in progress at [{}]", sender().path.address)
|
||||
cancelTimer(HandOverRetryTimer)
|
||||
stay
|
||||
|
||||
case Event(HandOverDone, BecomingOldestData(Some(previousOldest))) ⇒
|
||||
case Event(HandOverDone, BecomingOldestData(Some(previousOldest))) =>
|
||||
if (sender().path.address == previousOldest.address)
|
||||
gotoOldest()
|
||||
else {
|
||||
|
|
@ -616,51 +616,51 @@ class ClusterSingletonManager(
|
|||
stay
|
||||
}
|
||||
|
||||
case Event(MemberDowned(m), _) if m.uniqueAddress == cluster.selfUniqueAddress ⇒
|
||||
case Event(MemberDowned(m), _) if m.uniqueAddress == cluster.selfUniqueAddress =>
|
||||
logInfo("Self downed, stopping ClusterSingletonManager")
|
||||
stop()
|
||||
|
||||
case Event(MemberRemoved(m, _), _) if m.uniqueAddress == cluster.selfUniqueAddress ⇒
|
||||
case Event(MemberRemoved(m, _), _) if m.uniqueAddress == cluster.selfUniqueAddress =>
|
||||
logInfo("Self removed, stopping ClusterSingletonManager")
|
||||
stop()
|
||||
|
||||
case Event(MemberRemoved(m, _), _) ⇒
|
||||
case Event(MemberRemoved(m, _), _) =>
|
||||
scheduleDelayedMemberRemoved(m)
|
||||
stay
|
||||
|
||||
case Event(DelayedMemberRemoved(m), BecomingOldestData(Some(previousOldest))) if m.uniqueAddress == previousOldest ⇒
|
||||
case Event(DelayedMemberRemoved(m), BecomingOldestData(Some(previousOldest))) if m.uniqueAddress == previousOldest =>
|
||||
logInfo("Previous oldest [{}] removed", previousOldest.address)
|
||||
addRemoved(m.uniqueAddress)
|
||||
gotoOldest()
|
||||
|
||||
case Event(TakeOverFromMe, BecomingOldestData(previousOldestOption)) ⇒
|
||||
case Event(TakeOverFromMe, BecomingOldestData(previousOldestOption)) =>
|
||||
val senderAddress = sender().path.address
|
||||
// it would have been better to include the UniqueAddress in the TakeOverFromMe message,
|
||||
// but can't change due to backwards compatibility
|
||||
cluster.state.members.collectFirst { case m if m.address == senderAddress ⇒ m.uniqueAddress } match {
|
||||
case None ⇒
|
||||
cluster.state.members.collectFirst { case m if m.address == senderAddress => m.uniqueAddress } match {
|
||||
case None =>
|
||||
// from unknown node, ignore
|
||||
logInfo(
|
||||
"Ignoring TakeOver request from unknown node in BecomingOldest from [{}].", senderAddress)
|
||||
stay
|
||||
case Some(senderUniqueAddress) ⇒
|
||||
case Some(senderUniqueAddress) =>
|
||||
previousOldestOption match {
|
||||
case Some(previousOldest) ⇒
|
||||
case Some(previousOldest) =>
|
||||
if (previousOldest == senderUniqueAddress) sender() ! HandOverToMe
|
||||
else logInfo(
|
||||
"Ignoring TakeOver request in BecomingOldest from [{}]. Expected previous oldest [{}]",
|
||||
sender().path.address, previousOldest.address)
|
||||
stay
|
||||
case None ⇒
|
||||
case None =>
|
||||
sender() ! HandOverToMe
|
||||
stay using BecomingOldestData(Some(senderUniqueAddress))
|
||||
}
|
||||
}
|
||||
|
||||
case Event(HandOverRetry(count), BecomingOldestData(previousOldestOption)) ⇒
|
||||
case Event(HandOverRetry(count), BecomingOldestData(previousOldestOption)) =>
|
||||
if (count <= maxHandOverRetries) {
|
||||
logInfo("Retry [{}], sending HandOverToMe to [{}]", count, previousOldestOption.map(_.address))
|
||||
previousOldestOption.foreach(node ⇒ peer(node.address) ! HandOverToMe)
|
||||
previousOldestOption.foreach(node => peer(node.address) ! HandOverToMe)
|
||||
setTimer(HandOverRetryTimer, HandOverRetry(count + 1), handOverRetryInterval, repeat = false)
|
||||
stay()
|
||||
} else if (previousOldestOption forall removed.contains) {
|
||||
|
|
@ -690,48 +690,48 @@ class ClusterSingletonManager(
|
|||
}
|
||||
|
||||
when(Oldest) {
|
||||
case Event(OldestChanged(oldestOption), OldestData(singleton, singletonTerminated)) ⇒
|
||||
case Event(OldestChanged(oldestOption), OldestData(singleton, singletonTerminated)) =>
|
||||
oldestChangedReceived = true
|
||||
logInfo("Oldest observed OldestChanged: [{} -> {}]", cluster.selfAddress, oldestOption.map(_.address))
|
||||
oldestOption match {
|
||||
case Some(a) if a == cluster.selfUniqueAddress ⇒
|
||||
case Some(a) if a == cluster.selfUniqueAddress =>
|
||||
// already oldest
|
||||
stay
|
||||
case Some(a) if !selfExited && removed.contains(a) ⇒
|
||||
case Some(a) if !selfExited && removed.contains(a) =>
|
||||
// The member removal was not completed and the old removed node is considered
|
||||
// oldest again. Safest is to terminate the singleton instance and goto Younger.
|
||||
// This node will become oldest again when the other is removed again.
|
||||
gotoHandingOver(singleton, singletonTerminated, None)
|
||||
case Some(a) ⇒
|
||||
case Some(a) =>
|
||||
// send TakeOver request in case the new oldest doesn't know previous oldest
|
||||
peer(a.address) ! TakeOverFromMe
|
||||
setTimer(TakeOverRetryTimer, TakeOverRetry(1), handOverRetryInterval, repeat = false)
|
||||
goto(WasOldest) using WasOldestData(singleton, singletonTerminated, newOldestOption = Some(a))
|
||||
case None ⇒
|
||||
case None =>
|
||||
// new oldest will initiate the hand-over
|
||||
setTimer(TakeOverRetryTimer, TakeOverRetry(1), handOverRetryInterval, repeat = false)
|
||||
goto(WasOldest) using WasOldestData(singleton, singletonTerminated, newOldestOption = None)
|
||||
}
|
||||
|
||||
case Event(HandOverToMe, OldestData(singleton, singletonTerminated)) ⇒
|
||||
case Event(HandOverToMe, OldestData(singleton, singletonTerminated)) =>
|
||||
gotoHandingOver(singleton, singletonTerminated, Some(sender()))
|
||||
|
||||
case Event(TakeOverFromMe, _) ⇒
|
||||
case Event(TakeOverFromMe, _) =>
|
||||
// already oldest, so confirm and continue like that
|
||||
sender() ! HandOverToMe
|
||||
stay
|
||||
|
||||
case Event(Terminated(ref), d @ OldestData(singleton, _)) if ref == singleton ⇒
|
||||
case Event(Terminated(ref), d @ OldestData(singleton, _)) if ref == singleton =>
|
||||
logInfo("Singleton actor [{}] was terminated", singleton.path)
|
||||
stay using d.copy(singletonTerminated = true)
|
||||
|
||||
case Event(SelfExiting, _) ⇒
|
||||
case Event(SelfExiting, _) =>
|
||||
selfMemberExited()
|
||||
// complete memberExitingProgress when handOverDone
|
||||
sender() ! Done // reply to ask
|
||||
stay
|
||||
|
||||
case Event(MemberDowned(m), OldestData(singleton, singletonTerminated)) if m.uniqueAddress == cluster.selfUniqueAddress ⇒
|
||||
case Event(MemberDowned(m), OldestData(singleton, singletonTerminated)) if m.uniqueAddress == cluster.selfUniqueAddress =>
|
||||
if (singletonTerminated) {
|
||||
logInfo("Self downed, stopping ClusterSingletonManager")
|
||||
stop()
|
||||
|
|
@ -742,7 +742,7 @@ class ClusterSingletonManager(
|
|||
}
|
||||
|
||||
when(WasOldest) {
|
||||
case Event(TakeOverRetry(count), WasOldestData(singleton, singletonTerminated, newOldestOption)) ⇒
|
||||
case Event(TakeOverRetry(count), WasOldestData(singleton, singletonTerminated, newOldestOption)) =>
|
||||
if ((cluster.isTerminated || selfExited) && (newOldestOption.isEmpty || count > maxTakeOverRetries)) {
|
||||
if (singletonTerminated) stop()
|
||||
else gotoStopping(singleton)
|
||||
|
|
@ -751,34 +751,34 @@ class ClusterSingletonManager(
|
|||
logInfo("Retry [{}], sending TakeOverFromMe to [{}]", count, newOldestOption.map(_.address))
|
||||
else
|
||||
log.debug("Retry [{}], sending TakeOverFromMe to [{}]", count, newOldestOption.map(_.address))
|
||||
newOldestOption.foreach(node ⇒ peer(node.address) ! TakeOverFromMe)
|
||||
newOldestOption.foreach(node => peer(node.address) ! TakeOverFromMe)
|
||||
setTimer(TakeOverRetryTimer, TakeOverRetry(count + 1), handOverRetryInterval, repeat = false)
|
||||
stay
|
||||
} else
|
||||
throw new ClusterSingletonManagerIsStuck(s"Expected hand-over to [$newOldestOption] never occurred")
|
||||
|
||||
case Event(HandOverToMe, WasOldestData(singleton, singletonTerminated, _)) ⇒
|
||||
case Event(HandOverToMe, WasOldestData(singleton, singletonTerminated, _)) =>
|
||||
gotoHandingOver(singleton, singletonTerminated, Some(sender()))
|
||||
|
||||
case Event(MemberRemoved(m, _), _) if m.uniqueAddress == cluster.selfUniqueAddress && !selfExited ⇒
|
||||
case Event(MemberRemoved(m, _), _) if m.uniqueAddress == cluster.selfUniqueAddress && !selfExited =>
|
||||
logInfo("Self removed, stopping ClusterSingletonManager")
|
||||
stop()
|
||||
|
||||
case Event(MemberRemoved(m, _), WasOldestData(singleton, singletonTerminated, Some(newOldest))) if !selfExited && m.uniqueAddress == newOldest ⇒
|
||||
case Event(MemberRemoved(m, _), WasOldestData(singleton, singletonTerminated, Some(newOldest))) if !selfExited && m.uniqueAddress == newOldest =>
|
||||
addRemoved(m.uniqueAddress)
|
||||
gotoHandingOver(singleton, singletonTerminated, None)
|
||||
|
||||
case Event(Terminated(ref), d @ WasOldestData(singleton, _, _)) if ref == singleton ⇒
|
||||
case Event(Terminated(ref), d @ WasOldestData(singleton, _, _)) if ref == singleton =>
|
||||
logInfo("Singleton actor [{}] was terminated", singleton.path)
|
||||
stay using d.copy(singletonTerminated = true)
|
||||
|
||||
case Event(SelfExiting, _) ⇒
|
||||
case Event(SelfExiting, _) =>
|
||||
selfMemberExited()
|
||||
// complete memberExitingProgress when handOverDone
|
||||
sender() ! Done // reply to ask
|
||||
stay
|
||||
|
||||
case Event(MemberDowned(m), OldestData(singleton, singletonTerminated)) if m.uniqueAddress == cluster.selfUniqueAddress ⇒
|
||||
case Event(MemberDowned(m), OldestData(singleton, singletonTerminated)) if m.uniqueAddress == cluster.selfUniqueAddress =>
|
||||
if (singletonTerminated) {
|
||||
logInfo("Self downed, stopping ClusterSingletonManager")
|
||||
stop()
|
||||
|
|
@ -801,15 +801,15 @@ class ClusterSingletonManager(
|
|||
}
|
||||
|
||||
when(HandingOver) {
|
||||
case (Event(Terminated(ref), HandingOverData(singleton, handOverTo))) if ref == singleton ⇒
|
||||
case (Event(Terminated(ref), HandingOverData(singleton, handOverTo))) if ref == singleton =>
|
||||
handOverDone(handOverTo)
|
||||
|
||||
case Event(HandOverToMe, HandingOverData(singleton, handOverTo)) if handOverTo == Some(sender()) ⇒
|
||||
case Event(HandOverToMe, HandingOverData(singleton, handOverTo)) if handOverTo == Some(sender()) =>
|
||||
// retry
|
||||
sender() ! HandOverInProgress
|
||||
stay
|
||||
|
||||
case Event(SelfExiting, _) ⇒
|
||||
case Event(SelfExiting, _) =>
|
||||
selfMemberExited()
|
||||
// complete memberExitingProgress when handOverDone
|
||||
sender() ! Done // reply to ask
|
||||
|
|
@ -837,16 +837,16 @@ class ClusterSingletonManager(
|
|||
}
|
||||
|
||||
when(Stopping) {
|
||||
case (Event(Terminated(ref), StoppingData(singleton))) if ref == singleton ⇒
|
||||
case (Event(Terminated(ref), StoppingData(singleton))) if ref == singleton =>
|
||||
logInfo("Singleton actor [{}] was terminated", singleton.path)
|
||||
stop()
|
||||
}
|
||||
|
||||
when(End) {
|
||||
case Event(MemberRemoved(m, _), _) if m.uniqueAddress == cluster.selfUniqueAddress ⇒
|
||||
case Event(MemberRemoved(m, _), _) if m.uniqueAddress == cluster.selfUniqueAddress =>
|
||||
logInfo("Self removed, stopping ClusterSingletonManager")
|
||||
stop()
|
||||
case Event(_: OldestChanged, _) ⇒
|
||||
case Event(_: OldestChanged, _) =>
|
||||
// not interested anymore - waiting for removal
|
||||
stay
|
||||
}
|
||||
|
|
@ -857,53 +857,53 @@ class ClusterSingletonManager(
|
|||
}
|
||||
|
||||
whenUnhandled {
|
||||
case Event(SelfExiting, _) ⇒
|
||||
case Event(SelfExiting, _) =>
|
||||
selfMemberExited()
|
||||
memberExitingProgress.trySuccess(Done)
|
||||
sender() ! Done // reply to ask
|
||||
stay
|
||||
case Event(MemberRemoved(m, _), _) if m.uniqueAddress == cluster.selfUniqueAddress && !selfExited ⇒
|
||||
case Event(MemberRemoved(m, _), _) if m.uniqueAddress == cluster.selfUniqueAddress && !selfExited =>
|
||||
logInfo("Self removed, stopping ClusterSingletonManager")
|
||||
stop()
|
||||
case Event(MemberRemoved(m, _), _) ⇒
|
||||
case Event(MemberRemoved(m, _), _) =>
|
||||
if (!selfExited) logInfo("Member removed [{}]", m.address)
|
||||
addRemoved(m.uniqueAddress)
|
||||
stay
|
||||
case Event(DelayedMemberRemoved(m), _) ⇒
|
||||
case Event(DelayedMemberRemoved(m), _) =>
|
||||
if (!selfExited) logInfo("Member removed [{}]", m.address)
|
||||
addRemoved(m.uniqueAddress)
|
||||
stay
|
||||
case Event(TakeOverFromMe, _) ⇒
|
||||
case Event(TakeOverFromMe, _) =>
|
||||
log.debug("Ignoring TakeOver request in [{}] from [{}].", stateName, sender().path.address)
|
||||
stay
|
||||
case Event(Cleanup, _) ⇒
|
||||
case Event(Cleanup, _) =>
|
||||
cleanupOverdueNotMemberAnyMore()
|
||||
stay
|
||||
case Event(MemberDowned(m), _) ⇒
|
||||
case Event(MemberDowned(m), _) =>
|
||||
if (m.uniqueAddress == cluster.selfUniqueAddress)
|
||||
logInfo("Self downed, waiting for removal")
|
||||
stay
|
||||
}
|
||||
|
||||
onTransition {
|
||||
case from → to ⇒ logInfo("ClusterSingletonManager state change [{} -> {}]", from, to)
|
||||
case from -> to => logInfo("ClusterSingletonManager state change [{} -> {}]", from, to)
|
||||
}
|
||||
|
||||
onTransition {
|
||||
case _ → BecomingOldest ⇒ setTimer(HandOverRetryTimer, HandOverRetry(1), handOverRetryInterval, repeat = false)
|
||||
case _ -> BecomingOldest => setTimer(HandOverRetryTimer, HandOverRetry(1), handOverRetryInterval, repeat = false)
|
||||
}
|
||||
|
||||
onTransition {
|
||||
case BecomingOldest → _ ⇒ cancelTimer(HandOverRetryTimer)
|
||||
case WasOldest → _ ⇒ cancelTimer(TakeOverRetryTimer)
|
||||
case BecomingOldest -> _ => cancelTimer(HandOverRetryTimer)
|
||||
case WasOldest -> _ => cancelTimer(TakeOverRetryTimer)
|
||||
}
|
||||
|
||||
onTransition {
|
||||
case _ → (Younger | Oldest) ⇒ getNextOldestChanged()
|
||||
case _ -> (Younger | Oldest) => getNextOldestChanged()
|
||||
}
|
||||
|
||||
onTransition {
|
||||
case _ → (Younger | End) if removed.contains(cluster.selfUniqueAddress) ⇒
|
||||
case _ -> (Younger | End) if removed.contains(cluster.selfUniqueAddress) =>
|
||||
logInfo("Self removed, stopping ClusterSingletonManager")
|
||||
// note that FSM.stop() can't be used in onTransition
|
||||
context.stop(self)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue