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

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

View file

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