From 5959f4e2d948cdc1b9c1d11f508b3bcf94a137cf Mon Sep 17 00:00:00 2001 From: Mike Thomas Date: Tue, 1 Jun 2010 23:49:38 +0000 Subject: [PATCH] Split up some of the calls involved in resolving peered zones to make them easier to override. git-svn-id: svn+ssh://src.earth.threerings.net/vilya/trunk@919 c613c5cb-e716-0410-b11b-feb51c14d237 --- .../zone/peer/server/PeeredZoneRegistry.java | 94 +++++++++++-------- 1 file changed, 56 insertions(+), 38 deletions(-) diff --git a/src/java/com/threerings/whirled/zone/peer/server/PeeredZoneRegistry.java b/src/java/com/threerings/whirled/zone/peer/server/PeeredZoneRegistry.java index 590bb394..d0ab5a2f 100644 --- a/src/java/com/threerings/whirled/zone/peer/server/PeeredZoneRegistry.java +++ b/src/java/com/threerings/whirled/zone/peer/server/PeeredZoneRegistry.java @@ -131,49 +131,22 @@ public abstract class PeeredZoneRegistry extends ZoneRegistry listener.zoneOnNode(nodeInfo); // somewhere else, pass the buck } return; - } + } else { + resolveNewZone(zoneId, listener); + } + } + + /** + * Resolve a zone that's not yet hosted. + */ + protected void resolveNewZone (final int zoneId, final PeerZoneResolutionListener listener) + { // otherwise the zone is not resolved here nor there; so we claim the zone by acquiring a // distributed lock and then resolve it locally _peerMgr.acquireLock(ZonePeerManager.getZoneLock(zoneId), new ResultListener() { public void requestCompleted (String nodeName) { - if (_peerMgr.getNodeObject().nodeName.equals(nodeName)) { - log.debug("Got lock, resolving zone", "zoneId", zoneId); - resolveZone(zoneId, new ResolutionListener() { - public void zoneWasResolved (ZoneSummary zonesum) { - releaseLock(); - _peerMgr.zoneDidStartup(zonesum.zoneId, zonesum.name); - PeerZoneShutdownListener shutdowner = new PeerZoneShutdownListener() { - public void zoneDidShutdown (int zoneId) { - _peerMgr.zoneDidShutdown(zoneId); - } - }; - getZoneManager(zonesum.zoneId).setShutdownListener( - zonesum.zoneId, shutdowner); - listener.zoneWasResolved(zonesum); - } - public void zoneFailedToResolve (int zoneId, Exception reason) { - releaseLock(); - listener.zoneFailedToResolve(zoneId, reason); - } - protected void releaseLock () { - _peerMgr.releaseLock(ZonePeerManager.getZoneLock(zoneId), - new ResultListener.NOOP()); - } - }); - - } else { - // we didn't get the lock, so let's see what happened by re-checking - Tuple nodeInfo = _peerMgr.getZoneHost(zoneId); - if (nodeName == null || nodeInfo == null || !nodeName.equals(nodeInfo.left)) { - log.warning("Zone resolved on wacked-out node?", - "zoneId", zoneId, "nodeName", nodeName, "nodeInfo", nodeInfo); - listener.zoneFailedToResolve(zoneId, - new Exception("Zone on bogus host node")); - } else { - listener.zoneOnNode(nodeInfo); // somewhere else - } - } + resolveZoneForNode(zoneId, nodeName, listener); } public void requestFailed (Exception cause) { log.warning("Failed to acquire zone resolution lock", "id", zoneId, cause); @@ -182,6 +155,51 @@ public abstract class PeeredZoneRegistry extends ZoneRegistry }); } + /** + * Resolve a zone that's hosted or to-be-hosted on a zone. + */ + protected void resolveZoneForNode (final int zoneId, String nodeName, + final PeerZoneResolutionListener listener) + { + if (_peerMgr.getNodeObject().nodeName.equals(nodeName)) { + log.debug("Got lock, resolving zone", "zoneId", zoneId); + resolveZone(zoneId, new ResolutionListener() { + public void zoneWasResolved (ZoneSummary zonesum) { + releaseLock(); + _peerMgr.zoneDidStartup(zonesum.zoneId, zonesum.name); + PeerZoneShutdownListener shutdowner = new PeerZoneShutdownListener() { + public void zoneDidShutdown (int zoneId) { + _peerMgr.zoneDidShutdown(zoneId); + } + }; + getZoneManager(zonesum.zoneId).setShutdownListener( + zonesum.zoneId, shutdowner); + listener.zoneWasResolved(zonesum); + } + public void zoneFailedToResolve (int zoneId, Exception reason) { + releaseLock(); + listener.zoneFailedToResolve(zoneId, reason); + } + protected void releaseLock () { + _peerMgr.releaseLock(ZonePeerManager.getZoneLock(zoneId), + new ResultListener.NOOP()); + } + }); + + } else { + // we didn't get the lock, so let's see what happened by re-checking + Tuple nodeInfo = _peerMgr.getZoneHost(zoneId); + if (nodeName == null || nodeInfo == null || !nodeName.equals(nodeInfo.left)) { + log.warning("Zone resolved on wacked-out node?", + "zoneId", zoneId, "nodeName", nodeName, "nodeInfo", nodeInfo); + listener.zoneFailedToResolve(zoneId, + new Exception("Zone on bogus host node")); + } else { + listener.zoneOnNode(nodeInfo); // somewhere else + } + } + } + /** * Pass on that the zone has shutdown. */