Changeset 832
- Timestamp:
- 09/06/06 08:37:59 (2 years ago)
- Files:
-
- trunk/source/org/kolaka/freecast/tracker/DefaultMultiTracker.java (modified) (4 diffs)
- trunk/source/org/kolaka/freecast/tracker/DefaultTracker.java (modified) (2 diffs)
- trunk/source/org/kolaka/freecast/tracker/MultiTrackerAdapter.java (modified) (2 diffs)
- trunk/source/org/kolaka/freecast/tracker/test/TrackerServletTest.java (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/source/org/kolaka/freecast/tracker/DefaultMultiTracker.java
r830 r832 25 25 26 26 import java.util.Date; 27 import java.util.Iterator; 27 28 import java.util.Map; 28 29 import java.util.Set; 29 30 import java.util.TreeMap; 30 31 32 import org.apache.commons.lang.Validate; 31 33 import org.apache.commons.logging.LogFactory; 32 34 import org.kolaka.freecast.node.NodeIdentifier; 33 35 import org.kolaka.freecast.node.NodeStatus; 34 36 import org.kolaka.freecast.peer.PeerReference; 37 import org.kolaka.freecast.timer.DefaultTimer; 38 import org.kolaka.freecast.timer.Timer; 39 import org.kolaka.freecast.timer.TimerUser; 35 40 import org.kolaka.freecast.tracker.DefaultTracker.ClientInfoProvider; 36 41 37 public class DefaultMultiTracker {42 public class DefaultMultiTracker implements TimerUser { 38 43 39 44 private Map trackers = new TreeMap(); … … 43 48 public DefaultMultiTracker(final ClientInfoProvider clientInfoProvider) { 44 49 this.clientInfoProvider = clientInfoProvider; 45 }46 50 47 private Tracker getTracker(NetworkIdentifier identifier) { 51 Runnable purgeRunnable = new Runnable() { 52 public void run() { 53 purge(); 54 } 55 }; 56 timer.executePeriodically(DefaultTimer.minutes(1), purgeRunnable , false); 57 } 58 59 private synchronized Tracker getTracker(NetworkIdentifier identifier) { 48 60 Tracker tracker = (Tracker) trackers.get(identifier); 49 61 if (tracker == null) { … … 56 68 57 69 protected Tracker createTracker(ClientInfoProvider clientInfoProvider) { 58 return new DefaultTracker(clientInfoProvider);70 return new TimedTracker(new DefaultTracker(clientInfoProvider)); 59 71 } 60 72 … … 78 90 return getTracker(network).getPeerReferences(node); 79 91 } 92 93 private Timer timer = DefaultTimer.getInstance(); 94 95 public void setTimer(Timer timer) { 96 Validate.notNull(timer); 97 this.timer = timer; 98 } 99 100 private synchronized void purge() { 101 Date olderLastRequest = new Date(System.currentTimeMillis() - DefaultTimer.minutes(5)); 102 LogFactory.getLog(getClass()).debug("purge trackers unused since " + olderLastRequest); 103 for (Iterator iter = trackers.entrySet().iterator(); iter.hasNext();) { 104 Map.Entry entry = (Map.Entry) iter.next(); 105 NetworkIdentifier networkId = (NetworkIdentifier) entry.getKey(); 106 TimedTracker tracker = (TimedTracker) entry.getValue(); 107 108 if (tracker.getLastRequest().before(olderLastRequest)) { 109 LogFactory.getLog(getClass()).info("purge tracker " + networkId); 110 iter.remove(); 111 } 112 } 113 LogFactory.getLog(getClass()).debug(trackers.size() + " trackers kept"); 114 } 115 116 static class TimedTracker implements Tracker { 117 118 private final Tracker delegate; 119 private Date lastRequest = new Date(); 120 121 public TimedTracker(final Tracker delegate) { 122 Validate.notNull(delegate); 123 this.delegate = delegate; 124 } 125 126 public Date getLastRequest() { 127 return lastRequest; 128 } 129 130 public Set getPeerReferences(NodeIdentifier node) throws TrackerException { 131 updateLastRequest(); 132 return delegate.getPeerReferences(node); 133 } 134 135 public void refresh(NodeStatus status) throws TrackerException { 136 updateLastRequest(); 137 delegate.refresh(status); 138 } 139 140 public NodeIdentifier register(PeerReference reference) throws TrackerException { 141 updateLastRequest(); 142 return delegate.register(reference); 143 } 144 145 public void unregister(NodeIdentifier identifier) throws TrackerException { 146 updateLastRequest(); 147 delegate.unregister(identifier); 148 } 149 150 private void updateLastRequest() { 151 lastRequest = new Date(); 152 } 153 154 } 80 155 81 156 } trunk/source/org/kolaka/freecast/tracker/DefaultTracker.java
r405 r832 133 133 if (entry != null) { 134 134 LogFactory.getLog(getClass()).debug("unregister " + entry); 135 auditor.unregister(entry.getReference()); 135 136 } else { 136 137 String clientHost = "unknown"; … … 145 146 LogFactory.getLog(getClass()).warn(msg); 146 147 } 147 auditor.unregister(entry.getReference());148 148 149 auditor.connectedNodes(entries.size()); 149 150 } trunk/source/org/kolaka/freecast/tracker/MultiTrackerAdapter.java
r830 r832 27 27 28 28 import org.apache.commons.lang.Validate; 29 import org.apache.commons.logging.LogFactory; 29 30 import org.kolaka.freecast.node.NodeIdentifier; 30 31 import org.kolaka.freecast.node.NodeStatus; … … 32 33 33 34 public class MultiTrackerAdapter implements Tracker { 34 35 35 36 private NetworkIdentifier networkId; 37 36 38 private MultiTracker tracker; 37 39 38 40 public MultiTrackerAdapter(NetworkIdentifier networkId, MultiTracker tracker) { 39 41 Validate.notNull(networkId); 40 42 Validate.notNull(tracker); 41 43 42 44 this.networkId = networkId; 43 45 this.tracker = tracker; 44 46 } 47 48 private void logInvocation(String description) { 49 LogFactory.getLog(getClass()).debug(description + " on network " + networkId); 50 } 45 51 46 52 public Set getPeerReferences(NodeIdentifier node) throws TrackerException { 53 logInvocation("getPeerStatus for " + node); 47 54 return tracker.getPeerReferences(networkId, node); 48 55 } 49 56 50 57 public void refresh(NodeStatus status) throws TrackerException { 51 tracker.refresh(networkId, status); } 58 logInvocation("refresh " + status); 59 tracker.refresh(networkId, status); 60 } 52 61 53 62 public NodeIdentifier register(PeerReference reference) 54 63 throws TrackerException { 64 logInvocation("register " + reference); 55 65 return tracker.register(networkId, reference); 56 66 } 57 67 58 68 public void unregister(NodeIdentifier identifier) throws TrackerException { 69 logInvocation("unregister " + identifier); 59 70 tracker.unregister(this.networkId, identifier); 60 71 } trunk/source/org/kolaka/freecast/tracker/test/TrackerServletTest.java
r830 r832 26 26 import java.net.InetSocketAddress; 27 27 28 import junit.framework.TestCase; 29 28 import org.kolaka.freecast.node.NodeIdentifier; 30 29 import org.kolaka.freecast.peer.InetPeerReference; 30 import org.kolaka.freecast.test.BaseTestCase; 31 import org.kolaka.freecast.tracker.HttpMultiTrackerConnector; 32 import org.kolaka.freecast.tracker.HttpMultiTrackerLocator; 33 import org.kolaka.freecast.tracker.HttpSimpleTrackerConnector; 31 34 import org.kolaka.freecast.tracker.HttpTracker; 32 35 import org.kolaka.freecast.tracker.HttpTrackerLocator; 36 import org.kolaka.freecast.tracker.NetworkIdentifier; 33 37 import org.kolaka.freecast.tracker.Tracker; 38 import org.kolaka.freecast.tracker.TrackerException; 39 import org.kolaka.freecast.tracker.TrackerLocator; 34 40 35 41 /** … … 38 44 * @author <a href="mailto:alban.peignier@free.fr">Alban Peignier </a> 39 45 */ 40 public class TrackerServletTest extends TestCase {46 public class TrackerServletTest extends BaseTestCase { 41 47 42 public void testBindConnect() throws Exception { 43 InetSocketAddress address = new InetSocketAddress(50000 + (int) (Math 44 .random() * 1000)); 45 HttpTracker tracker = new HttpTracker(); 48 private InetSocketAddress address; 46 49 50 protected void setUp() throws Exception { 51 super.setUp(); 52 address = new InetSocketAddress(50000 + (int) (Math 53 .random() * 1000)); 54 } 55 56 public void testSingle() throws Exception { 57 testBindConnect(HttpSimpleTrackerConnector.class, new HttpTrackerLocator(address)); 58 } 59 60 public void testMulti() throws Exception { 61 testBindConnect(HttpMultiTrackerConnector.class, new HttpMultiTrackerLocator(address, NetworkIdentifier.getRandomInstance())); 62 } 63 64 private void testBindConnect(Class connectorClass, TrackerLocator locator) throws Exception { 65 HttpTracker tracker = new HttpTracker(); 66 67 tracker.setConnectorClass(connectorClass); 47 68 tracker.setListenAddress(address); 69 48 70 tracker.start(); 49 50 Tracker remoteTracker = new HttpTrackerLocator(address).resolve(); 51 remoteTracker.register(InetPeerReference 52 .getInstance(new InetSocketAddress(4000))); 53 54 tracker.stop(); 71 72 try { 73 Tracker remoteTracker = locator.resolve(); 74 75 InetPeerReference nodeReference = InetPeerReference.getInstance(new InetSocketAddress(4000)); 76 testRemoteTracker(remoteTracker, nodeReference); 77 78 testRemoteTracker(remoteTracker, null); 79 } finally { 80 tracker.stop(); 81 } 55 82 } 56 83 84 /** 85 * @param remoteTracker 86 * @param nodeReference 87 * @throws TrackerException 88 */ 89 private void testRemoteTracker(Tracker remoteTracker, InetPeerReference nodeReference) throws TrackerException { 90 NodeIdentifier nodeIdentifier = remoteTracker.register(nodeReference); 91 remoteTracker.getPeerReferences(nodeIdentifier); 92 remoteTracker.unregister(nodeIdentifier); 93 } 94 95 57 96 }
