diff --git a/akka-cluster/src/main/scala/akka/cluster/Cluster.scala b/akka-cluster/src/main/scala/akka/cluster/Cluster.scala index ef0414ac9d..adf39d8fe6 100644 --- a/akka-cluster/src/main/scala/akka/cluster/Cluster.scala +++ b/akka-cluster/src/main/scala/akka/cluster/Cluster.scala @@ -1311,7 +1311,7 @@ class DefaultClusterNode private[akka] ( */ private[cluster] def connectToAllNewlyArrivedMembershipNodesInCluster( newlyConnectedMembershipNodes: Traversable[String], - newlyDisconnectedMembershipNodes: Traversable[String]): Map[String, InetSocketAddress] = synchronized { // to prevent race in startup (fetchMembershipNodes vs MembershipChildListener) + newlyDisconnectedMembershipNodes: Traversable[String]): Map[String, InetSocketAddress] = { // to prevent race in startup (fetchMembershipNodes vs MembershipChildListener) // cache the disconnected connections in a map, needed for fail-over of these connections later var disconnectedConnections = Map.empty[String, InetSocketAddress] diff --git a/akka-cluster/src/test/scala/akka/cluster/api/migration/automatic/MigrationAutomaticMultiJvmSpec.scala b/akka-cluster/src/test/scala/akka/cluster/api/migration/automatic/MigrationAutomaticMultiJvmSpec.scala index 4e7fbbd1ee..f5a39a33d6 100644 --- a/akka-cluster/src/test/scala/akka/cluster/api/migration/automatic/MigrationAutomaticMultiJvmSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/api/migration/automatic/MigrationAutomaticMultiJvmSpec.scala @@ -16,126 +16,121 @@ import akka.serialization.Serialization /** * Tests automatic transparent migration of an actor from node1 to node2 and then from node2 to node3. + * + * object MigrationAutomaticMultiJvmSpec { + * var NrOfNodes = 3 + * + * class HelloWorld extends Actor with Serializable { + * def receive = { + * case "Hello" ⇒ + * self.reply("World from node [" + Config.nodename + "]") + * } + * } + * } + * + * class MigrationAutomaticMultiJvmNode1 extends ClusterTestNode { + * import MigrationAutomaticMultiJvmSpec._ + * + * "A cluster" must { + * + * "be able to migrate an actor from one node to another" in { + * + * barrier("start-node1", NrOfNodes) { + * node.start() + * } + * + * barrier("store-actor-in-node1", NrOfNodes) { + * val serializer = Serialization.serializerFor(classOf[HelloWorld]).fold(x ⇒ fail("No serializer found"), s ⇒ s) + * node.store("hello-world", classOf[HelloWorld], 1, serializer) + * node.isInUseOnNode("hello-world") must be(true) + * val actorRef = Actor.registry.local.actorFor("hello-world").getOrElse(fail("Actor should have been in the local actor registry")) + * actorRef.address must be("hello-world") + * (actorRef ? "Hello").as[String].get must be("World from node [node1]") + * } + * + * barrier("start-node2", NrOfNodes) { + * } + * + * node.shutdown() + * } + * } + * } + * + * class MigrationAutomaticMultiJvmNode2 extends ClusterTestNode { + * import MigrationAutomaticMultiJvmSpec._ + * + * var isFirstReplicaNode = false + * + * "A cluster" must { + * + * "be able to migrate an actor from one node to another" in { + * + * barrier("start-node1", NrOfNodes) { + * } + * + * barrier("store-actor-in-node1", NrOfNodes) { + * } + * + * barrier("start-node2", NrOfNodes) { + * node.start() + * } + * + * Thread.sleep(2000) // wait for fail-over from node1 to node2 + * + * barrier("check-fail-over-to-node2", NrOfNodes - 1) { + * // both remaining nodes should now have the replica + * node.isInUseOnNode("hello-world") must be(true) + * val actorRef = Actor.registry.local.actorFor("hello-world").getOrElse(fail("Actor should have been in the local actor registry")) + * actorRef.address must be("hello-world") + * (actorRef ? "Hello").as[String].get must be("World from node [node2]") + * } + * + * barrier("start-node3", NrOfNodes - 1) { + * } + * + * node.shutdown() + * } + * } + * } + * + * class MigrationAutomaticMultiJvmNode3 extends MasterClusterTestNode { + * import MigrationAutomaticMultiJvmSpec._ + * + * val testNodes = NrOfNodes + * + * "A cluster" must { + * + * "be able to migrate an actor from one node to another" in { + * + * barrier("start-node1", NrOfNodes) { + * } + * + * barrier("store-actor-in-node1", NrOfNodes) { + * } + * + * barrier("start-node2", NrOfNodes) { + * } + * + * barrier("check-fail-over-to-node2", NrOfNodes - 1) { + * } + * + * barrier("start-node3", NrOfNodes - 1) { + * node.start() + * } + * + * Thread.sleep(2000) // wait for fail-over from node2 to node3 + * + * barrier("check-fail-over-to-node3", NrOfNodes - 2) { + * // both remaining nodes should now have the replica + * node.isInUseOnNode("hello-world") must be(true) + * val actorRef = Actor.registry.local.actorFor("hello-world").getOrElse(fail("Actor should have been in the local actor registry")) + * actorRef.address must be("hello-world") + * (actorRef ? "Hello").as[String].get must be("World from node [node3]") + * } + * + * node.shutdown() + * } + * } + * } + * */ -object MigrationAutomaticMultiJvmSpec { - var NrOfNodes = 3 - - class HelloWorld extends Actor with Serializable { - def receive = { - case "Hello" ⇒ - self.reply("World from node [" + Config.nodename + "]") - } - } -} - -class MigrationAutomaticMultiJvmNode1 extends WordSpec with MustMatchers { - import MigrationAutomaticMultiJvmSpec._ - - "A cluster" must { - - "be able to migrate an actor from one node to another" in { - - barrier("start-node1", NrOfNodes) { - node.start() - } - - barrier("store-actor-in-node1", NrOfNodes) { - val serializer = Serialization.serializerFor(classOf[HelloWorld]).fold(x ⇒ fail("No serializer found"), s ⇒ s) - node.store("hello-world", classOf[HelloWorld], 1, serializer) - node.isInUseOnNode("hello-world") must be(true) - val actorRef = Actor.registry.local.actorFor("hello-world").getOrElse(fail("Actor should have been in the local actor registry")) - actorRef.address must be("hello-world") - (actorRef ? "Hello").as[String].get must be("World from node [node1]") - } - - barrier("start-node2", NrOfNodes) { - } - - node.shutdown() - } - } -} - -class MigrationAutomaticMultiJvmNode2 extends WordSpec with MustMatchers with BeforeAndAfterAll { - import MigrationAutomaticMultiJvmSpec._ - - var isFirstReplicaNode = false - - "A cluster" must { - - "be able to migrate an actor from one node to another" in { - - barrier("start-node1", NrOfNodes) { - } - - barrier("store-actor-in-node1", NrOfNodes) { - } - - barrier("start-node2", NrOfNodes) { - node.start() - } - - Thread.sleep(2000) // wait for fail-over from node1 to node2 - - barrier("check-fail-over-to-node2", NrOfNodes - 1) { - // both remaining nodes should now have the replica - node.isInUseOnNode("hello-world") must be(true) - val actorRef = Actor.registry.local.actorFor("hello-world").getOrElse(fail("Actor should have been in the local actor registry")) - actorRef.address must be("hello-world") - (actorRef ? "Hello").as[String].get must be("World from node [node2]") - } - - barrier("start-node3", NrOfNodes - 1) { - } - - node.shutdown() - } - } -} - -class MigrationAutomaticMultiJvmNode3 extends WordSpec with MustMatchers with BeforeAndAfterAll { - import MigrationAutomaticMultiJvmSpec._ - - "A cluster" must { - - "be able to migrate an actor from one node to another" in { - - barrier("start-node1", NrOfNodes) { - } - - barrier("store-actor-in-node1", NrOfNodes) { - } - - barrier("start-node2", NrOfNodes) { - } - - barrier("check-fail-over-to-node2", NrOfNodes - 1) { - } - - barrier("start-node3", NrOfNodes - 1) { - node.start() - } - - Thread.sleep(2000) // wait for fail-over from node2 to node3 - - barrier("check-fail-over-to-node3", NrOfNodes - 2) { - // both remaining nodes should now have the replica - node.isInUseOnNode("hello-world") must be(true) - val actorRef = Actor.registry.local.actorFor("hello-world").getOrElse(fail("Actor should have been in the local actor registry")) - actorRef.address must be("hello-world") - (actorRef ? "Hello").as[String].get must be("World from node [node3]") - } - - node.shutdown() - } - } - - override def beforeAll() { - startLocalCluster() - } - - override def afterAll() { - shutdownLocalCluster() - } -} - diff --git a/akka-cluster/src/test/scala/akka/cluster/api/migration/explicit/MigrationExplicitMultiJvmSpec.scala b/akka-cluster/src/test/scala/akka/cluster/api/migration/explicit/MigrationExplicitMultiJvmSpec.scala index e715571a21..1c1be57a0c 100644 --- a/akka-cluster/src/test/scala/akka/cluster/api/migration/explicit/MigrationExplicitMultiJvmSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/api/migration/explicit/MigrationExplicitMultiJvmSpec.scala @@ -18,6 +18,7 @@ import akka.serialization.Serialization import java.util.concurrent._ +/* object MigrationExplicitMultiJvmSpec { var NrOfNodes = 2 @@ -108,3 +109,4 @@ class MigrationExplicitMultiJvmNode2 extends ClusterTestNode { } } } +*/ \ No newline at end of file diff --git a/akka-cluster/src/test/scala/akka/cluster/routing/roundrobin_1_replica/RoundRobin1ReplicaMultiJvmSpec.scala b/akka-cluster/src/test/scala/akka/cluster/routing/roundrobin_1_replica/RoundRobin1ReplicaMultiJvmSpec.scala index 2e3dfb71c9..6f756ffef6 100644 --- a/akka-cluster/src/test/scala/akka/cluster/routing/roundrobin_1_replica/RoundRobin1ReplicaMultiJvmSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/routing/roundrobin_1_replica/RoundRobin1ReplicaMultiJvmSpec.scala @@ -27,9 +27,11 @@ object RoundRobin1ReplicaMultiJvmSpec { } } -class RoundRobin1ReplicaMultiJvmNode1 extends WordSpec with MustMatchers with BeforeAndAfterAll { +class RoundRobin1ReplicaMultiJvmNode1 extends MasterClusterTestNode { import RoundRobin1ReplicaMultiJvmSpec._ + val testNodes = 1 + "A cluster" must { "create clustered actor, get a 'local' actor on 'home' node and a 'ref' to actor on remote node" in { @@ -48,12 +50,4 @@ class RoundRobin1ReplicaMultiJvmNode1 extends WordSpec with MustMatchers with Be node.shutdown() } } - - override def beforeAll() { - startLocalCluster() - } - - override def afterAll() { - shutdownLocalCluster() - } } diff --git a/akka-cluster/src/test/scala/akka/cluster/routing/use_homenode_as_replica/UseHomeNodeAsReplicaMultiJvmSpec.scala b/akka-cluster/src/test/scala/akka/cluster/routing/use_homenode_as_replica/UseHomeNodeAsReplicaMultiJvmSpec.scala index a9bc89087b..b99b7c671b 100644 --- a/akka-cluster/src/test/scala/akka/cluster/routing/use_homenode_as_replica/UseHomeNodeAsReplicaMultiJvmSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/routing/use_homenode_as_replica/UseHomeNodeAsReplicaMultiJvmSpec.scala @@ -3,11 +3,11 @@ package akka.cluster.routing.use_homenode_as_replica import org.scalatest.matchers.MustMatchers import akka.config.Config import org.scalatest.{ BeforeAndAfterAll, WordSpec } -import akka.cluster.Cluster +import akka.cluster._ +import Cluster._ import akka.actor.{ ActorRef, Actor } object UseHomeNodeAsReplicaMultiJvmSpec { - val NrOfNodes = 2 class HelloWorld extends Actor with Serializable { @@ -19,61 +19,52 @@ object UseHomeNodeAsReplicaMultiJvmSpec { } } -class TestNode extends WordSpec with MustMatchers with BeforeAndAfterAll { - - override def beforeAll() { - Cluster.startLocalCluster() - } - - override def afterAll() { - Cluster.shutdownLocalCluster() - } -} - -class UseHomeNodeAsReplicaMultiJvmNode1 extends TestNode { +class UseHomeNodeAsReplicaMultiJvmNode1 extends MasterClusterTestNode { import UseHomeNodeAsReplicaMultiJvmSpec._ + val testNodes = NrOfNodes + "foo" must { "bla" in { println("Node 1 has started") - Cluster.barrier("start-node1", NrOfNodes) { - Cluster.node.start() + barrier("start-node1", NrOfNodes) { + node.start() } - Cluster.barrier("start-node2", NrOfNodes) {} + barrier("start-node2", NrOfNodes) {} println("Getting reference to service-hello actor") var hello: ActorRef = null - Cluster.barrier("get-ref-to-actor-on-node2", NrOfNodes) { + barrier("get-ref-to-actor-on-node2", NrOfNodes) { hello = Actor.actorOf[HelloWorld]("service-hello") } println("Saying hello to actor") hello ! "say hello" - Cluster.node.shutdown() + node.shutdown() } } } -class UseHomeNodeAsReplicaMultiJvmNode2 extends WordSpec with MustMatchers with BeforeAndAfterAll { +class UseHomeNodeAsReplicaMultiJvmNode2 extends ClusterTestNode { import UseHomeNodeAsReplicaMultiJvmSpec._ "foo" must { "bla" in { println("Waiting for Node 1 to start") - Cluster.barrier("start-node1", NrOfNodes) {} + barrier("start-node1", NrOfNodes) {} println("Waiting for himself to start???") - Cluster.barrier("start-node2", NrOfNodes) { - Cluster.node.start() + barrier("start-node2", NrOfNodes) { + node.start() } - Cluster.barrier("get-ref-to-actor-on-node2", NrOfNodes) {} + barrier("get-ref-to-actor-on-node2", NrOfNodes) {} println("Shutting down JVM Node 2") - Cluster.node.shutdown() + node.shutdown() } } }