2012-10-10 15:23:18 +02:00
|
|
|
/**
|
2013-01-09 01:47:48 +01:00
|
|
|
* Copyright (C) 2009-2013 Typesafe Inc. <http://www.typesafe.com>
|
2012-10-10 15:23:18 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
package akka.cluster
|
|
|
|
|
|
|
|
|
|
import org.scalatest.WordSpec
|
|
|
|
|
import org.scalatest.matchers.MustMatchers
|
|
|
|
|
import akka.actor.Address
|
|
|
|
|
import akka.routing.ConsistentHash
|
2012-10-15 16:18:52 +02:00
|
|
|
import scala.concurrent.duration._
|
2013-01-15 09:35:07 +01:00
|
|
|
import scala.collection.immutable
|
2013-05-09 09:49:59 +02:00
|
|
|
import scala.collection.immutable.HashSet
|
2012-10-10 15:23:18 +02:00
|
|
|
|
|
|
|
|
@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner])
|
|
|
|
|
class ClusterHeartbeatSenderStateSpec extends WordSpec with MustMatchers {
|
|
|
|
|
|
2013-01-24 04:28:21 -08:00
|
|
|
val selfAddress = Address("akka.tcp", "sys", "myself", 2552)
|
|
|
|
|
val aa = Address("akka.tcp", "sys", "aa", 2552)
|
|
|
|
|
val bb = Address("akka.tcp", "sys", "bb", 2552)
|
|
|
|
|
val cc = Address("akka.tcp", "sys", "cc", 2552)
|
|
|
|
|
val dd = Address("akka.tcp", "sys", "dd", 2552)
|
|
|
|
|
val ee = Address("akka.tcp", "sys", "ee", 2552)
|
2012-10-10 15:23:18 +02:00
|
|
|
|
2013-01-15 09:35:07 +01:00
|
|
|
val emptyState = ClusterHeartbeatSenderState.empty(selfAddress, 3)
|
2012-10-10 15:23:18 +02:00
|
|
|
|
|
|
|
|
"A ClusterHeartbeatSenderState" must {
|
|
|
|
|
|
|
|
|
|
"return empty active set when no nodes" in {
|
|
|
|
|
emptyState.active.isEmpty must be(true)
|
|
|
|
|
}
|
|
|
|
|
|
2013-01-15 09:35:07 +01:00
|
|
|
"include heartbeatRequest in active set" in {
|
|
|
|
|
val s = emptyState.addHeartbeatRequest(aa, Deadline.now + 30.seconds)
|
|
|
|
|
s.heartbeatRequest.keySet must be(Set(aa))
|
2012-10-10 15:23:18 +02:00
|
|
|
s.active must be(Set(aa))
|
|
|
|
|
}
|
|
|
|
|
|
2013-01-15 09:35:07 +01:00
|
|
|
"remove heartbeatRequest from active set after removeOverdueHeartbeatRequest" in {
|
|
|
|
|
val s = emptyState.addHeartbeatRequest(aa, Deadline.now - 30.seconds).removeOverdueHeartbeatRequest()
|
|
|
|
|
s.heartbeatRequest must be(Map.empty)
|
2012-10-10 15:23:18 +02:00
|
|
|
s.active must be(Set.empty)
|
2013-08-27 15:14:53 +02:00
|
|
|
s.ending must be(Set(aa))
|
2012-10-10 15:23:18 +02:00
|
|
|
}
|
|
|
|
|
|
2013-01-15 09:35:07 +01:00
|
|
|
"remove heartbeatRequest after reset" in {
|
2013-05-09 09:49:59 +02:00
|
|
|
val s = emptyState.addHeartbeatRequest(aa, Deadline.now + 30.seconds).reset(HashSet(aa, bb))
|
2013-01-15 09:35:07 +01:00
|
|
|
s.heartbeatRequest must be(Map.empty)
|
2012-10-10 15:23:18 +02:00
|
|
|
}
|
|
|
|
|
|
2013-01-15 09:35:07 +01:00
|
|
|
"remove heartbeatRequest after addMember" in {
|
|
|
|
|
val s = emptyState.addHeartbeatRequest(aa, Deadline.now + 30.seconds).addMember(aa)
|
|
|
|
|
s.heartbeatRequest must be(Map.empty)
|
2012-10-10 18:13:08 +02:00
|
|
|
}
|
|
|
|
|
|
2013-01-15 09:35:07 +01:00
|
|
|
"remove heartbeatRequest after removeMember" in {
|
2013-05-09 09:49:59 +02:00
|
|
|
val s = emptyState.addHeartbeatRequest(aa, Deadline.now + 30.seconds).reset(HashSet(aa, bb)).removeMember(aa)
|
2013-01-15 09:35:07 +01:00
|
|
|
s.heartbeatRequest must be(Map.empty)
|
2013-08-27 15:14:53 +02:00
|
|
|
s.ending must be(Set(aa))
|
2012-10-10 18:13:08 +02:00
|
|
|
}
|
|
|
|
|
|
2013-01-15 09:35:07 +01:00
|
|
|
"remove from ending after addHeartbeatRequest" in {
|
2013-05-09 09:49:59 +02:00
|
|
|
val s = emptyState.reset(HashSet(aa, bb)).removeMember(aa)
|
2013-08-27 15:14:53 +02:00
|
|
|
s.ending must be(Set(aa))
|
2013-01-15 09:35:07 +01:00
|
|
|
val s2 = s.addHeartbeatRequest(aa, Deadline.now + 30.seconds)
|
|
|
|
|
s2.heartbeatRequest.keySet must be(Set(aa))
|
2013-08-27 15:14:53 +02:00
|
|
|
s2.ending must be(Set.empty)
|
2012-10-10 18:13:08 +02:00
|
|
|
}
|
|
|
|
|
|
2012-10-10 15:23:18 +02:00
|
|
|
"include nodes from reset in active set" in {
|
2013-05-09 09:49:59 +02:00
|
|
|
val nodes = HashSet(aa, bb, cc)
|
2012-10-10 15:23:18 +02:00
|
|
|
val s = emptyState.reset(nodes)
|
|
|
|
|
s.current must be(nodes)
|
2013-08-27 15:14:53 +02:00
|
|
|
s.ending must be(Set.empty)
|
2012-10-10 15:23:18 +02:00
|
|
|
s.active must be(nodes)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
"limit current nodes to monitoredByNrOfMembers when adding members" in {
|
|
|
|
|
val nodes = Set(aa, bb, cc, dd)
|
|
|
|
|
val s = nodes.foldLeft(emptyState) { _ addMember _ }
|
|
|
|
|
s.current.size must be(3)
|
|
|
|
|
s.addMember(ee).current.size must be(3)
|
|
|
|
|
}
|
|
|
|
|
|
2013-05-09 09:49:59 +02:00
|
|
|
"move member to ending set when removing member" in {
|
|
|
|
|
val nodes = HashSet(aa, bb, cc, dd, ee)
|
2012-10-10 15:23:18 +02:00
|
|
|
val s = emptyState.reset(nodes)
|
2013-08-27 15:14:53 +02:00
|
|
|
s.ending must be(Set.empty)
|
2012-10-10 15:23:18 +02:00
|
|
|
val included = s.current.head
|
|
|
|
|
val s2 = s.removeMember(included)
|
2013-08-27 15:14:53 +02:00
|
|
|
s2.ending must be(Set(included))
|
2012-10-10 15:23:18 +02:00
|
|
|
s2.current must not contain (included)
|
|
|
|
|
val s3 = s2.addMember(included)
|
|
|
|
|
s3.current must contain(included)
|
2013-08-27 15:14:53 +02:00
|
|
|
s3.ending must not contain (included)
|
2012-10-10 15:23:18 +02:00
|
|
|
}
|
|
|
|
|
|
2013-08-27 15:14:53 +02:00
|
|
|
"remove ending correctly" in {
|
2013-05-09 09:49:59 +02:00
|
|
|
val s = emptyState.reset(HashSet(aa)).removeMember(aa)
|
2013-08-27 15:14:53 +02:00
|
|
|
s.ending must be(Set(aa))
|
|
|
|
|
val s2 = s.removeEnding(aa)
|
|
|
|
|
s2.ending must be(Set.empty)
|
2012-10-10 15:23:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|