that was one hell of a FIXME

- fixed so that netty pipeline when generating addresses does not need
  to know the system name of the connecting client (which might differ
  from the local one, of course)
- this entailed differentiating between transport addresses and system
  addresses, which I took as an opportunity to separate everything out
  properly so that address schemas can easily be made pluggable
- made RemoteSupport generic in the address format it supports
- adapt netty stuff, and made everything else work with the most
  generic: ParsedTransportAddress
- did I mention that I statically separated unparsed from parsed
  addresses?
This commit is contained in:
Roland 2011-12-11 20:00:26 +01:00
parent 40654227b7
commit 7f0275bca2
18 changed files with 357 additions and 231 deletions

View file

@ -20,15 +20,15 @@ import java.util.concurrent.atomic.AtomicReference
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class RemoteConnectionManager(
system: ActorSystem,
system: ActorSystemImpl,
remote: Remote,
initialConnections: Map[RemoteAddress, ActorRef] = Map.empty[RemoteAddress, ActorRef])
initialConnections: Map[ParsedTransportAddress, ActorRef] = Map.empty[ParsedTransportAddress, ActorRef])
extends ConnectionManager {
val log = Logging(system, "RemoteConnectionManager")
// FIXME is this VersionedIterable really needed? It is not used I think. Complicates API. See 'def connections' etc.
case class State(version: Long, connections: Map[RemoteAddress, ActorRef])
case class State(version: Long, connections: Map[ParsedTransportAddress, ActorRef])
extends VersionedIterable[ActorRef] {
def iterable: Iterable[ActorRef] = connections.values
}
@ -54,7 +54,7 @@ class RemoteConnectionManager(
def size: Int = connections.connections.size
def connectionFor(address: RemoteAddress): Option[ActorRef] = connections.connections.get(address)
def connectionFor(address: ParsedTransportAddress): Option[ActorRef] = connections.connections.get(address)
def isEmpty: Boolean = connections.connections.isEmpty
@ -63,7 +63,7 @@ class RemoteConnectionManager(
}
@tailrec
final def failOver(from: RemoteAddress, to: RemoteAddress) {
final def failOver(from: ParsedTransportAddress, to: ParsedTransportAddress) {
log.debug("Failing over connection from [{}] to [{}]", from, to)
val oldState = state.get
@ -94,8 +94,8 @@ class RemoteConnectionManager(
val oldState = state.get()
var changed = false
var faultyAddress: RemoteAddress = null
var newConnections = Map.empty[RemoteAddress, ActorRef]
var faultyAddress: ParsedTransportAddress = null
var newConnections = Map.empty[ParsedTransportAddress, ActorRef]
oldState.connections.keys foreach { address
val actorRef: ActorRef = oldState.connections.get(address).get
@ -121,7 +121,7 @@ class RemoteConnectionManager(
}
@tailrec
final def putIfAbsent(address: RemoteAddress, newConnectionFactory: () ActorRef): ActorRef = {
final def putIfAbsent(address: ParsedTransportAddress, newConnectionFactory: () ActorRef): ActorRef = {
val oldState = state.get()
val oldConnections = oldState.connections
@ -148,6 +148,6 @@ class RemoteConnectionManager(
}
}
private[remote] def newConnection(remoteAddress: RemoteAddress, actorPath: ActorPath) =
new RemoteActorRef(remote.system.provider, remote.server, actorPath, Nobody, None)
private[remote] def newConnection(remoteAddress: ParsedTransportAddress, actorPath: ActorPath) =
new RemoteActorRef(system.provider, remote.server, actorPath, Nobody, None)
}