Author: nextgens
Date: 2009-02-03 11:36:00 +0000 (Tue, 03 Feb 2009)
New Revision: 25484
Modified:
trunk/freenet/src/freenet/node/NodePinger.java
Log:
Improve NodePinger:
-take care of synchronization
-requeue before we do anything so that we are closer to a 200ms period
-logging optimizations
Modified: trunk/freenet/src/freenet/node/NodePinger.java
===================================================================
--- trunk/freenet/src/freenet/node/NodePinger.java 2009-02-03 10:14:23 UTC
(rev 25483)
+++ trunk/freenet/src/freenet/node/NodePinger.java 2009-02-03 11:36:00 UTC
(rev 25484)
@@ -6,15 +6,28 @@
import java.util.Arrays;
import freenet.support.Logger;
+import freenet.support.LogThresholdCallback;
/**
* Track average round-trip time for each peer node, get a geometric mean.
*/
public class NodePinger implements Runnable {
+ private static volatile boolean logMINOR;
- private double meanPing = 0;
+ static {
+ Logger.registerLogThresholdCallback(new LogThresholdCallback() {
+
+ @Override
+ public void shouldUpdate() {
+ logMINOR = Logger.shouldLog(Logger.MINOR, this);
+ }
+ });
+ }
+
+ private final Node node;
+ private volatile double meanPing = 0;
- static final double CRAZY_MAX_PING_TIME = 365.25*24*60*60*1000;
+ public static final double CRAZY_MAX_PING_TIME = 365.25*24*60*60*1000;
NodePinger(Node n) {
this.node = n;
@@ -24,35 +37,34 @@
run();
}
- final Node node;
-
public void run() {
- //freenet.support.OSThread.RealOSThread.logPID(this);
- try {
- recalculateMean(node.peers.connectedPeers);
- } finally {
- node.ps.queueTimedJob(this, 200);
- }
+ // Requeue *before* so that it's accurate in any case
+ node.ps.queueTimedJob(this, 200);
+
+ PeerNode[] peers = null;
+ synchronized(node.peers) {
+ System.arraycopy(node.peers.connectedPeers, 0, peers, 0,
node.peers.connectedPeers.length);
+ }
+
+ // Now we don't have to care about synchronization anymore
+ recalculateMean(peers);
}
/** Recalculate the mean ping time */
- void recalculateMean(PeerNode[] peers) {
+ private void recalculateMean(PeerNode[] peers) {
if(peers.length == 0) return;
meanPing = calculateMedianPing(peers);
- if(Logger.shouldLog(Logger.MINOR, this))
+ if(logMINOR)
Logger.minor(this, "Median ping: "+meanPing);
}
- double calculateMedianPing(PeerNode[] peers) {
-
+ private double calculateMedianPing(PeerNode[] peers) {
double[] allPeers = new double[peers.length];
+ for(int i = 0; i < peers.length; i++) {
+ PeerNode peer = peers[i];
+ allPeers[i] = peer.averagePingTime();
+ }
- for(int i=0;i<peers.length;i++) {
- PeerNode peer = peers[i];
- double pingTime = peer.averagePingTime();
- allPeers[i] = pingTime;
- }
-
Arrays.sort(allPeers);
return allPeers[peers.length / 2];
}
@@ -60,4 +72,4 @@
public double averagePingTime() {
return meanPing;
}
-}
+}
\ No newline at end of file
_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs