diff --git a/src/main/java/com/threerings/presents/peer/server/PeerManager.java b/src/main/java/com/threerings/presents/peer/server/PeerManager.java
index 635657670..07f25769c 100644
--- a/src/main/java/com/threerings/presents/peer/server/PeerManager.java
+++ b/src/main/java/com/threerings/presents/peer/server/PeerManager.java
@@ -288,8 +288,36 @@ public abstract class PeerManager
* @param nodeNamespace The namespace for nodes to peer with. This node will connect to other
* nodes with the same prefix from the NODES table.
*/
- public void init (String nodeName, String sharedSecret,
- String hostName, String publicHostName, int port, String nodeNamespace)
+ public void init (
+ String nodeName, String sharedSecret, String hostName,
+ String publicHostName, int port, String nodeNamespace)
+ {
+ init(nodeName, sharedSecret, hostName, publicHostName, null, port, nodeNamespace);
+ }
+
+ /**
+ * Initializes this peer manager and initiates the process of connecting to its peer nodes.
+ * This will also reconfigure the ConnectionManager and ClientManager with peer related bits,
+ * so this should not be called until after the main server has set up its client
+ * factory and authenticator.
+ *
+ * @param nodeName this node's unique name.
+ * @param sharedSecret a shared secret used to allow the peers to authenticate with one
+ * another.
+ * @param hostName the DNS name of the server running this node.
+ * @param publicHostName if non-null, a separate public DNS hostname by which the node is to
+ * be known to normal clients (we may want inter-peer communication to take place over a
+ * different network than the communication between real clients and the various peer
+ * servers).
+ * @param region the region in which the node lives, which may be null. Nodes in different
+ * regions must connect to each other through the public host name.
+ * @param port the port on which other nodes should connect to us.
+ * @param nodeNamespace The namespace for nodes to peer with. This node will connect to other
+ * nodes with the same prefix from the NODES table.
+ */
+ public void init (
+ String nodeName, String sharedSecret, String hostName, String publicHostName,
+ String region, int port, String nodeNamespace)
{
_nodeNamespace = nodeNamespace;
_nodeName = nodeName;
@@ -313,7 +341,8 @@ public abstract class PeerManager
// register ourselves with the node table
_self = new NodeRecord(
- _nodeName, hostName, (publicHostName == null) ? hostName : publicHostName, port);
+ _nodeName, hostName, (publicHostName == null) ? hostName : publicHostName,
+ region, port);
_invoker.postUnit(new WriteOnlyUnit("registerNode(" + _self + ")") {
@Override
public void invokePersist () throws Exception {
@@ -1254,6 +1283,14 @@ public abstract class PeerManager
return new PeerCreds(_nodeName, _sharedSecret);
}
+ /**
+ * Returns the region in which the local node exists.
+ */
+ protected String getRegion ()
+ {
+ return _self.region;
+ }
+
/**
* Called when we hear about a client logging on to another node.
*/
diff --git a/src/main/java/com/threerings/presents/peer/server/PeerNode.java b/src/main/java/com/threerings/presents/peer/server/PeerNode.java
index 0b8bf35b6..1a1b3475c 100644
--- a/src/main/java/com/threerings/presents/peer/server/PeerNode.java
+++ b/src/main/java/com/threerings/presents/peer/server/PeerNode.java
@@ -127,7 +127,9 @@ public class PeerNode
public void refresh (NodeRecord record)
{
// if the hostname of this node changed, kill our existing client and connect anew
- if (!record.hostName.equals(_record.hostName) && _client.isActive()) {
+ String region = _peermgr.getRegion();
+ String hostName = record.getPeerHostName(region);
+ if (!hostName.equals(_record.getPeerHostName(region)) && _client.isActive()) {
_client.logoff(false);
}
@@ -149,7 +151,7 @@ public class PeerNode
// otherwise configure our client with the right bits and logon
_client.setCredentials(_peermgr.createCreds());
- _client.setServer(_record.hostName, new int[] { _record.port });
+ _client.setServer(hostName, new int[] { _record.port });
_client.logon();
_lastConnectStamp = System.currentTimeMillis();
}
diff --git a/src/main/java/com/threerings/presents/peer/server/persist/NodeRecord.java b/src/main/java/com/threerings/presents/peer/server/persist/NodeRecord.java
index 765852065..b02600af2 100644
--- a/src/main/java/com/threerings/presents/peer/server/persist/NodeRecord.java
+++ b/src/main/java/com/threerings/presents/peer/server/persist/NodeRecord.java
@@ -23,6 +23,8 @@ package com.threerings.presents.peer.server.persist;
import java.sql.Timestamp;
+import com.google.common.base.Objects;
+
import com.samskivert.util.StringUtil;
import com.samskivert.depot.Key;
@@ -43,6 +45,7 @@ public class NodeRecord extends PersistentRecord
public static final ColumnExp NODE_NAME = colexp(_R, "nodeName");
public static final ColumnExp HOST_NAME = colexp(_R, "hostName");
public static final ColumnExp PUBLIC_HOST_NAME = colexp(_R, "publicHostName");
+ public static final ColumnExp REGION = colexp(_R, "region");
public static final ColumnExp PORT = colexp(_R, "port");
public static final ColumnExp LAST_UPDATED = colexp(_R, "lastUpdated");
public static final ColumnExp SHUTDOWN = colexp(_R, "shutdown");
@@ -50,7 +53,7 @@ public class NodeRecord extends PersistentRecord
/** Increment this value if you modify the definition of this persistent
* object in a way that will result in a change to its SQL counterpart. */
- public static final int SCHEMA_VERSION = 2;
+ public static final int SCHEMA_VERSION = 3;
/** The unique name assigned to this node. */
@Id
@@ -65,6 +68,11 @@ public class NodeRecord extends PersistentRecord
@Column(name="PUBLIC_HOST_NAME", length=64)
public String publicHostName;
+ /** The region in which the node exists. Nodes in different regions must connect through the
+ * public host name. */
+ @Column(name="REGION", length=64, nullable=true)
+ public String region;
+
/** The port on which to connect to this node. */
@Column(name="PORT")
public int port;
@@ -83,11 +91,13 @@ public class NodeRecord extends PersistentRecord
}
/** Creates a record for the specified node. */
- public NodeRecord (String nodeName, String hostName, String publicHostName, int port)
+ public NodeRecord (
+ String nodeName, String hostName, String publicHostName, String region, int port)
{
this.nodeName = nodeName;
this.hostName = hostName;
this.publicHostName = publicHostName;
+ this.region = region;
this.port = port;
}
@@ -97,6 +107,14 @@ public class NodeRecord extends PersistentRecord
this.nodeName = nodeName;
}
+ /**
+ * Returns the host name to which peers in the specified region should connect.
+ */
+ public String getPeerHostName (String region)
+ {
+ return Objects.equal(this.region, region) ? hostName : publicHostName;
+ }
+
@Override
public String toString ()
{