All Downloads are FREE. Search and download functionalities are using the official Maven repository.

eventstore.cluster.ClusterInfo.scala Maven / Gradle / Ivy

The newest version!
package eventstore
package cluster

import java.net.InetSocketAddress
import akka.actor.ActorSystem
import org.joda.time.DateTime
import scala.concurrent._

case class ClusterInfo(serverAddress: InetSocketAddress, members: List[MemberInfo]) {
  lazy val bestNode: Option[MemberInfo] = {
    val xs = members.filter { x => x.isAlive && x.state.isAllowedToConnect }
    if (xs.isEmpty) None else Some(xs.maxBy(_.state))
  }
}

object ClusterInfo {

  type FutureFunc = InetSocketAddress => Future[ClusterInfo]

  def futureFunc(implicit system: ActorSystem): FutureFunc = {
    import ClusterProtocol._
    import system.dispatcher
    import spray.client.pipelining._
    import spray.http._
    import spray.httpx.SprayJsonSupport._

    val pipeline = sendReceive ~> unmarshal[ClusterInfo]

    (address: InetSocketAddress) => {
      val host = address.getHostString
      val port = address.getPort
      val uri = Uri(s"http://$host:$port/gossip?format=json")
      pipeline(Get(uri))
    }
  }
}

case class MemberInfo(
    instanceId: Uuid,
    timestamp: DateTime,
    state: NodeState,
    isAlive: Boolean,
    internalTcp: InetSocketAddress,
    externalTcp: InetSocketAddress,
    internalSecureTcp: InetSocketAddress,
    externalSecureTcp: InetSocketAddress,
    internalHttp: InetSocketAddress,
    externalHttp: InetSocketAddress,
    lastCommitPosition: Long,
    writerCheckpoint: Long,
    chaserCheckpoint: Long,
    epochPosition: Long,
    epochNumber: Int,
    epochId: Uuid,
    nodePriority: Int) extends Ordered[MemberInfo] {

  def compare(that: MemberInfo) = this.state compare that.state

  def like(other: MemberInfo): Boolean = this.instanceId == other.instanceId
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy