2012-03-22 16:23:36 +01:00
|
|
|
/**
|
|
|
|
|
* Copyright (C) 2009-2012 Typesafe Inc. <http://www.typesafe.com>
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
package akka.cluster
|
|
|
|
|
|
2012-05-24 17:08:28 +02:00
|
|
|
import org.scalatest.BeforeAndAfter
|
2012-05-24 16:31:43 +02:00
|
|
|
import com.typesafe.config.ConfigFactory
|
2012-05-24 17:08:28 +02:00
|
|
|
import akka.remote.testkit.MultiNodeConfig
|
|
|
|
|
import akka.remote.testkit.MultiNodeSpec
|
|
|
|
|
import akka.testkit.ImplicitSender
|
|
|
|
|
|
|
|
|
|
object JoinTwoClustersMultiJvmSpec extends MultiNodeConfig {
|
|
|
|
|
val a1 = role("a1")
|
|
|
|
|
val a2 = role("a2")
|
|
|
|
|
val b1 = role("b1")
|
|
|
|
|
val b2 = role("b2")
|
|
|
|
|
val c1 = role("c1")
|
|
|
|
|
val c2 = role("c2")
|
|
|
|
|
|
|
|
|
|
commonConfig(debugConfig(on = false).withFallback(ConfigFactory.parseString("""
|
|
|
|
|
akka.cluster {
|
|
|
|
|
gossip-frequency = 200 ms
|
|
|
|
|
leader-actions-frequency = 200 ms
|
|
|
|
|
periodic-tasks-initial-delay = 300 ms
|
|
|
|
|
}
|
|
|
|
|
""")))
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class JoinTwoClustersMultiJvmNode1 extends JoinTwoClustersSpec
|
|
|
|
|
class JoinTwoClustersMultiJvmNode2 extends JoinTwoClustersSpec
|
|
|
|
|
class JoinTwoClustersMultiJvmNode3 extends JoinTwoClustersSpec
|
|
|
|
|
class JoinTwoClustersMultiJvmNode4 extends JoinTwoClustersSpec
|
|
|
|
|
class JoinTwoClustersMultiJvmNode5 extends JoinTwoClustersSpec
|
|
|
|
|
class JoinTwoClustersMultiJvmNode6 extends JoinTwoClustersSpec
|
|
|
|
|
|
|
|
|
|
abstract class JoinTwoClustersSpec extends MultiNodeSpec(JoinTwoClustersMultiJvmSpec) with ImplicitSender with BeforeAndAfter {
|
|
|
|
|
import JoinTwoClustersMultiJvmSpec._
|
|
|
|
|
|
|
|
|
|
override def initialParticipants = 6
|
2012-03-22 16:23:36 +01:00
|
|
|
|
2012-05-25 08:32:42 +02:00
|
|
|
def cluster: Cluster = Cluster(system)
|
2012-05-24 17:08:28 +02:00
|
|
|
|
|
|
|
|
after {
|
|
|
|
|
testConductor.enter("after")
|
|
|
|
|
}
|
|
|
|
|
|
2012-05-25 08:32:42 +02:00
|
|
|
val a1Address = node(a1).address
|
|
|
|
|
val b1Address = node(b1).address
|
|
|
|
|
val c1Address = node(c1).address
|
2012-05-24 17:08:28 +02:00
|
|
|
|
|
|
|
|
def awaitUpConvergence(numberOfMembers: Int): Unit = {
|
2012-05-25 08:32:42 +02:00
|
|
|
awaitCond(cluster.latestGossip.members.size == numberOfMembers)
|
|
|
|
|
awaitCond(cluster.latestGossip.members.forall(_.status == MemberStatus.Up))
|
|
|
|
|
awaitCond(cluster.convergence.isDefined)
|
2012-05-24 17:08:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
"Three different clusters (A, B and C)" must {
|
|
|
|
|
|
|
|
|
|
"be able to 'elect' a single leader after joining (A -> B)" in {
|
|
|
|
|
|
|
|
|
|
runOn(a1, a2) {
|
2012-05-25 08:32:42 +02:00
|
|
|
cluster.join(a1Address)
|
2012-05-24 17:08:28 +02:00
|
|
|
}
|
|
|
|
|
runOn(b1, b2) {
|
2012-05-25 08:32:42 +02:00
|
|
|
cluster.join(b1Address)
|
2012-03-22 16:23:36 +01:00
|
|
|
}
|
2012-05-24 17:08:28 +02:00
|
|
|
runOn(c1, c2) {
|
2012-05-25 08:32:42 +02:00
|
|
|
cluster.join(c1Address)
|
2012-05-24 17:08:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
awaitUpConvergence(numberOfMembers = 2)
|
2012-03-22 16:23:36 +01:00
|
|
|
|
2012-05-25 08:32:42 +02:00
|
|
|
cluster.isLeader must be(ifNode(a1, b1, c1)(true)(false))
|
2012-03-22 16:23:36 +01:00
|
|
|
|
2012-05-24 17:08:28 +02:00
|
|
|
runOn(b2) {
|
2012-05-25 08:32:42 +02:00
|
|
|
cluster.join(a1Address)
|
2012-05-24 17:08:28 +02:00
|
|
|
}
|
2012-03-22 16:23:36 +01:00
|
|
|
|
2012-05-24 17:08:28 +02:00
|
|
|
runOn(a1, a2, b1, b2) {
|
|
|
|
|
awaitUpConvergence(numberOfMembers = 4)
|
|
|
|
|
}
|
2012-03-22 16:23:36 +01:00
|
|
|
|
2012-05-25 08:32:42 +02:00
|
|
|
cluster.isLeader must be(ifNode(a1, c1)(true)(false))
|
2012-03-22 16:23:36 +01:00
|
|
|
|
2012-05-24 17:08:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
"be able to 'elect' a single leader after joining (C -> A + B)" in {
|
|
|
|
|
|
|
|
|
|
runOn(b2) {
|
2012-05-25 08:32:42 +02:00
|
|
|
cluster.join(c1Address)
|
2012-05-24 17:08:28 +02:00
|
|
|
}
|
2012-03-22 16:23:36 +01:00
|
|
|
|
2012-05-24 17:08:28 +02:00
|
|
|
awaitUpConvergence(numberOfMembers = 6)
|
2012-03-22 16:23:36 +01:00
|
|
|
|
2012-05-25 08:32:42 +02:00
|
|
|
cluster.isLeader must be(ifNode(a1)(true)(false))
|
2012-05-24 17:08:28 +02:00
|
|
|
}
|
2012-03-22 16:23:36 +01:00
|
|
|
}
|
2012-05-24 17:08:28 +02:00
|
|
|
|
2012-03-22 16:23:36 +01:00
|
|
|
}
|