Added support for "leader election", the isLeader method and leader election tests. Also fixed bug in scrutinizer not maintaining the 'seen' map.

Signed-off-by: Jonas Bonér <jonas@jonasboner.com>
This commit is contained in:
Jonas Bonér 2012-02-20 17:22:07 +01:00
parent 3c2f5ab93c
commit 83c97d08da
2 changed files with 167 additions and 1 deletions

View file

@ -282,6 +282,14 @@ case class Node(system: ActorSystemImpl, remote: RemoteActorRefProvider) {
*/
def self: Member = state.get.self
/**
* Is this node the leader?
*/
def isLeader: Boolean = {
val currentState = state.get
remoteAddress == currentState.latestGossip.members.head.address
}
/**
* Is this node a singleton cluster?
*/
@ -540,6 +548,7 @@ case class Node(system: ActorSystemImpl, remote: RemoteActorRefProvider) {
val localGossip = localState.latestGossip
val localOverview = localGossip.overview
val localSeen = localOverview.seen
val localMembers = localGossip.members
val localUnreachableAddresses = localGossip.overview.unreachable
@ -553,7 +562,9 @@ case class Node(system: ActorSystemImpl, remote: RemoteActorRefProvider) {
log.info("Node [{}] - Marking node(s) an unreachable [{}]", remoteAddress, newlyDetectedUnreachableAddresses.mkString(", "))
val newOverview = localOverview copy (unreachable = newUnreachableAddresses)
val newSeen = newUnreachableAddresses.foldLeft(localSeen)((currentSeen, address) currentSeen - address)
val newOverview = localOverview copy (seen = newSeen, unreachable = newUnreachableAddresses)
val newGossip = localGossip copy (overview = newOverview, members = newMembers)
val versionedGossip = newGossip + vclockNode