Merge pull request #1313 from akka/wip-2797-cluster-router-stop-routees-patriknw

ClusterRouterConfig should stop remote deployed routees, see #2797
This commit is contained in:
Patrik Nordwall 2013-04-08 12:38:26 -07:00
commit 9270bfa70b
2 changed files with 15 additions and 4 deletions

View file

@ -199,6 +199,14 @@ private[akka] class ClusterRouteeProvider(
private[routing] def createRoutees(): Unit = createRoutees(settings.totalInstances)
override def unregisterRoutees(routees: immutable.Iterable[ActorRef]): Unit = {
super.unregisterRoutees(routees)
if (!settings.isRouteesPathDefined) {
// stop remote deployed routees
routees foreach context.stop
}
}
private def selectDeploymentTarget: Option[Address] = {
val currentRoutees = routees
val currentNodes = availableNodes
@ -286,8 +294,8 @@ private[akka] class ClusterRouterActor extends Router {
routeeProvider.nodes -= address
// unregister routees that live on that node
val affectedRoutes = routeeProvider.routees.filter(fullAddress(_) == address)
routeeProvider.unregisterRoutees(affectedRoutes)
val affectedRoutees = routeeProvider.routees.filter(fullAddress(_) == address)
routeeProvider.unregisterRoutees(affectedRoutees)
// createRoutees will not create more than createRoutees and maxInstancesPerNode
// this is useful when totalInstances < upNodes.size

View file

@ -7,11 +7,11 @@ import language.postfixOps
import scala.concurrent.Await
import scala.concurrent.duration._
import com.typesafe.config.ConfigFactory
import akka.actor.Actor
import akka.actor.ActorRef
import akka.actor.Address
import akka.actor.Props
import akka.actor.Terminated
import akka.cluster.MultiNodeClusterSpec
import akka.pattern.ask
import akka.remote.testkit.MultiNodeConfig
@ -307,10 +307,13 @@ abstract class ClusterRoundRobinRoutedActorSpec extends MultiNodeSpec(ClusterRou
def routees = currentRoutees(router2)
def routeeAddresses = (routees map fullAddress).toSet
routees foreach watch
val notUsedAddress = ((roles map address).toSet -- routeeAddresses).head
val downAddress = routeeAddresses.find(_ != address(first)).get
val downRoutee = routees.find(_.path.address == downAddress).get
cluster.down(downAddress)
expectMsgType[Terminated].actor must be(downRoutee)
awaitAssert {
routeeAddresses must contain(notUsedAddress)
routeeAddresses must not contain (downAddress)