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
This commit is contained in:
@@ -22,6 +22,7 @@
|
|||||||
package com.threerings.presents.peer.server;
|
package com.threerings.presents.peer.server;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -1067,12 +1068,17 @@ public abstract class PeerManager
|
|||||||
public void invokePersist () throws Exception {
|
public void invokePersist () throws Exception {
|
||||||
// let the world know that we're alive
|
// let the world know that we're alive
|
||||||
_noderepo.heartbeatNode(_nodeName);
|
_noderepo.heartbeatNode(_nodeName);
|
||||||
|
|
||||||
// then load up all the peer records
|
// 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
|
@Override
|
||||||
public void handleSuccess () {
|
public void handleSuccess () {
|
||||||
for (NodeRecord record : _nodes) {
|
// refresh peers with loaded records
|
||||||
|
for (NodeRecord record : _nodes.values()) {
|
||||||
if (record.nodeName.equals(_nodeName)) {
|
if (record.nodeName.equals(_nodeName)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -1082,12 +1088,23 @@ public abstract class PeerManager
|
|||||||
log.warning("Failure refreshing peer " + record + ".", e);
|
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<PeerNode> 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
|
@Override
|
||||||
public long getLongThreshold () {
|
public long getLongThreshold () {
|
||||||
return 700L;
|
return 700L;
|
||||||
}
|
}
|
||||||
protected List<NodeRecord> _nodes;
|
protected Map<String, NodeRecord> _nodes;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user