Author: toad
Date: 2007-06-21 17:22:21 +0000 (Thu, 21 Jun 2007)
New Revision: 13686

Modified:
   trunk/freenet/src/freenet/node/PeerManager.java
   trunk/freenet/src/freenet/node/PeerNode.java
Log:
Refuse to route requests to a node whose clock is out by more than 24 hours.

Modified: trunk/freenet/src/freenet/node/PeerManager.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerManager.java     2007-06-21 17:09:55 UTC 
(rev 13685)
+++ trunk/freenet/src/freenet/node/PeerManager.java     2007-06-21 17:22:21 UTC 
(rev 13686)
@@ -84,6 +84,7 @@
        public static final int PEER_NODE_STATUS_BURSTING = 8;
        public static final int PEER_NODE_STATUS_LISTENING = 9;
        public static final int PEER_NODE_STATUS_LISTEN_ONLY = 10;
+       public static final int PEER_NODE_STATUS_CLOCK_PROBLEM = 11;

     /**
      * Create a PeerManager by reading a list of peers from

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2007-06-21 17:09:55 UTC 
(rev 13685)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2007-06-21 17:22:21 UTC 
(rev 13686)
@@ -350,6 +350,10 @@

     /** Delta between our clock and his clock (positive = his clock is fast, 
negative = our clock is fast) */
     private long clockDelta;
+
+    /** If the clock delta is more than this constant, we don't talk to the 
node. Reason: It may not be up to date,
+     * it will have difficulty resolving date-based content etc. */
+       private static final long MAX_CLOCK_DELTA = 24L*60L*60L*1000L;

     private static boolean logMINOR;

@@ -2247,6 +2251,7 @@
        // Relatively few as we only get one every 200ms*#nodes
        // We want to get reasonably early feedback if it's dropping all of 
them...
        final static int MAX_PINGS = 5;
+
        final LRUHashtable pingsSentTimes = new LRUHashtable();
        long pingNumber;
        final RunningAverage pingAverage;
@@ -2447,6 +2452,8 @@
                return "LISTENING";
        if(status == PeerManager.PEER_NODE_STATUS_BURSTING)
                return "BURSTING";
+       if(status == PeerManager.PEER_NODE_STATUS_CLOCK_PROBLEM)
+               return "CLOCK PROBLEM";
        return "UNKNOWN STATUS";
   }

@@ -2472,6 +2479,8 @@
                return "peer_listening";
        if(status == PeerManager.PEER_NODE_STATUS_LISTEN_ONLY)
                return "peer_listen_only";
+       if(status == PeerManager.PEER_NODE_STATUS_CLOCK_PROBLEM)
+               return "peer_clock_problem";
        return "peer_unknown_status";
   }

@@ -2503,6 +2512,8 @@
                                peerNodeStatus = 
PeerManager.PEER_NODE_STATUS_TOO_NEW;
                        } else if(isConnected && 
verifiedIncompatibleOlderVersion) {
                                peerNodeStatus = 
PeerManager.PEER_NODE_STATUS_TOO_OLD;
+                       } else if(isConnected && Math.abs(clockDelta) > 
MAX_CLOCK_DELTA) {
+                               peerNodeStatus = 
PeerManager.PEER_NODE_STATUS_CLOCK_PROBLEM;
                        } else if(neverConnected) {
                                peerNodeStatus = 
PeerManager.PEER_NODE_STATUS_NEVER_CONNECTED;
                        } else if(isListenOnly) {
@@ -3919,6 +3930,8 @@

        public synchronized void setTimeDelta(long delta) {
                clockDelta = delta;
+               if(Math.abs(clockDelta) > MAX_CLOCK_DELTA)
+                       isRoutable = false;
        }

        public long getClockDelta() {


Reply via email to