From d0bde9d84dea812919036fa450254329d5760559 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 4 May 2011 20:58:29 +0000 Subject: [PATCH] Because we have had cases where peers have become unresponsive without actually disconnecting (due to EC2 woes, e.g.), let's try shutting down peers if they haven't checked in for a while. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@6636 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../presents/peer/server/PeerManager.java | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) 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 9d2c39055..10ac224f6 100644 --- a/src/main/java/com/threerings/presents/peer/server/PeerManager.java +++ b/src/main/java/com/threerings/presents/peer/server/PeerManager.java @@ -22,6 +22,7 @@ package com.threerings.presents.peer.server; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -1067,12 +1068,17 @@ public abstract class PeerManager public void invokePersist () throws Exception { // let the world know that we're alive _noderepo.heartbeatNode(_nodeName); + // then load up all the peer records - _nodes = _noderepo.loadNodes(_nodeNamespace); + _nodes = Maps.newHashMap(); + for (NodeRecord record : _noderepo.loadNodes(_nodeNamespace)) { + _nodes.put(record.nodeName, record); + } } @Override public void handleSuccess () { - for (NodeRecord record : _nodes) { + // refresh peers with loaded records + for (NodeRecord record : _nodes.values()) { if (record.nodeName.equals(_nodeName)) { continue; } @@ -1082,12 +1088,23 @@ public abstract class PeerManager log.warning("Failure refreshing peer " + record + ".", e); } } + + // remove peers for which we no longer have up-to-date records + long now = System.currentTimeMillis(); + for (Iterator it = _peers.values().iterator(); it.hasNext(); ) { + PeerNode peer = it.next(); + NodeRecord record = _nodes.get(peer.getNodeName()); + if (record == null || (now - record.lastUpdated.getTime()) > PeerNode.STALE_INTERVAL) { + peer.shutdown(); + it.remove(); + } + } } @Override public long getLongThreshold () { return 700L; } - protected List _nodes; + protected Map _nodes; }); }