stop ClusterSingletonProxy when self member removed, #22117

This commit is contained in:
Patrik Nordwall 2017-01-09 21:34:45 +01:00
parent 8fd5b7e53e
commit eb8ebd09bd
2 changed files with 14 additions and 4 deletions

View file

@ -222,8 +222,13 @@ final class ClusterSingletonProxy(singletonManagerPath: String, settings: Cluste
def receive = {
// cluster logic
case state: CurrentClusterState handleInitial(state)
case MemberUp(m) add(m)
case mEvent: MemberEvent if mEvent.isInstanceOf[MemberExited] || mEvent.isInstanceOf[MemberRemoved] remove(mEvent.member)
case MemberUp(m) add(m)
case MemberExited(m) remove(m)
case MemberRemoved(m, _)
if (m.uniqueAddress == cluster.selfUniqueAddress)
context.stop(self)
else
remove(m)
case _: MemberEvent // do nothing
// singleton identification logic

View file

@ -89,12 +89,14 @@ class ClusterSingletonManagerLeaveSpec extends MultiNodeSpec(ClusterSingletonMan
name = "echo")
}
val echoProxyTerminatedProbe = TestProbe()
lazy val echoProxy: ActorRef = {
system.actorOf(
echoProxyTerminatedProbe.watch(system.actorOf(
ClusterSingletonProxy.props(
singletonManagerPath = "/user/echo",
settings = ClusterSingletonProxySettings(system)),
name = "echoProxy")
name = "echoProxy"))
}
"Leaving ClusterSingletonManager" must {
@ -136,6 +138,7 @@ class ClusterSingletonManagerLeaveSpec extends MultiNodeSpec(ClusterSingletonMan
// CoordinatedShutdown makes sure that singleton actors are
// stopped before Cluster shutdown
expectMsg("MemberRemoved")
echoProxyTerminatedProbe.expectTerminated(echoProxy, 10.seconds)
}
enterBarrier("first-stopped")
@ -163,6 +166,7 @@ class ClusterSingletonManagerLeaveSpec extends MultiNodeSpec(ClusterSingletonMan
expectMsg(15.seconds, "stop")
expectMsg("postStop")
expectMsg("MemberRemoved")
echoProxyTerminatedProbe.expectTerminated(echoProxy, 10.seconds)
}
enterBarrier("second-stopped")
@ -177,6 +181,7 @@ class ClusterSingletonManagerLeaveSpec extends MultiNodeSpec(ClusterSingletonMan
expectMsg(5.seconds, "stop")
expectMsg("postStop")
expectMsg("MemberRemoved")
echoProxyTerminatedProbe.expectTerminated(echoProxy, 10.seconds)
}
enterBarrier("third-stopped")