diff --git a/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala b/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala index e355204de9..44ad5a2b63 100644 --- a/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala +++ b/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala @@ -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 diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterRoundRobinRoutedActorSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterRoundRobinRoutedActorSpec.scala index 7148b4ee9f..9cfd120a0e 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterRoundRobinRoutedActorSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterRoundRobinRoutedActorSpec.scala @@ -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)