Removing InetSocketAddress as much as possible from the remoting, switching to RemoteAddress for an easier way forward with different transports. Also removing quite a few allocations internally in the remoting as a side-efect of this.

This commit is contained in:
Viktor Klang 2011-11-10 17:39:04 +01:00
parent 0800511ac9
commit ba9281e267
12 changed files with 122 additions and 146 deletions

View file

@ -12,9 +12,7 @@ import akka.util.duration._
import akka.remote.RemoteProtocol._
import akka.remote.RemoteProtocol.RemoteSystemDaemonMessageType._
import java.net.InetSocketAddress
import java.util.concurrent.atomic.AtomicReference
import java.util.concurrent.TimeUnit
import java.security.SecureRandom
import System.{ currentTimeMillis newTimestamp }
@ -27,8 +25,8 @@ import com.google.protobuf.ByteString
* Interface for node membership change listener.
*/
trait NodeMembershipChangeListener {
def nodeConnected(node: InetSocketAddress)
def nodeDisconnected(node: InetSocketAddress)
def nodeConnected(node: RemoteAddress)
def nodeDisconnected(node: RemoteAddress)
}
/**
@ -36,23 +34,23 @@ trait NodeMembershipChangeListener {
*/
case class Gossip(
version: VectorClock,
node: InetSocketAddress,
availableNodes: Set[InetSocketAddress] = Set.empty[InetSocketAddress],
unavailableNodes: Set[InetSocketAddress] = Set.empty[InetSocketAddress])
node: RemoteAddress,
availableNodes: Set[RemoteAddress] = Set.empty[RemoteAddress],
unavailableNodes: Set[RemoteAddress] = Set.empty[RemoteAddress])
/*
// ====== NEW GOSSIP IMPLEMENTATION ======
case class Gossip(
version: VectorClock,
node: InetSocketAddress,
leader: InetSocketAddress, // FIXME leader is always head of 'members', so we probably don't need this field
node: RemoteAddress,
leader: RemoteAddress, // FIXME leader is always head of 'members', so we probably don't need this field
members: SortedSet[Member] = SortetSet.empty[Member](Ordering.fromLessThan[String](_ > _)), // sorted set of members with their status, sorted by name
seen: Map[Member, VectorClock] = Map.empty[Member, VectorClock], // for ring convergence
pendingChanges: Option[Vector[PendingPartitioningChange]] = None, // for handoff
meta: Option[Map[String, Array[Byte]]] = None) // misc meta-data
case class Member(address: InetSocketAddress, status: MemberStatus)
case class Member(address: RemoteAddress, status: MemberStatus)
sealed trait MemberStatus
object MemberStatus {
@ -73,8 +71,8 @@ case class Gossip(
type VNodeMod = AnyRef
case class PendingPartitioningChange(
owner: InetSocketAddress,
nextOwner: InetSocketAddress,
owner: RemoteAddress,
nextOwner: RemoteAddress,
changes: Vector[VNodeMod],
status: PendingPartitioningStatus)
*/
@ -107,7 +105,7 @@ class Gossiper(remote: Remote) {
private val app = remote.app
private val log = Logging(app, this)
private val failureDetector = remote.failureDetector
private val connectionManager = new RemoteConnectionManager(app, remote, Map.empty[InetSocketAddress, ActorRef])
private val connectionManager = new RemoteConnectionManager(app, remote, Map.empty[RemoteAddress, ActorRef])
private val seeds = Set(address) // FIXME read in list of seeds from config
private val scheduler = new DefaultScheduler
@ -231,7 +229,7 @@ class Gossiper(remote: Remote) {
/**
* Gossips set of nodes passed in as argument. Returns 'true' if it gossiped to a "seed" node.
*/
private def gossipTo(nodes: Set[InetSocketAddress]): Boolean = {
private def gossipTo(nodes: Set[RemoteAddress]): Boolean = {
val peers = nodes filter (_ != address) // filter out myself
val peer = selectRandomNode(peers)
val oldState = state.get
@ -323,7 +321,7 @@ class Gossiper(remote: Remote) {
}
}
private def selectRandomNode(nodes: Set[InetSocketAddress]): InetSocketAddress = {
private def selectRandomNode(nodes: Set[RemoteAddress]): RemoteAddress = {
nodes.toList(random.nextInt(nodes.size))
}
}