Add another test case for publish of LeaderChanged, see #2518

* It didn't handle convergence changes with same leader correctly
This commit is contained in:
Patrik Nordwall 2012-09-19 10:18:55 +02:00
parent c0c6cc3931
commit 718686e2f2
2 changed files with 53 additions and 17 deletions

View file

@ -174,6 +174,7 @@ private[cluster] final class ClusterDomainEventPublisher extends Actor with Acto
var latestGossip: Gossip = Gossip()
var stashedLeaderChanged: Option[LeaderChanged] = None
var publishedLeaderChanged: Option[LeaderChanged] = None
def receive = {
case PublishChanges(oldGossip, newGossip) publishChanges(oldGossip, newGossip)
@ -203,16 +204,26 @@ private[cluster] final class ClusterDomainEventPublisher extends Actor with Acto
latestGossip = newGossip
diff(oldGossip, newGossip) foreach { event
event match {
case LeaderChanged(_) if oldGossip.convergence && newGossip.convergence
case x @ LeaderChanged(_) if Some(x) == publishedLeaderChanged
// skip, this leader has already been published
case x @ LeaderChanged(_) if oldGossip.convergence && newGossip.convergence
stashedLeaderChanged = None
eventStream publish event
publishedLeaderChanged = Some(x)
eventStream publish x
case x: LeaderChanged
// publish later, when convergence
stashedLeaderChanged = Some(x)
case ConvergenceChanged(true)
stashedLeaderChanged foreach { eventStream publish _ }
stashedLeaderChanged = None
stashedLeaderChanged foreach {
publishedLeaderChanged = stashedLeaderChanged
stashedLeaderChanged = None
eventStream publish _
}
eventStream publish event
case MemberUnreachable(m)
eventStream publish event
// notify DeathWatch about unreachable node