2012-02-14 20:40:32 +01:00
|
|
|
/**
|
2012-02-18 17:45:21 +01:00
|
|
|
* Copyright (C) 2009-2012 Typesafe Inc. <http://www.typesafe.com>
|
2012-02-14 20:40:32 +01:00
|
|
|
*/
|
|
|
|
|
package akka.cluster
|
|
|
|
|
|
|
|
|
|
import java.net.InetSocketAddress
|
|
|
|
|
|
|
|
|
|
import akka.testkit._
|
|
|
|
|
import akka.dispatch._
|
|
|
|
|
import akka.actor._
|
|
|
|
|
import akka.remote._
|
2012-02-18 17:45:21 +01:00
|
|
|
import akka.util.duration._
|
2012-02-14 20:40:32 +01:00
|
|
|
|
|
|
|
|
import com.typesafe.config._
|
|
|
|
|
|
2012-02-14 20:53:46 +01:00
|
|
|
class NodeMembershipSpec extends AkkaSpec("""
|
2012-02-14 20:40:32 +01:00
|
|
|
akka {
|
2012-03-02 09:55:54 +01:00
|
|
|
actor.provider = akka.remote.RemoteActorRefProvider
|
|
|
|
|
remote.netty.hostname = localhost
|
2012-02-18 17:45:21 +01:00
|
|
|
loglevel = "INFO"
|
2012-02-14 20:40:32 +01:00
|
|
|
}
|
|
|
|
|
""") with ImplicitSender {
|
|
|
|
|
|
2012-02-20 15:45:50 +01:00
|
|
|
var node0: Node = _
|
|
|
|
|
var node1: Node = _
|
|
|
|
|
var node2: Node = _
|
2012-02-14 20:40:32 +01:00
|
|
|
|
2012-02-20 15:45:50 +01:00
|
|
|
var system0: ActorSystemImpl = _
|
|
|
|
|
var system1: ActorSystemImpl = _
|
|
|
|
|
var system2: ActorSystemImpl = _
|
2012-02-14 20:40:32 +01:00
|
|
|
|
|
|
|
|
try {
|
2012-02-20 15:45:50 +01:00
|
|
|
"A set of connected cluster systems" must {
|
|
|
|
|
"(when two systems) start gossiping to each other so that both systems gets the same gossip info" taggedAs LongRunningTest in {
|
2012-02-18 22:14:53 +01:00
|
|
|
|
|
|
|
|
// ======= NODE 0 ========
|
2012-02-20 15:45:50 +01:00
|
|
|
system0 = ActorSystem("system0", ConfigFactory
|
2012-03-02 09:55:54 +01:00
|
|
|
.parseString("akka.remote.netty.port=5550")
|
2012-02-14 20:40:32 +01:00
|
|
|
.withFallback(system.settings.config))
|
|
|
|
|
.asInstanceOf[ActorSystemImpl]
|
2012-02-20 15:45:50 +01:00
|
|
|
val remote0 = system0.provider.asInstanceOf[RemoteActorRefProvider]
|
2012-03-02 09:55:54 +01:00
|
|
|
node0 = Node(system0)
|
2012-02-14 20:40:32 +01:00
|
|
|
|
2012-02-18 22:14:53 +01:00
|
|
|
// ======= NODE 1 ========
|
2012-02-20 15:45:50 +01:00
|
|
|
system1 = ActorSystem("system1", ConfigFactory
|
2012-02-14 20:40:32 +01:00
|
|
|
.parseString("""
|
|
|
|
|
akka {
|
2012-03-02 09:55:54 +01:00
|
|
|
remote.netty.port=5551
|
2012-02-20 15:45:50 +01:00
|
|
|
cluster.node-to-join = "akka://system0@localhost:5550"
|
2012-02-14 20:40:32 +01:00
|
|
|
}""")
|
|
|
|
|
.withFallback(system.settings.config))
|
|
|
|
|
.asInstanceOf[ActorSystemImpl]
|
2012-02-20 15:45:50 +01:00
|
|
|
val remote1 = system1.provider.asInstanceOf[RemoteActorRefProvider]
|
2012-03-02 09:55:54 +01:00
|
|
|
node1 = Node(system1)
|
2012-02-14 20:40:32 +01:00
|
|
|
|
2012-02-18 17:45:21 +01:00
|
|
|
Thread.sleep(10.seconds.dilated.toMillis)
|
2012-02-14 20:40:32 +01:00
|
|
|
|
2012-02-18 22:14:53 +01:00
|
|
|
// check cluster convergence
|
2012-02-20 15:45:50 +01:00
|
|
|
node0.convergence must be('defined)
|
|
|
|
|
node1.convergence must be('defined)
|
2012-02-18 22:14:53 +01:00
|
|
|
|
2012-02-20 15:45:50 +01:00
|
|
|
val members0 = node0.latestGossip.members.toArray
|
2012-02-14 20:40:32 +01:00
|
|
|
members0.size must be(2)
|
|
|
|
|
members0(0).address.port.get must be(5550)
|
2012-03-09 12:56:56 +01:00
|
|
|
members0(0).status must be(MemberStatus.Up)
|
2012-02-14 20:40:32 +01:00
|
|
|
members0(1).address.port.get must be(5551)
|
2012-03-09 12:56:56 +01:00
|
|
|
members0(1).status must be(MemberStatus.Up)
|
2012-02-14 20:40:32 +01:00
|
|
|
|
2012-02-20 15:45:50 +01:00
|
|
|
val members1 = node1.latestGossip.members.toArray
|
2012-02-14 20:40:32 +01:00
|
|
|
members1.size must be(2)
|
|
|
|
|
members1(0).address.port.get must be(5550)
|
2012-03-09 12:56:56 +01:00
|
|
|
members1(0).status must be(MemberStatus.Up)
|
2012-02-14 20:40:32 +01:00
|
|
|
members1(1).address.port.get must be(5551)
|
2012-03-09 12:56:56 +01:00
|
|
|
members1(1).status must be(MemberStatus.Up)
|
2012-02-14 20:40:32 +01:00
|
|
|
}
|
|
|
|
|
|
2012-03-09 12:56:56 +01:00
|
|
|
"(when three systems) start gossiping to each other so that both systems gets the same gossip info" taggedAs LongRunningTest ignore {
|
2012-02-18 22:14:53 +01:00
|
|
|
|
|
|
|
|
// ======= NODE 2 ========
|
2012-02-20 15:45:50 +01:00
|
|
|
system2 = ActorSystem("system2", ConfigFactory
|
2012-02-14 20:40:32 +01:00
|
|
|
.parseString("""
|
|
|
|
|
akka {
|
2012-03-02 09:55:54 +01:00
|
|
|
remote.netty.port=5552
|
2012-02-20 15:45:50 +01:00
|
|
|
cluster.node-to-join = "akka://system0@localhost:5550"
|
2012-02-14 20:40:32 +01:00
|
|
|
}""")
|
|
|
|
|
.withFallback(system.settings.config))
|
|
|
|
|
.asInstanceOf[ActorSystemImpl]
|
2012-02-20 15:45:50 +01:00
|
|
|
val remote2 = system2.provider.asInstanceOf[RemoteActorRefProvider]
|
2012-03-02 09:55:54 +01:00
|
|
|
node2 = Node(system2)
|
2012-02-14 20:40:32 +01:00
|
|
|
|
2012-02-18 17:45:21 +01:00
|
|
|
Thread.sleep(10.seconds.dilated.toMillis)
|
2012-02-14 20:40:32 +01:00
|
|
|
|
2012-02-18 22:14:53 +01:00
|
|
|
// check cluster convergence
|
2012-02-20 15:45:50 +01:00
|
|
|
node0.convergence must be('defined)
|
|
|
|
|
node1.convergence must be('defined)
|
|
|
|
|
node2.convergence must be('defined)
|
2012-02-18 22:14:53 +01:00
|
|
|
|
2012-02-20 15:45:50 +01:00
|
|
|
val members0 = node0.latestGossip.members.toArray
|
|
|
|
|
val version = node0.latestGossip.version
|
2012-02-14 20:40:32 +01:00
|
|
|
members0.size must be(3)
|
|
|
|
|
members0(0).address.port.get must be(5550)
|
2012-03-09 12:56:56 +01:00
|
|
|
members0(0).status must be(MemberStatus.Up)
|
2012-02-14 20:40:32 +01:00
|
|
|
members0(1).address.port.get must be(5551)
|
2012-03-09 12:56:56 +01:00
|
|
|
members0(1).status must be(MemberStatus.Up)
|
2012-02-14 20:40:32 +01:00
|
|
|
members0(2).address.port.get must be(5552)
|
2012-03-09 12:56:56 +01:00
|
|
|
members0(2).status must be(MemberStatus.Up)
|
2012-02-14 20:40:32 +01:00
|
|
|
|
2012-02-20 15:45:50 +01:00
|
|
|
val members1 = node1.latestGossip.members.toArray
|
2012-02-14 20:40:32 +01:00
|
|
|
members1.size must be(3)
|
|
|
|
|
members1(0).address.port.get must be(5550)
|
2012-03-09 12:56:56 +01:00
|
|
|
members1(0).status must be(MemberStatus.Up)
|
2012-02-14 20:40:32 +01:00
|
|
|
members1(1).address.port.get must be(5551)
|
2012-03-09 12:56:56 +01:00
|
|
|
members1(1).status must be(MemberStatus.Up)
|
2012-02-14 20:40:32 +01:00
|
|
|
members1(2).address.port.get must be(5552)
|
2012-03-09 12:56:56 +01:00
|
|
|
members1(2).status must be(MemberStatus.Up)
|
2012-02-14 20:40:32 +01:00
|
|
|
|
2012-02-20 15:45:50 +01:00
|
|
|
val members2 = node2.latestGossip.members.toArray
|
2012-02-14 20:40:32 +01:00
|
|
|
members2.size must be(3)
|
|
|
|
|
members2(0).address.port.get must be(5550)
|
2012-03-09 12:56:56 +01:00
|
|
|
members2(0).status must be(MemberStatus.Up)
|
2012-02-14 20:40:32 +01:00
|
|
|
members2(1).address.port.get must be(5551)
|
2012-03-09 12:56:56 +01:00
|
|
|
members2(1).status must be(MemberStatus.Up)
|
2012-02-14 20:40:32 +01:00
|
|
|
members2(2).address.port.get must be(5552)
|
2012-03-09 12:56:56 +01:00
|
|
|
members2(2).status must be(MemberStatus.Up)
|
2012-02-14 20:40:32 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} catch {
|
|
|
|
|
case e: Exception ⇒
|
|
|
|
|
e.printStackTrace
|
|
|
|
|
fail(e.toString)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override def atTermination() {
|
2012-02-19 21:18:16 +01:00
|
|
|
if (node0 ne null) node0.shutdown()
|
2012-02-20 15:45:50 +01:00
|
|
|
if (system0 ne null) system0.shutdown()
|
2012-02-14 20:40:32 +01:00
|
|
|
|
2012-02-19 21:18:16 +01:00
|
|
|
if (node1 ne null) node1.shutdown()
|
2012-02-20 15:45:50 +01:00
|
|
|
if (system1 ne null) system1.shutdown()
|
2012-02-14 20:40:32 +01:00
|
|
|
|
2012-02-19 21:18:16 +01:00
|
|
|
if (node2 ne null) node2.shutdown()
|
2012-02-20 15:45:50 +01:00
|
|
|
if (system2 ne null) system2.shutdown()
|
2012-02-14 20:40:32 +01:00
|
|
|
}
|
|
|
|
|
}
|