|
Akka/Scala example source code file (GossipSpec.scala)
The GossipSpec.scala Akka example source code
/**
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.cluster
import org.scalatest.WordSpec
import org.scalatest.Matchers
import akka.actor.Address
import scala.collection.immutable.SortedSet
@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner])
class GossipSpec extends WordSpec with Matchers {
import MemberStatus._
val a1 = TestMember(Address("akka.tcp", "sys", "a", 2552), Up)
val a2 = TestMember(a1.address, Joining)
val b1 = TestMember(Address("akka.tcp", "sys", "b", 2552), Up)
val b2 = TestMember(b1.address, Removed)
val c1 = TestMember(Address("akka.tcp", "sys", "c", 2552), Leaving)
val c2 = TestMember(c1.address, Up)
val c3 = TestMember(c1.address, Exiting)
val d1 = TestMember(Address("akka.tcp", "sys", "d", 2552), Leaving)
val e1 = TestMember(Address("akka.tcp", "sys", "e", 2552), Joining)
val e2 = TestMember(e1.address, Up)
val e3 = TestMember(e1.address, Down)
"A Gossip" must {
"reach convergence when it's empty" in {
Gossip.empty.convergence should be(true)
}
"merge members by status priority" in {
val g1 = Gossip(members = SortedSet(a1, c1, e1))
val g2 = Gossip(members = SortedSet(a2, c2, e2))
val merged1 = g1 merge g2
merged1.members should be(SortedSet(a2, c1, e1))
merged1.members.toSeq.map(_.status) should be(Seq(Up, Leaving, Up))
val merged2 = g2 merge g1
merged2.members should be(SortedSet(a2, c1, e1))
merged2.members.toSeq.map(_.status) should be(Seq(Up, Leaving, Up))
}
"merge unreachable" in {
val r1 = Reachability.empty.unreachable(b1.uniqueAddress, a1.uniqueAddress).unreachable(b1.uniqueAddress, c1.uniqueAddress)
val g1 = Gossip(members = SortedSet(a1, b1, c1), overview = GossipOverview(reachability = r1))
val r2 = Reachability.empty.unreachable(a1.uniqueAddress, d1.uniqueAddress)
val g2 = Gossip(members = SortedSet(a1, b1, c1, d1), overview = GossipOverview(reachability = r2))
val merged1 = g1 merge g2
merged1.overview.reachability.allUnreachable should be(Set(a1.uniqueAddress, c1.uniqueAddress, d1.uniqueAddress))
val merged2 = g2 merge g1
merged2.overview.reachability.allUnreachable should be(merged1.overview.reachability.allUnreachable)
}
"merge members by removing removed members" in {
// c3 removed
val r1 = Reachability.empty.unreachable(b1.uniqueAddress, a1.uniqueAddress)
val g1 = Gossip(members = SortedSet(a1, b1), overview = GossipOverview(reachability = r1))
val r2 = r1.unreachable(b1.uniqueAddress, c3.uniqueAddress)
val g2 = Gossip(members = SortedSet(a1, b1, c3), overview = GossipOverview(reachability = r2))
val merged1 = g1 merge g2
merged1.members should be(SortedSet(a1, b1))
merged1.overview.reachability.allUnreachable should be(Set(a1.uniqueAddress))
val merged2 = g2 merge g1
merged2.overview.reachability.allUnreachable should be(merged1.overview.reachability.allUnreachable)
merged2.members should be(merged1.members)
}
"have leader as first member based on ordering, except Exiting status" in {
Gossip(members = SortedSet(c2, e2)).leader should be(Some(c2.uniqueAddress))
Gossip(members = SortedSet(c3, e2)).leader should be(Some(e2.uniqueAddress))
Gossip(members = SortedSet(c3)).leader should be(Some(c3.uniqueAddress))
}
"merge seen table correctly" in {
val vclockNode = VectorClock.Node("something")
val g1 = (Gossip(members = SortedSet(a1, b1, c1, d1)) :+ vclockNode).seen(a1.uniqueAddress).seen(b1.uniqueAddress)
val g2 = (Gossip(members = SortedSet(a1, b1, c1, d1)) :+ vclockNode).seen(a1.uniqueAddress).seen(c1.uniqueAddress)
val g3 = (g1 copy (version = g2.version)).seen(d1.uniqueAddress)
def checkMerged(merged: Gossip) {
val seen = merged.overview.seen.toSeq
seen.length should be(0)
merged seenByNode (a1.uniqueAddress) should be(false)
merged seenByNode (b1.uniqueAddress) should be(false)
merged seenByNode (c1.uniqueAddress) should be(false)
merged seenByNode (d1.uniqueAddress) should be(false)
merged seenByNode (e1.uniqueAddress) should be(false)
}
checkMerged(g3 merge g2)
checkMerged(g2 merge g3)
}
"know who is youngest" in {
// a2 and e1 is Joining
val g1 = Gossip(members = SortedSet(a2, b1.copyUp(3), e1), overview = GossipOverview(reachability =
Reachability.empty.unreachable(a2.uniqueAddress, e1.uniqueAddress)))
g1.youngestMember should be(b1)
val g2 = Gossip(members = SortedSet(a2, b1.copyUp(3), e1), overview = GossipOverview(reachability =
Reachability.empty.unreachable(a2.uniqueAddress, b1.uniqueAddress).unreachable(a2.uniqueAddress, e1.uniqueAddress)))
g2.youngestMember should be(b1)
val g3 = Gossip(members = SortedSet(a2, b1.copyUp(3), e2.copyUp(4)))
g3.youngestMember should be(e2)
}
}
}
Other Akka source code examplesHere is a short list of links related to this Akka GossipSpec.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.