|
Akka/Scala example source code file (LeaderElectionSpec.scala)
The LeaderElectionSpec.scala Akka example source code
/**
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.cluster
import language.postfixOps
import com.typesafe.config.ConfigFactory
import akka.remote.testkit.MultiNodeConfig
import akka.remote.testkit.MultiNodeSpec
import akka.testkit._
import scala.concurrent.duration._
import scala.collection.immutable
final case class LeaderElectionMultiNodeConfig(failureDetectorPuppet: Boolean) extends MultiNodeConfig {
val controller = role("controller")
val first = role("first")
val second = role("second")
val third = role("third")
val fourth = role("fourth")
commonConfig(debugConfig(on = false).withFallback(MultiNodeClusterSpec.clusterConfig(failureDetectorPuppet)))
}
class LeaderElectionWithFailureDetectorPuppetMultiJvmNode1 extends LeaderElectionSpec(failureDetectorPuppet = true)
class LeaderElectionWithFailureDetectorPuppetMultiJvmNode2 extends LeaderElectionSpec(failureDetectorPuppet = true)
class LeaderElectionWithFailureDetectorPuppetMultiJvmNode3 extends LeaderElectionSpec(failureDetectorPuppet = true)
class LeaderElectionWithFailureDetectorPuppetMultiJvmNode4 extends LeaderElectionSpec(failureDetectorPuppet = true)
class LeaderElectionWithFailureDetectorPuppetMultiJvmNode5 extends LeaderElectionSpec(failureDetectorPuppet = true)
class LeaderElectionWithAccrualFailureDetectorMultiJvmNode1 extends LeaderElectionSpec(failureDetectorPuppet = false)
class LeaderElectionWithAccrualFailureDetectorMultiJvmNode2 extends LeaderElectionSpec(failureDetectorPuppet = false)
class LeaderElectionWithAccrualFailureDetectorMultiJvmNode3 extends LeaderElectionSpec(failureDetectorPuppet = false)
class LeaderElectionWithAccrualFailureDetectorMultiJvmNode4 extends LeaderElectionSpec(failureDetectorPuppet = false)
class LeaderElectionWithAccrualFailureDetectorMultiJvmNode5 extends LeaderElectionSpec(failureDetectorPuppet = false)
abstract class LeaderElectionSpec(multiNodeConfig: LeaderElectionMultiNodeConfig)
extends MultiNodeSpec(multiNodeConfig)
with MultiNodeClusterSpec {
def this(failureDetectorPuppet: Boolean) = this(LeaderElectionMultiNodeConfig(failureDetectorPuppet))
import multiNodeConfig._
// sorted in the order used by the cluster
lazy val sortedRoles = List(first, second, third, fourth).sorted
"A cluster of four nodes" must {
"be able to 'elect' a single leader" taggedAs LongRunningTest in {
awaitClusterUp(first, second, third, fourth)
if (myself != controller) {
clusterView.isLeader should be(myself == sortedRoles.head)
assertLeaderIn(sortedRoles)
}
enterBarrier("after-1")
}
def shutdownLeaderAndVerifyNewLeader(alreadyShutdown: Int): Unit = {
val currentRoles = sortedRoles.drop(alreadyShutdown)
currentRoles.size should be >= (2)
val leader = currentRoles.head
val aUser = currentRoles.last
val remainingRoles = currentRoles.tail
val n = "-" + (alreadyShutdown + 1)
myself match {
case `controller` ⇒
val leaderAddress = address(leader)
enterBarrier("before-shutdown" + n)
testConductor.exit(leader, 0).await
enterBarrier("after-shutdown" + n, "after-unavailable" + n, "after-down" + n, "completed" + n)
case `leader` ⇒
enterBarrier("before-shutdown" + n, "after-shutdown" + n)
// this node will be shutdown by the controller and doesn't participate in more barriers
case `aUser` ⇒
val leaderAddress = address(leader)
enterBarrier("before-shutdown" + n, "after-shutdown" + n)
// detect failure
markNodeAsUnavailable(leaderAddress)
awaitAssert(clusterView.unreachableMembers.map(_.address) should contain(leaderAddress))
enterBarrier("after-unavailable" + n)
// user marks the shutdown leader as DOWN
cluster.down(leaderAddress)
// removed
awaitAssert(clusterView.unreachableMembers.map(_.address) should not contain (leaderAddress))
enterBarrier("after-down" + n, "completed" + n)
case _ if remainingRoles.contains(myself) ⇒
// remaining cluster nodes, not shutdown
val leaderAddress = address(leader)
enterBarrier("before-shutdown" + n, "after-shutdown" + n)
awaitAssert(clusterView.unreachableMembers.map(_.address) should contain(leaderAddress))
enterBarrier("after-unavailable" + n)
enterBarrier("after-down" + n)
awaitMembersUp(currentRoles.size - 1)
val nextExpectedLeader = remainingRoles.head
clusterView.isLeader should be(myself == nextExpectedLeader)
assertLeaderIn(remainingRoles)
enterBarrier("completed" + n)
}
}
"be able to 're-elect' a single leader after leader has left" taggedAs LongRunningTest in within(30 seconds) {
shutdownLeaderAndVerifyNewLeader(alreadyShutdown = 0)
enterBarrier("after-2")
}
"be able to 're-elect' a single leader after leader has left (again)" taggedAs LongRunningTest in within(30 seconds) {
shutdownLeaderAndVerifyNewLeader(alreadyShutdown = 1)
enterBarrier("after-3")
}
}
}
Other Akka source code examplesHere is a short list of links related to this Akka LeaderElectionSpec.scala source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.