Merge branch 'master' into wip-sync-artery-patriknw
This commit is contained in:
commit
839ec5f167
757 changed files with 9166 additions and 6642 deletions
|
|
@ -39,7 +39,7 @@ abstract class DeterministicOldestWhenJoiningSpec
|
|||
// reverse order because that expose the bug in issue #18554
|
||||
def seedNodes: immutable.IndexedSeq[Address] =
|
||||
Vector(address(seed1), address(seed2), address(seed3)).sorted(Member.addressOrdering).reverse
|
||||
val roleByAddress = Map(address(seed1) -> seed1, address(seed2) -> seed2, address(seed3) -> seed3)
|
||||
val roleByAddress = Map(address(seed1) → seed1, address(seed2) → seed2, address(seed3) → seed3)
|
||||
|
||||
"Joining a cluster" must {
|
||||
"result in deterministic oldest node" taggedAs LongRunningTest in {
|
||||
|
|
|
|||
|
|
@ -96,7 +96,8 @@ trait MultiNodeClusterSpec extends Suite with STMultiNodeSpec with WatchedByCoro
|
|||
|
||||
def muteLog(sys: ActorSystem = system): Unit = {
|
||||
if (!sys.log.isDebugEnabled) {
|
||||
Seq(".*Metrics collection has started successfully.*",
|
||||
Seq(
|
||||
".*Metrics collection has started successfully.*",
|
||||
".*Metrics will be retreived from MBeans.*",
|
||||
".*Cluster Node.* - registered cluster JMX MBean.*",
|
||||
".*Cluster Node.* - is starting up.*",
|
||||
|
|
@ -272,7 +273,8 @@ trait MultiNodeClusterSpec extends Suite with STMultiNodeSpec with WatchedByCoro
|
|||
val expectedLeader = roleOfLeader(nodesInCluster)
|
||||
val leader = clusterView.leader
|
||||
val isLeader = leader == Some(clusterView.selfAddress)
|
||||
assert(isLeader == isNode(expectedLeader),
|
||||
assert(
|
||||
isLeader == isNode(expectedLeader),
|
||||
"expectedLeader [%s], got leader [%s], members [%s]".format(expectedLeader, leader, clusterView.members))
|
||||
clusterView.status should (be(MemberStatus.Up) or be(MemberStatus.Leaving))
|
||||
}
|
||||
|
|
@ -282,9 +284,9 @@ trait MultiNodeClusterSpec extends Suite with STMultiNodeSpec with WatchedByCoro
|
|||
* Also asserts that nodes in the 'canNotBePartOfMemberRing' are *not* part of the cluster ring.
|
||||
*/
|
||||
def awaitMembersUp(
|
||||
numberOfMembers: Int,
|
||||
canNotBePartOfMemberRing: Set[Address] = Set.empty,
|
||||
timeout: FiniteDuration = 25.seconds): Unit = {
|
||||
numberOfMembers: Int,
|
||||
canNotBePartOfMemberRing: Set[Address] = Set.empty,
|
||||
timeout: FiniteDuration = 25.seconds): Unit = {
|
||||
within(timeout) {
|
||||
if (!canNotBePartOfMemberRing.isEmpty) // don't run this on an empty set
|
||||
awaitAssert(canNotBePartOfMemberRing foreach (a ⇒ clusterView.members.map(_.address) should not contain (a)))
|
||||
|
|
|
|||
|
|
@ -0,0 +1,117 @@
|
|||
/**
|
||||
* Copyright (C) 2009-2016 Lightbend Inc. <http://www.lightbend.com>
|
||||
*/
|
||||
package akka.cluster
|
||||
|
||||
import scala.collection.immutable
|
||||
import scala.language.postfixOps
|
||||
import scala.concurrent.duration._
|
||||
import akka.actor.Address
|
||||
import akka.cluster.MemberStatus._
|
||||
import akka.remote.testkit.MultiNodeConfig
|
||||
import akka.remote.testkit.MultiNodeSpec
|
||||
import akka.testkit._
|
||||
import com.typesafe.config.ConfigFactory
|
||||
import org.scalatest.BeforeAndAfter
|
||||
import akka.actor.ActorSystem
|
||||
import akka.actor.ActorRef
|
||||
import akka.event.Logging.Info
|
||||
import akka.actor.Actor
|
||||
import akka.actor.Props
|
||||
import java.util.concurrent.ThreadLocalRandom
|
||||
|
||||
// This test was a reproducer for issue #20639
|
||||
object QuickRestartMultiJvmSpec extends MultiNodeConfig {
|
||||
val first = role("first")
|
||||
val second = role("second")
|
||||
val third = role("third")
|
||||
|
||||
commonConfig(debugConfig(on = false).
|
||||
withFallback(ConfigFactory.parseString("""
|
||||
akka.cluster.auto-down-unreachable-after = off
|
||||
""")).
|
||||
withFallback(MultiNodeClusterSpec.clusterConfig))
|
||||
|
||||
}
|
||||
|
||||
class QuickRestartMultiJvmNode1 extends QuickRestartSpec
|
||||
class QuickRestartMultiJvmNode2 extends QuickRestartSpec
|
||||
class QuickRestartMultiJvmNode3 extends QuickRestartSpec
|
||||
|
||||
abstract class QuickRestartSpec
|
||||
extends MultiNodeSpec(QuickRestartMultiJvmSpec)
|
||||
with MultiNodeClusterSpec with ImplicitSender {
|
||||
|
||||
import QuickRestartMultiJvmSpec._
|
||||
|
||||
def seedNodes: immutable.IndexedSeq[Address] = Vector(first, second, third)
|
||||
|
||||
val rounds = 3
|
||||
|
||||
override def expectedTestDuration: FiniteDuration = 45.seconds * rounds
|
||||
|
||||
"Quickly restarting node" must {
|
||||
"setup stable nodes" taggedAs LongRunningTest in within(15.seconds) {
|
||||
cluster.joinSeedNodes(seedNodes)
|
||||
awaitMembersUp(roles.size)
|
||||
enterBarrier("stable")
|
||||
}
|
||||
|
||||
"join and restart" taggedAs LongRunningTest in {
|
||||
val totalNumberOfNodes = roles.size + 1
|
||||
var restartingSystem: ActorSystem = null // only used on second
|
||||
for (n ← 1 to rounds) {
|
||||
log.info("round-" + n)
|
||||
runOn(second) {
|
||||
restartingSystem =
|
||||
if (restartingSystem == null)
|
||||
ActorSystem(system.name,
|
||||
ConfigFactory.parseString(s"akka.cluster.roles = [round-$n]")
|
||||
.withFallback(system.settings.config))
|
||||
else
|
||||
ActorSystem(system.name,
|
||||
ConfigFactory.parseString(s"""
|
||||
akka.cluster.roles = [round-$n]
|
||||
akka.remote.netty.tcp.port = ${Cluster(restartingSystem).selfAddress.port.get}""") // same port
|
||||
.withFallback(system.settings.config))
|
||||
log.info("Restarting node has address: {}", Cluster(restartingSystem).selfUniqueAddress)
|
||||
Cluster(restartingSystem).joinSeedNodes(seedNodes)
|
||||
within(20.seconds) {
|
||||
awaitAssert {
|
||||
Cluster(restartingSystem).state.members.size should ===(totalNumberOfNodes)
|
||||
Cluster(restartingSystem).state.members.map(_.status == MemberStatus.Up)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enterBarrier("joined-" + n)
|
||||
within(20.seconds) {
|
||||
awaitAssert {
|
||||
Cluster(system).state.members.size should ===(totalNumberOfNodes)
|
||||
Cluster(system).state.members.map(_.status == MemberStatus.Up)
|
||||
// use the role to test that it is the new incarnation that joined, sneaky
|
||||
Cluster(system).state.members.flatMap(_.roles) should ===(Set(s"round-$n"))
|
||||
}
|
||||
}
|
||||
enterBarrier("members-up-" + n)
|
||||
|
||||
// gating occurred after a while
|
||||
if (n > 1)
|
||||
Thread.sleep(ThreadLocalRandom.current().nextInt(15) * 1000)
|
||||
|
||||
Cluster(system).state.members.size should ===(totalNumberOfNodes)
|
||||
Cluster(system).state.members.map(_.status == MemberStatus.Up)
|
||||
Cluster(system).state.unreachable should ===(Set())
|
||||
|
||||
enterBarrier("before-terminate-" + n)
|
||||
runOn(second) {
|
||||
restartingSystem.terminate().await
|
||||
}
|
||||
// don't wait for it to be removed, new incarnation will join in next round
|
||||
enterBarrier("terminated-" + n)
|
||||
log.info("end of round-" + n)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -50,7 +50,8 @@ abstract class RestartFirstSeedNodeSpec
|
|||
def missingSeed = address(seed3).copy(port = Some(61313))
|
||||
def seedNodes: immutable.IndexedSeq[Address] = Vector(seedNode1Address, seed2, seed3, missingSeed)
|
||||
|
||||
lazy val restartedSeed1System = ActorSystem(system.name,
|
||||
lazy val restartedSeed1System = ActorSystem(
|
||||
system.name,
|
||||
ConfigFactory.parseString("akka.remote.netty.tcp.port=" + seedNodes.head.port.get).
|
||||
withFallback(system.settings.config))
|
||||
|
||||
|
|
|
|||
|
|
@ -52,7 +52,8 @@ abstract class RestartNode2SpecSpec
|
|||
def seedNodes: immutable.IndexedSeq[Address] = Vector(seedNode1Address, seed2)
|
||||
|
||||
// this is the node that will attempt to re-join, keep gate times low so it can retry quickly
|
||||
lazy val restartedSeed1System = ActorSystem(system.name,
|
||||
lazy val restartedSeed1System = ActorSystem(
|
||||
system.name,
|
||||
ConfigFactory.parseString(
|
||||
s"""
|
||||
akka.remote.netty.tcp.port= ${seedNodes.head.port.get}
|
||||
|
|
|
|||
|
|
@ -48,7 +48,8 @@ abstract class RestartNode3Spec
|
|||
|
||||
def seedNodes: immutable.IndexedSeq[Address] = Vector(first)
|
||||
|
||||
lazy val restartedSecondSystem = ActorSystem(system.name,
|
||||
lazy val restartedSecondSystem = ActorSystem(
|
||||
system.name,
|
||||
ConfigFactory.parseString("akka.remote.netty.tcp.port=" + secondUniqueAddress.address.port.get).
|
||||
withFallback(system.settings.config))
|
||||
|
||||
|
|
|
|||
|
|
@ -69,7 +69,8 @@ abstract class RestartNodeSpec
|
|||
|
||||
def seedNodes: immutable.IndexedSeq[Address] = Vector(first, secondUniqueAddress.address, third)
|
||||
|
||||
lazy val restartedSecondSystem = ActorSystem(system.name,
|
||||
lazy val restartedSecondSystem = ActorSystem(
|
||||
system.name,
|
||||
ConfigFactory.parseString("akka.remote.netty.tcp.port=" + secondUniqueAddress.address.port.get).
|
||||
withFallback(system.settings.config))
|
||||
|
||||
|
|
|
|||
|
|
@ -208,13 +208,15 @@ private[cluster] object StressMultiJvmSpec extends MultiNodeConfig {
|
|||
val convergenceWithinFactor = getDouble("convergence-within-factor")
|
||||
val exerciseActors = getBoolean("exercise-actors")
|
||||
|
||||
require(numberOfSeedNodes + numberOfNodesJoiningToSeedNodesInitially + numberOfNodesJoiningOneByOneSmall +
|
||||
numberOfNodesJoiningOneByOneLarge + numberOfNodesJoiningToOneNode + numberOfNodesJoiningToSeedNodes <= totalNumberOfNodes,
|
||||
require(
|
||||
numberOfSeedNodes + numberOfNodesJoiningToSeedNodesInitially + numberOfNodesJoiningOneByOneSmall +
|
||||
numberOfNodesJoiningOneByOneLarge + numberOfNodesJoiningToOneNode + numberOfNodesJoiningToSeedNodes <= totalNumberOfNodes,
|
||||
s"specified number of joining nodes <= ${totalNumberOfNodes}")
|
||||
|
||||
// don't shutdown the 3 nodes hosting the master actors
|
||||
require(numberOfNodesLeavingOneByOneSmall + numberOfNodesLeavingOneByOneLarge + numberOfNodesLeaving +
|
||||
numberOfNodesShutdownOneByOneSmall + numberOfNodesShutdownOneByOneLarge + numberOfNodesShutdown <= totalNumberOfNodes - 3,
|
||||
require(
|
||||
numberOfNodesLeavingOneByOneSmall + numberOfNodesLeavingOneByOneLarge + numberOfNodesLeaving +
|
||||
numberOfNodesShutdownOneByOneSmall + numberOfNodesShutdownOneByOneLarge + numberOfNodesShutdown <= totalNumberOfNodes - 3,
|
||||
s"specified number of leaving/shutdown nodes <= ${totalNumberOfNodes - 3}")
|
||||
|
||||
require(numberOfNodesJoinRemove <= totalNumberOfNodes, s"nr-of-nodes-join-remove should be <= ${totalNumberOfNodes}")
|
||||
|
|
@ -229,8 +231,8 @@ private[cluster] object StressMultiJvmSpec extends MultiNodeConfig {
|
|||
}
|
||||
|
||||
final case class ClusterResult(
|
||||
address: Address,
|
||||
duration: Duration,
|
||||
address: Address,
|
||||
duration: Duration,
|
||||
clusterStats: GossipStats)
|
||||
|
||||
final case class AggregatedClusterResult(title: String, duration: Duration, clusterStats: GossipStats)
|
||||
|
|
@ -271,8 +273,8 @@ private[cluster] object StressMultiJvmSpec extends MultiNodeConfig {
|
|||
|
||||
def receive = {
|
||||
case ClusterMetricsChanged(clusterMetrics) ⇒ nodeMetrics = clusterMetrics
|
||||
case PhiResult(from, phiValues) ⇒ phiValuesObservedByNode += from -> phiValues
|
||||
case StatsResult(from, stats) ⇒ clusterStatsObservedByNode += from -> stats
|
||||
case PhiResult(from, phiValues) ⇒ phiValuesObservedByNode += from → phiValues
|
||||
case StatsResult(from, stats) ⇒ clusterStatsObservedByNode += from → stats
|
||||
case ReportTick ⇒
|
||||
if (infolog)
|
||||
log.info(s"[${title}] in progress\n${formatMetrics}\n\n${formatPhi}\n\n${formatStats}")
|
||||
|
|
@ -412,7 +414,7 @@ private[cluster] object StressMultiJvmSpec extends MultiNodeConfig {
|
|||
val φ = phi(node)
|
||||
if (φ > 0 || cluster.failureDetector.isMonitoring(node)) {
|
||||
val aboveOne = if (!φ.isInfinite && φ > 1.0) 1 else 0
|
||||
phiByNode += node -> PhiValue(node, previous.countAboveOne + aboveOne, previous.count + 1,
|
||||
phiByNode += node → PhiValue(node, previous.countAboveOne + aboveOne, previous.count + 1,
|
||||
math.max(previous.max, φ))
|
||||
}
|
||||
}
|
||||
|
|
@ -561,7 +563,7 @@ private[cluster] object StressMultiJvmSpec extends MultiNodeConfig {
|
|||
}
|
||||
|
||||
def send(job: Job): Unit = {
|
||||
outstanding += job.id -> JobState(Deadline.now + retryTimeout, job)
|
||||
outstanding += job.id → JobState(Deadline.now + retryTimeout, job)
|
||||
sendCounter += 1
|
||||
workers ! job
|
||||
}
|
||||
|
|
@ -576,7 +578,8 @@ private[cluster] object StressMultiJvmSpec extends MultiNodeConfig {
|
|||
case TreeJob(id, payload, idx, levels, width) ⇒
|
||||
// create the actors when first TreeJob message is received
|
||||
val totalActors = ((width * math.pow(width, levels) - 1) / (width - 1)).toInt
|
||||
log.debug("Creating [{}] actors in a tree structure of [{}] levels and each actor has [{}] children",
|
||||
log.debug(
|
||||
"Creating [{}] actors in a tree structure of [{}] levels and each actor has [{}] children",
|
||||
totalActors, levels, width)
|
||||
val tree = context.actorOf(Props(classOf[TreeNode], levels, width), "tree")
|
||||
tree forward ((idx, SimpleJob(id, payload)))
|
||||
|
|
@ -633,7 +636,8 @@ private[cluster] object StressMultiJvmSpec extends MultiNodeConfig {
|
|||
case e: Exception ⇒ context.children foreach { _ ! e }
|
||||
case GetChildrenCount ⇒ sender() ! ChildrenCount(context.children.size, restartCount)
|
||||
case Reset ⇒
|
||||
require(context.children.isEmpty,
|
||||
require(
|
||||
context.children.isEmpty,
|
||||
s"ResetChildrenCount not allowed when children exists, [${context.children.size}]")
|
||||
restartCount = 0
|
||||
}
|
||||
|
|
@ -772,7 +776,8 @@ abstract class StressSpec
|
|||
|
||||
def createResultAggregator(title: String, expectedResults: Int, includeInHistory: Boolean): Unit = {
|
||||
runOn(roles.head) {
|
||||
val aggregator = system.actorOf(Props(classOf[ClusterResultAggregator], title, expectedResults, settings).withDeploy(Deploy.local),
|
||||
val aggregator = system.actorOf(
|
||||
Props(classOf[ClusterResultAggregator], title, expectedResults, settings).withDeploy(Deploy.local),
|
||||
name = "result" + step)
|
||||
if (includeInHistory && infolog) aggregator ! ReportTo(Some(clusterResultHistory))
|
||||
else aggregator ! ReportTo(None)
|
||||
|
|
@ -1027,7 +1032,8 @@ abstract class StressSpec
|
|||
val (masterRoles, otherRoles) = roles.take(nbrUsedRoles).splitAt(3)
|
||||
runOn(masterRoles: _*) {
|
||||
reportResult {
|
||||
val m = system.actorOf(Props(classOf[Master], settings, batchInterval, tree).withDeploy(Deploy.local),
|
||||
val m = system.actorOf(
|
||||
Props(classOf[Master], settings, batchInterval, tree).withDeploy(Deploy.local),
|
||||
name = masterName)
|
||||
m ! Begin
|
||||
import system.dispatcher
|
||||
|
|
@ -1155,7 +1161,8 @@ abstract class StressSpec
|
|||
|
||||
"start routers that are running while nodes are joining" taggedAs LongRunningTest in {
|
||||
runOn(roles.take(3): _*) {
|
||||
system.actorOf(Props(classOf[Master], settings, settings.workBatchInterval, false).withDeploy(Deploy.local),
|
||||
system.actorOf(
|
||||
Props(classOf[Master], settings, settings.workBatchInterval, false).withDeploy(Deploy.local),
|
||||
name = masterName) ! Begin
|
||||
}
|
||||
}
|
||||
|
|
@ -1253,7 +1260,8 @@ abstract class StressSpec
|
|||
"start routers that are running while nodes are removed" taggedAs LongRunningTest in {
|
||||
if (exerciseActors) {
|
||||
runOn(roles.take(3): _*) {
|
||||
system.actorOf(Props(classOf[Master], settings, settings.workBatchInterval, false).withDeploy(Deploy.local),
|
||||
system.actorOf(
|
||||
Props(classOf[Master], settings, settings.workBatchInterval, false).withDeploy(Deploy.local),
|
||||
name = masterName) ! Begin
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -99,11 +99,11 @@ abstract class AdaptiveLoadBalancingRouterSpec extends MultiNodeSpec(AdaptiveLoa
|
|||
Await.result(router ? GetRoutees, timeout.duration).asInstanceOf[Routees].routees
|
||||
|
||||
def receiveReplies(expectedReplies: Int): Map[Address, Int] = {
|
||||
val zero = Map.empty[Address, Int] ++ roles.map(address(_) -> 0)
|
||||
val zero = Map.empty[Address, Int] ++ roles.map(address(_) → 0)
|
||||
(receiveWhile(5 seconds, messages = expectedReplies) {
|
||||
case Reply(address) ⇒ address
|
||||
}).foldLeft(zero) {
|
||||
case (replyMap, address) ⇒ replyMap + (address -> (replyMap(address) + 1))
|
||||
case (replyMap, address) ⇒ replyMap + (address → (replyMap(address) + 1))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -116,10 +116,11 @@ abstract class AdaptiveLoadBalancingRouterSpec extends MultiNodeSpec(AdaptiveLoa
|
|||
}
|
||||
|
||||
def startRouter(name: String): ActorRef = {
|
||||
val router = system.actorOf(ClusterRouterPool(
|
||||
local = AdaptiveLoadBalancingPool(HeapMetricsSelector),
|
||||
settings = ClusterRouterPoolSettings(totalInstances = 10, maxInstancesPerNode = 1, allowLocalRoutees = true, useRole = None)).
|
||||
props(Props[Echo]),
|
||||
val router = system.actorOf(
|
||||
ClusterRouterPool(
|
||||
local = AdaptiveLoadBalancingPool(HeapMetricsSelector),
|
||||
settings = ClusterRouterPoolSettings(totalInstances = 10, maxInstancesPerNode = 1, allowLocalRoutees = true, useRole = None)).
|
||||
props(Props[Echo]),
|
||||
name)
|
||||
// it may take some time until router receives cluster member events
|
||||
awaitAssert { currentRoutees(router).size should ===(roles.size) }
|
||||
|
|
|
|||
|
|
@ -73,8 +73,10 @@ abstract class ClusterConsistentHashingGroupSpec extends MultiNodeSpec(ClusterCo
|
|||
case s: String ⇒ s
|
||||
}
|
||||
val paths = List("/user/dest")
|
||||
val router = system.actorOf(ClusterRouterGroup(local = ConsistentHashingGroup(paths, hashMapping = hashMapping),
|
||||
settings = ClusterRouterGroupSettings(totalInstances = 10, paths, allowLocalRoutees = true, useRole = None)).props(),
|
||||
val router = system.actorOf(
|
||||
ClusterRouterGroup(
|
||||
local = ConsistentHashingGroup(paths, hashMapping = hashMapping),
|
||||
settings = ClusterRouterGroupSettings(totalInstances = 10, paths, allowLocalRoutees = true, useRole = None)).props(),
|
||||
"router")
|
||||
// it may take some time until router receives cluster member events
|
||||
awaitAssert { currentRoutees(router).size should ===(3) }
|
||||
|
|
|
|||
|
|
@ -121,9 +121,11 @@ abstract class ClusterConsistentHashingRouterSpec extends MultiNodeSpec(ClusterC
|
|||
|
||||
"deploy programatically defined routees to the member nodes in the cluster" taggedAs LongRunningTest in {
|
||||
runOn(first) {
|
||||
val router2 = system.actorOf(ClusterRouterPool(local = ConsistentHashingPool(nrOfInstances = 0),
|
||||
settings = ClusterRouterPoolSettings(totalInstances = 10, maxInstancesPerNode = 2, allowLocalRoutees = true, useRole = None)).
|
||||
props(Props[Echo]),
|
||||
val router2 = system.actorOf(
|
||||
ClusterRouterPool(
|
||||
local = ConsistentHashingPool(nrOfInstances = 0),
|
||||
settings = ClusterRouterPoolSettings(totalInstances = 10, maxInstancesPerNode = 2, allowLocalRoutees = true, useRole = None)).
|
||||
props(Props[Echo]),
|
||||
"router2")
|
||||
// it may take some time until router receives cluster member events
|
||||
awaitAssert { currentRoutees(router2).size should ===(6) }
|
||||
|
|
@ -154,10 +156,11 @@ abstract class ClusterConsistentHashingRouterSpec extends MultiNodeSpec(ClusterC
|
|||
case s: String ⇒ s
|
||||
}
|
||||
|
||||
val router4 = system.actorOf(ClusterRouterPool(
|
||||
local = ConsistentHashingPool(nrOfInstances = 0, hashMapping = hashMapping),
|
||||
settings = ClusterRouterPoolSettings(totalInstances = 10, maxInstancesPerNode = 1, allowLocalRoutees = true, useRole = None)).
|
||||
props(Props[Echo]),
|
||||
val router4 = system.actorOf(
|
||||
ClusterRouterPool(
|
||||
local = ConsistentHashingPool(nrOfInstances = 0, hashMapping = hashMapping),
|
||||
settings = ClusterRouterPoolSettings(totalInstances = 10, maxInstancesPerNode = 1, allowLocalRoutees = true, useRole = None)).
|
||||
props(Props[Echo]),
|
||||
"router4")
|
||||
|
||||
assertHashMapping(router4)
|
||||
|
|
|
|||
|
|
@ -103,20 +103,22 @@ abstract class ClusterRoundRobinSpec extends MultiNodeSpec(ClusterRoundRobinMult
|
|||
import ClusterRoundRobinMultiJvmSpec._
|
||||
|
||||
lazy val router1 = system.actorOf(FromConfig.props(Props[SomeActor]), "router1")
|
||||
lazy val router2 = system.actorOf(ClusterRouterPool(RoundRobinPool(nrOfInstances = 0),
|
||||
ClusterRouterPoolSettings(totalInstances = 3, maxInstancesPerNode = 1, allowLocalRoutees = true, useRole = None)).
|
||||
props(Props[SomeActor]),
|
||||
lazy val router2 = system.actorOf(
|
||||
ClusterRouterPool(
|
||||
RoundRobinPool(nrOfInstances = 0),
|
||||
ClusterRouterPoolSettings(totalInstances = 3, maxInstancesPerNode = 1, allowLocalRoutees = true, useRole = None)).
|
||||
props(Props[SomeActor]),
|
||||
"router2")
|
||||
lazy val router3 = system.actorOf(FromConfig.props(Props[SomeActor]), "router3")
|
||||
lazy val router4 = system.actorOf(FromConfig.props(), "router4")
|
||||
lazy val router5 = system.actorOf(RoundRobinPool(nrOfInstances = 0).props(Props[SomeActor]), "router5")
|
||||
|
||||
def receiveReplies(routeeType: RouteeType, expectedReplies: Int): Map[Address, Int] = {
|
||||
val zero = Map.empty[Address, Int] ++ roles.map(address(_) -> 0)
|
||||
val zero = Map.empty[Address, Int] ++ roles.map(address(_) → 0)
|
||||
(receiveWhile(5 seconds, messages = expectedReplies) {
|
||||
case Reply(`routeeType`, ref) ⇒ fullAddress(ref)
|
||||
}).foldLeft(zero) {
|
||||
case (replyMap, address) ⇒ replyMap + (address -> (replyMap(address) + 1))
|
||||
case (replyMap, address) ⇒ replyMap + (address → (replyMap(address) + 1))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -63,11 +63,11 @@ abstract class UseRoleIgnoredSpec extends MultiNodeSpec(UseRoleIgnoredMultiJvmSp
|
|||
import akka.cluster.routing.UseRoleIgnoredMultiJvmSpec._
|
||||
|
||||
def receiveReplies(routeeType: RouteeType, expectedReplies: Int): Map[Address, Int] = {
|
||||
val zero = Map.empty[Address, Int] ++ roles.map(address(_) -> 0)
|
||||
val zero = Map.empty[Address, Int] ++ roles.map(address(_) → 0)
|
||||
(receiveWhile(5 seconds, messages = expectedReplies) {
|
||||
case Reply(`routeeType`, ref) ⇒ fullAddress(ref)
|
||||
}).foldLeft(zero) {
|
||||
case (replyMap, address) ⇒ replyMap + (address -> (replyMap(address) + 1))
|
||||
case (replyMap, address) ⇒ replyMap + (address → (replyMap(address) + 1))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -101,10 +101,11 @@ abstract class UseRoleIgnoredSpec extends MultiNodeSpec(UseRoleIgnoredMultiJvmSp
|
|||
runOn(first) {
|
||||
val role = Some("b")
|
||||
|
||||
val router = system.actorOf(ClusterRouterPool(
|
||||
RoundRobinPool(nrOfInstances = 6),
|
||||
ClusterRouterPoolSettings(totalInstances = 6, maxInstancesPerNode = 2, allowLocalRoutees = false, useRole = role)).
|
||||
props(Props[SomeActor]),
|
||||
val router = system.actorOf(
|
||||
ClusterRouterPool(
|
||||
RoundRobinPool(nrOfInstances = 6),
|
||||
ClusterRouterPoolSettings(totalInstances = 6, maxInstancesPerNode = 2, allowLocalRoutees = false, useRole = role)).
|
||||
props(Props[SomeActor]),
|
||||
"router-2")
|
||||
|
||||
awaitAssert(currentRoutees(router).size should ===(4))
|
||||
|
|
@ -130,7 +131,8 @@ abstract class UseRoleIgnoredSpec extends MultiNodeSpec(UseRoleIgnoredMultiJvmSp
|
|||
runOn(first) {
|
||||
val role = Some("b")
|
||||
|
||||
val router = system.actorOf(ClusterRouterGroup(
|
||||
val router = system.actorOf(
|
||||
ClusterRouterGroup(
|
||||
RoundRobinGroup(paths = Nil),
|
||||
ClusterRouterGroupSettings(totalInstances = 6, routeesPaths = List("/user/foo", "/user/bar"),
|
||||
allowLocalRoutees = false, useRole = role)).props,
|
||||
|
|
@ -159,10 +161,11 @@ abstract class UseRoleIgnoredSpec extends MultiNodeSpec(UseRoleIgnoredMultiJvmSp
|
|||
runOn(first) {
|
||||
val role = Some("b")
|
||||
|
||||
val router = system.actorOf(ClusterRouterPool(
|
||||
RoundRobinPool(nrOfInstances = 6),
|
||||
ClusterRouterPoolSettings(totalInstances = 6, maxInstancesPerNode = 2, allowLocalRoutees = true, useRole = role)).
|
||||
props(Props[SomeActor]),
|
||||
val router = system.actorOf(
|
||||
ClusterRouterPool(
|
||||
RoundRobinPool(nrOfInstances = 6),
|
||||
ClusterRouterPoolSettings(totalInstances = 6, maxInstancesPerNode = 2, allowLocalRoutees = true, useRole = role)).
|
||||
props(Props[SomeActor]),
|
||||
"router-3")
|
||||
|
||||
awaitAssert(currentRoutees(router).size should ===(4))
|
||||
|
|
@ -188,7 +191,8 @@ abstract class UseRoleIgnoredSpec extends MultiNodeSpec(UseRoleIgnoredMultiJvmSp
|
|||
runOn(first) {
|
||||
val role = Some("b")
|
||||
|
||||
val router = system.actorOf(ClusterRouterGroup(
|
||||
val router = system.actorOf(
|
||||
ClusterRouterGroup(
|
||||
RoundRobinGroup(paths = Nil),
|
||||
ClusterRouterGroupSettings(totalInstances = 6, routeesPaths = List("/user/foo", "/user/bar"),
|
||||
allowLocalRoutees = true, useRole = role)).props,
|
||||
|
|
@ -217,10 +221,11 @@ abstract class UseRoleIgnoredSpec extends MultiNodeSpec(UseRoleIgnoredMultiJvmSp
|
|||
runOn(first) {
|
||||
val role = Some("a")
|
||||
|
||||
val router = system.actorOf(ClusterRouterPool(
|
||||
RoundRobinPool(nrOfInstances = 6),
|
||||
ClusterRouterPoolSettings(totalInstances = 6, maxInstancesPerNode = 2, allowLocalRoutees = true, useRole = role)).
|
||||
props(Props[SomeActor]),
|
||||
val router = system.actorOf(
|
||||
ClusterRouterPool(
|
||||
RoundRobinPool(nrOfInstances = 6),
|
||||
ClusterRouterPoolSettings(totalInstances = 6, maxInstancesPerNode = 2, allowLocalRoutees = true, useRole = role)).
|
||||
props(Props[SomeActor]),
|
||||
"router-4")
|
||||
|
||||
awaitAssert(currentRoutees(router).size should ===(2))
|
||||
|
|
@ -246,7 +251,8 @@ abstract class UseRoleIgnoredSpec extends MultiNodeSpec(UseRoleIgnoredMultiJvmSp
|
|||
runOn(first) {
|
||||
val role = Some("a")
|
||||
|
||||
val router = system.actorOf(ClusterRouterGroup(
|
||||
val router = system.actorOf(
|
||||
ClusterRouterGroup(
|
||||
RoundRobinGroup(paths = Nil),
|
||||
ClusterRouterGroupSettings(totalInstances = 6, routeesPaths = List("/user/foo", "/user/bar"),
|
||||
allowLocalRoutees = true, useRole = role)).props,
|
||||
|
|
@ -275,10 +281,11 @@ abstract class UseRoleIgnoredSpec extends MultiNodeSpec(UseRoleIgnoredMultiJvmSp
|
|||
runOn(first) {
|
||||
val role = Some("c")
|
||||
|
||||
val router = system.actorOf(ClusterRouterPool(
|
||||
RoundRobinPool(nrOfInstances = 6),
|
||||
ClusterRouterPoolSettings(totalInstances = 6, maxInstancesPerNode = 2, allowLocalRoutees = true, useRole = role)).
|
||||
props(Props[SomeActor]),
|
||||
val router = system.actorOf(
|
||||
ClusterRouterPool(
|
||||
RoundRobinPool(nrOfInstances = 6),
|
||||
ClusterRouterPoolSettings(totalInstances = 6, maxInstancesPerNode = 2, allowLocalRoutees = true, useRole = role)).
|
||||
props(Props[SomeActor]),
|
||||
"router-5")
|
||||
|
||||
awaitAssert(currentRoutees(router).size should ===(6))
|
||||
|
|
@ -304,7 +311,8 @@ abstract class UseRoleIgnoredSpec extends MultiNodeSpec(UseRoleIgnoredMultiJvmSp
|
|||
runOn(first) {
|
||||
val role = Some("c")
|
||||
|
||||
val router = system.actorOf(ClusterRouterGroup(
|
||||
val router = system.actorOf(
|
||||
ClusterRouterGroup(
|
||||
RoundRobinGroup(paths = Nil),
|
||||
ClusterRouterGroupSettings(totalInstances = 6, routeesPaths = List("/user/foo", "/user/bar"),
|
||||
allowLocalRoutees = true, useRole = role)).props,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue