From 369d33da142531f1097145b8b7f8f713433496ef Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Thu, 30 Aug 2012 15:13:40 +0200 Subject: [PATCH 1/3] Removed racy test, covered by MembershipChangeListenerJoinSpec anyway, see #2444 * There is a race between leader actions and the clusterView polling, it doesn't help with longer leader-actions-interval, since you can be unlucky * Exactly this is covered by MembershipChangeListenerJoinSpec and there implemented with subscription, which is the only way --- .../scala/akka/cluster/NodeJoinSpec.scala | 50 ------------------- 1 file changed, 50 deletions(-) delete mode 100644 akka-cluster/src/multi-jvm/scala/akka/cluster/NodeJoinSpec.scala diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeJoinSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeJoinSpec.scala deleted file mode 100644 index de21d714bb..0000000000 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeJoinSpec.scala +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright (C) 2009-2012 Typesafe Inc. - */ -package akka.cluster - -import com.typesafe.config.ConfigFactory -import org.scalatest.BeforeAndAfter -import akka.remote.testkit.MultiNodeConfig -import akka.remote.testkit.MultiNodeSpec -import akka.testkit._ -import scala.concurrent.util.duration._ - -object NodeJoinMultiJvmSpec extends MultiNodeConfig { - val first = role("first") - val second = role("second") - - commonConfig( - debugConfig(on = false) - .withFallback(ConfigFactory.parseString("akka.clusterView.leader-actions-interval = 5 s") // increase the leader action task interval - .withFallback(MultiNodeClusterSpec.clusterConfig))) -} - -class NodeJoinMultiJvmNode1 extends NodeJoinSpec with FailureDetectorPuppetStrategy -class NodeJoinMultiJvmNode2 extends NodeJoinSpec with FailureDetectorPuppetStrategy - -abstract class NodeJoinSpec - extends MultiNodeSpec(NodeJoinMultiJvmSpec) - with MultiNodeClusterSpec { - - import NodeJoinMultiJvmSpec._ - - "A cluster node" must { - "join another cluster and get status JOINING - when sending a 'Join' command" taggedAs LongRunningTest in { - - runOn(first) { - startClusterNode() - } - - enterBarrier("first-started") - - runOn(second) { - cluster.join(first) - } - - awaitCond(clusterView.members.exists { member ⇒ member.address == address(second) && member.status == MemberStatus.Joining }) - - enterBarrier("after") - } - } -} From 8ba0041e7cfc0b2705985a2391f581e65d893ffb Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Thu, 30 Aug 2012 15:33:26 +0200 Subject: [PATCH 2/3] Remove increased leader-actions-interval, since it's false safety, see #2444 --- .../multi-jvm/scala/akka/cluster/JoinInProgressSpec.scala | 2 +- .../akka/cluster/MembershipChangeListenerExitingSpec.scala | 1 - .../akka/cluster/MembershipChangeListenerJoinSpec.scala | 5 +---- .../akka/cluster/MembershipChangeListenerLeavingSpec.scala | 1 - 4 files changed, 2 insertions(+), 7 deletions(-) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/JoinInProgressSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/JoinInProgressSpec.scala index e67ec357ff..61636f6358 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/JoinInProgressSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/JoinInProgressSpec.scala @@ -25,7 +25,7 @@ object JoinInProgressMultiJvmSpec extends MultiNodeConfig { threshold = 4 acceptable-heartbeat-pause = 1 second } - }""") // increase the leader action task interval + }""") .withFallback(MultiNodeClusterSpec.clusterConfig))) } diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerExitingSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerExitingSpec.scala index 649b57ee59..e82977e579 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerExitingSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerExitingSpec.scala @@ -22,7 +22,6 @@ object MembershipChangeListenerExitingMultiJvmSpec extends MultiNodeConfig { debugConfig(on = false) .withFallback(ConfigFactory.parseString(""" akka.cluster { - leader-actions-interval = 5 s # increase the leader action task interval unreachable-nodes-reaper-interval = 300 s # turn "off" reaping to unreachable node set } """) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerJoinSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerJoinSpec.scala index 9999f02078..7c14af7203 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerJoinSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerJoinSpec.scala @@ -17,10 +17,7 @@ object MembershipChangeListenerJoinMultiJvmSpec extends MultiNodeConfig { val first = role("first") val second = role("second") - commonConfig( - debugConfig(on = false) - .withFallback(ConfigFactory.parseString("akka.clusterView.leader-actions-interval = 5 s") // increase the leader action task interval to allow time checking for JOIN before leader moves it to UP - .withFallback(MultiNodeClusterSpec.clusterConfig))) + commonConfig(debugConfig(on = false).withFallback(MultiNodeClusterSpec.clusterConfig)) } class MembershipChangeListenerJoinMultiJvmNode1 extends MembershipChangeListenerJoinSpec with FailureDetectorPuppetStrategy diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerLeavingSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerLeavingSpec.scala index 8e33497d00..afc11fa493 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerLeavingSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerLeavingSpec.scala @@ -21,7 +21,6 @@ object MembershipChangeListenerLeavingMultiJvmSpec extends MultiNodeConfig { commonConfig( debugConfig(on = false) .withFallback(ConfigFactory.parseString(""" - akka.clusterView.leader-actions-interval = 5 s akka.cluster.unreachable-nodes-reaper-interval = 300 s # turn "off" """)) .withFallback(MultiNodeClusterSpec.clusterConfig)) From bb9fad1d0bd139350d865650beddaff74bba9a26 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Thu, 30 Aug 2012 16:54:55 +0200 Subject: [PATCH 3/3] Add missing CurrentClusterState case to tests, see #2456 * The only reason I can think of why the MemberExited event isn't received in MembershipChangeListenerExitingSpec is that CurrentClusterState isn't handled. Might be something else but this was wrong anyway. --- .../multi-jvm/scala/akka/cluster/LeaderLeavingSpec.scala | 8 +++++++- .../cluster/MembershipChangeListenerExitingSpec.scala | 4 ++++ .../cluster/MembershipChangeListenerLeavingSpec.scala | 4 ++++ .../scala/akka/cluster/NodeLeavingAndExitingSpec.scala | 6 ++++++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderLeavingSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderLeavingSpec.scala index b509341ee6..15e308cafb 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderLeavingSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderLeavingSpec.scala @@ -11,6 +11,7 @@ import akka.testkit._ import scala.concurrent.util.duration._ import akka.actor.Props import akka.actor.Actor +import akka.cluster.MemberStatus._ object LeaderLeavingMultiJvmSpec extends MultiNodeConfig { val first = role("first") @@ -62,7 +63,7 @@ abstract class LeaderLeavingSpec awaitCond(!cluster.isRunning) // verify that the LEADER is REMOVED - awaitCond(clusterView.status == MemberStatus.Removed) + awaitCond(clusterView.status == Removed) } else { @@ -71,6 +72,11 @@ abstract class LeaderLeavingSpec cluster.subscribe(system.actorOf(Props(new Actor { def receive = { + case state: CurrentClusterState ⇒ + if (state.members.exists(m ⇒ m.address == oldLeaderAddress && m.status == Leaving)) + leavingLatch.countDown() + if (state.members.exists(m ⇒ m.address == oldLeaderAddress && m.status == Exiting)) + exitingLatch.countDown() case MemberLeft(m) if m.address == oldLeaderAddress ⇒ leavingLatch.countDown() case MemberExited(m) if m.address == oldLeaderAddress ⇒ exitingLatch.countDown() case _ ⇒ // ignore diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerExitingSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerExitingSpec.scala index e82977e579..f0407e94d5 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerExitingSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerExitingSpec.scala @@ -12,6 +12,7 @@ import akka.testkit._ import scala.concurrent.util.duration._ import akka.actor.Props import akka.actor.Actor +import akka.cluster.MemberStatus._ object MembershipChangeListenerExitingMultiJvmSpec extends MultiNodeConfig { val first = role("first") @@ -57,6 +58,9 @@ abstract class MembershipChangeListenerExitingSpec val exitingLatch = TestLatch() cluster.subscribe(system.actorOf(Props(new Actor { def receive = { + case state: CurrentClusterState ⇒ + if (state.members.exists(m ⇒ m.address == address(second) && m.status == Exiting)) + exitingLatch.countDown() case MemberExited(m) if m.address == address(second) ⇒ exitingLatch.countDown() case _ ⇒ // ignore diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerLeavingSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerLeavingSpec.scala index afc11fa493..ab93e9c319 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerLeavingSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerLeavingSpec.scala @@ -12,6 +12,7 @@ import akka.testkit._ import akka.actor.Address import akka.actor.Props import akka.actor.Actor +import akka.cluster.MemberStatus._ object MembershipChangeListenerLeavingMultiJvmSpec extends MultiNodeConfig { val first = role("first") @@ -55,6 +56,9 @@ abstract class MembershipChangeListenerLeavingSpec val latch = TestLatch() cluster.subscribe(system.actorOf(Props(new Actor { def receive = { + case state: CurrentClusterState ⇒ + if (state.members.exists(m ⇒ m.address == address(second) && m.status == Leaving)) + latch.countDown() case MemberLeft(m) if m.address == address(second) ⇒ latch.countDown() case _ ⇒ // ignore diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeLeavingAndExitingSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeLeavingAndExitingSpec.scala index 5073e17aa1..529866c433 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeLeavingAndExitingSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeLeavingAndExitingSpec.scala @@ -11,6 +11,7 @@ import akka.testkit._ import scala.concurrent.util.duration._ import akka.actor.Props import akka.actor.Actor +import akka.cluster.MemberStatus._ object NodeLeavingAndExitingMultiJvmSpec extends MultiNodeConfig { val first = role("first") @@ -48,6 +49,11 @@ abstract class NodeLeavingAndExitingSpec val exitingLatch = TestLatch() cluster.subscribe(system.actorOf(Props(new Actor { def receive = { + case state: CurrentClusterState ⇒ + if (state.members.exists(m ⇒ m.address == secondAddess && m.status == Leaving)) + leavingLatch.countDown() + if (state.members.exists(m ⇒ m.address == secondAddess && m.status == Exiting)) + exitingLatch.countDown() case MemberLeft(m) if m.address == secondAddess ⇒ leavingLatch.countDown() case MemberExited(m) if m.address == secondAddess ⇒ exitingLatch.countDown()