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:
parent
0800511ac9
commit
ba9281e267
12 changed files with 122 additions and 146 deletions
|
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue