Author: toad
Date: 2005-11-18 01:04:54 +0000 (Fri, 18 Nov 2005)
New Revision: 7552

Modified:
   trunk/freenet/src/freenet/client/FailureCodeTracker.java
   trunk/freenet/src/freenet/client/InserterException.java
   trunk/freenet/src/freenet/node/InsertSender.java
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/PeerManager.java
   trunk/freenet/src/freenet/node/PeerNode.java
   trunk/freenet/src/freenet/node/TextModeClientInterface.java
   trunk/freenet/src/freenet/node/Version.java
Log:
188:
Various fixes etc.
Plus, Big New Experimental Feature:
Compress a node's specialization according to its probability of returning a 
RejectedOverload.

Modified: trunk/freenet/src/freenet/client/FailureCodeTracker.java
===================================================================
--- trunk/freenet/src/freenet/client/FailureCodeTracker.java    2005-11-17 
23:56:37 UTC (rev 7551)
+++ trunk/freenet/src/freenet/client/FailureCodeTracker.java    2005-11-18 
01:04:54 UTC (rev 7552)
@@ -1,6 +1,8 @@
 package freenet.client;

+import java.util.Collection;
 import java.util.HashMap;
+import java.util.Iterator;

 /**
  * Essentially a map of integer to incrementible integer.
@@ -22,4 +24,19 @@
                i.x++;
        }

+       public synchronized String toVerboseString() {
+               StringBuffer sb = new StringBuffer();
+               Collection values = map.values();
+               Iterator i = values.iterator();
+               while(i.hasNext()) {
+                       Integer x = (Integer) i.next();
+                       Item val = (Item) map.get(x);
+                       sb.append(x);
+                       sb.append('=');
+                       sb.append(val.x);
+                       sb.append('\n');
+               }
+               return sb.toString();
+       }
+       
 }

Modified: trunk/freenet/src/freenet/client/InserterException.java
===================================================================
--- trunk/freenet/src/freenet/client/InserterException.java     2005-11-17 
23:56:37 UTC (rev 7551)
+++ trunk/freenet/src/freenet/client/InserterException.java     2005-11-18 
01:04:54 UTC (rev 7552)
@@ -9,9 +9,9 @@
 public class InserterException extends Exception {
        private static final long serialVersionUID = -1106716067841151962L;

-       final int mode;
+       public final int mode;
        /** For collection errors */
-       final FailureCodeTracker errorCodes;
+       public final FailureCodeTracker errorCodes;
        /** If a non-serious error, the URI */
        public final FreenetURI uri;


Modified: trunk/freenet/src/freenet/node/InsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/InsertSender.java    2005-11-17 23:56:37 UTC 
(rev 7551)
+++ trunk/freenet/src/freenet/node/InsertSender.java    2005-11-18 01:04:54 UTC 
(rev 7552)
@@ -82,7 +82,7 @@

             if(htl == 0) {
                 // Send an InsertReply back
-                finish(SUCCESS);
+                finish(SUCCESS, null);
                 return;
             }

@@ -100,7 +100,7 @@

             if(next == null) {
                 // Backtrack
-                finish(ROUTE_NOT_FOUND);
+                finish(ROUTE_NOT_FOUND, null);
                 return;
             }
             Logger.minor(this, "Routing insert to "+next);
@@ -142,7 +142,7 @@
             if(msg == null || msg.getSpec() == DMT.FNPRejectedOverload) {
                 // Overload... hmmmm - propagate error back to source
                 Logger.error(this, "Propagating "+msg+" back to source on 
"+this);
-                finish(REJECTED_OVERLOAD);
+                finish(REJECTED_OVERLOAD, next);
                 return;
             }

@@ -206,13 +206,13 @@
                 // Fairly serious problem
                 Logger.error(this, "Timeout after Accepted in insert");
                 // Treat as rejected-overload
-                finish(REJECTED_OVERLOAD);
+                finish(REJECTED_OVERLOAD, next);
                 return;
             }

             if(msg.getSpec() == DMT.FNPRejectedOverload || msg.getSpec() == 
DMT.FNPRejectedTimeout) {
                 Logger.minor(this, "Rejected due to overload");
-                finish(REJECTED_OVERLOAD);
+                finish(REJECTED_OVERLOAD, next);
                 return;
             }

@@ -267,17 +267,17 @@

             if(msg.getSpec() != DMT.FNPInsertReply) {
                Logger.error(this, "Unknown reply: "+msg);
-               finish(INTERNAL_ERROR);
+               finish(INTERNAL_ERROR, next);
             }

             // Our task is complete
-            finish(SUCCESS);
+            finish(SUCCESS, next);
             return;
         }
         } catch (Throwable t) {
             Logger.error(this, "Caught "+t, t);
             if(status == NOT_FINISHED)
-               finish(INTERNAL_ERROR);
+               finish(INTERNAL_ERROR, null);
         } finally {
             node.completed(uid);
                node.removeInsertSender(myKey, origHTL, this);
@@ -298,7 +298,7 @@
         }
     }

-    private void finish(int code) {
+    private void finish(int code, PeerNode next) {
         Logger.minor(this, "Finished: "+code+" on "+this, new 
Exception("debug"));
         if(status != NOT_FINISHED)
                throw new IllegalStateException("finish() called with "+code+" 
when was already "+status);
@@ -314,10 +314,13 @@
                }
         }

-        if(status == REJECTED_OVERLOAD)
+        if(status == REJECTED_OVERLOAD) {
                node.getInsertThrottle().requestRejectedOverload();
-        else if(status == SUCCESS || status == ROUTE_NOT_FOUND)
+               next.rejectedOverload();
+        } else if(status == SUCCESS || status == ROUTE_NOT_FOUND) {
                
node.getInsertThrottle().requestCompleted(System.currentTimeMillis() - 
startTime);
+               next.didNotRejectOverload();
+        }

         synchronized(this) {
             notifyAll();

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2005-11-17 23:56:37 UTC (rev 
7551)
+++ trunk/freenet/src/freenet/node/Node.java    2005-11-18 01:04:54 UTC (rev 
7552)
@@ -285,7 +285,7 @@
         filenamesPrefix = prefix;
         this.overrideIPAddress = overrideIP;
         try {
-            datastore = new 
BaseFreenetStore(prefix+"freenet-"+portNumber,1024);
+            datastore = new 
BaseFreenetStore(prefix+"freenet-"+portNumber,16384); // 512MB
         } catch (FileNotFoundException e1) {
             Logger.error(this, "Could not open datastore: "+e1, e1);
             System.exit(EXIT_STORE_FILE_NOT_FOUND);

Modified: trunk/freenet/src/freenet/node/PeerManager.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerManager.java     2005-11-17 23:56:37 UTC 
(rev 7551)
+++ trunk/freenet/src/freenet/node/PeerManager.java     2005-11-18 01:04:54 UTC 
(rev 7552)
@@ -254,7 +254,7 @@
         for(int i=0;i<peers.length;i++) {
             PeerNode p = peers[i];
             if(!p.isConnected()) continue;
-            double diff = distance(p.getLocation().getValue(), loc);
+            double diff = distance(p, loc);
             if(diff < bestDiff) {
                 best = p;
                 bestDiff = diff;
@@ -262,7 +262,15 @@
         }
         return best;
     }
-
+    
+    static double distance(PeerNode p, double loc) {
+       double d = distance(p.getLocation().getValue(), loc);
+       double pSummaryFailure = p.getPRejectedOverload();
+       double denom = 1.0 - pSummaryFailure;
+       if(denom == 0.0) denom = 0.000001;
+       return d / denom;
+    }
+    
     /**
      * Distance between two locations.
      */
@@ -295,7 +303,7 @@
             if(!p.isConnected()) continue;
             count++;
             any = p;
-            double diff = distance(p.getLocation().getValue(), loc);
+            double diff = distance(p, loc);
             if((!ignoreSelf) && diff > maxDiff) continue;
             if(diff < bestDiff) {
                 best = p;

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2005-11-17 23:56:37 UTC 
(rev 7551)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2005-11-18 01:04:54 UTC 
(rev 7552)
@@ -29,6 +29,7 @@
 import freenet.support.HexUtil;
 import freenet.support.Logger;
 import freenet.support.SimpleFieldSet;
+import freenet.support.math.BootstrappingDecayingRunningAverage;
 import freenet.support.math.RunningAverage;
 import freenet.support.math.SimpleRunningAverage;

@@ -149,6 +150,11 @@

     /** The time at which we last completed a connection setup. */
     private long connectedTime;
+
+    /** The probability of the node rejecting a request because of
+     * overload, or of it timing out etc.
+     */
+    private final RunningAverage pRejectOverload;

     /**
      * Create a PeerNode from a SimpleFieldSet containing a
@@ -240,6 +246,9 @@

         decrementHTLAtMaximum = node.random.nextFloat() < 
Node.DECREMENT_AT_MAX_PROB;
         decrementHTLAtMinimum = node.random.nextFloat() < 
Node.DECREMENT_AT_MIN_PROB;
+
+        // FIXME maybe a simple binary RA would be better?
+        pRejectOverload = new SimpleRunningAverage(100, 0.05);
     }

     private void randomizeMaxTimeBetweenPacketSends() {
@@ -917,4 +926,24 @@
     public int hashCode() {
         return hashCode;
     }
+
+    /**
+     * Record the fact that the node rejected a request due to
+     * overload (or timed out etc).
+     */
+       public void rejectedOverload() {
+               pRejectOverload.report(1.0);
+       }
+
+       /**
+        * Record the fact that the node did not reject a request
+        * due to overload.
+        */
+       public void didNotRejectOverload() {
+               pRejectOverload.report(0.0);
+       }
+
+       public double getPRejectedOverload() {
+               return pRejectOverload.currentValue();
+       }
 }

Modified: trunk/freenet/src/freenet/node/TextModeClientInterface.java
===================================================================
--- trunk/freenet/src/freenet/node/TextModeClientInterface.java 2005-11-17 
23:56:37 UTC (rev 7551)
+++ trunk/freenet/src/freenet/node/TextModeClientInterface.java 2005-11-18 
01:04:54 UTC (rev 7552)
@@ -229,6 +229,9 @@
                System.out.println("Error: "+e.getMessage());
                if(e.uri != null)
                        System.out.println("URI would have been: "+e.uri);
+               if(e.mode == e.FATAL_ERRORS_IN_BLOCKS || e.mode == 
e.TOO_MANY_RETRIES_IN_BLOCKS) {
+                       System.out.println("Splitfile-specific 
error:\n"+e.errorCodes.toVerboseString());
+               }
                return;
             }

@@ -314,7 +317,8 @@
             System.out.println("New name: "+key);
             n.setName(key);
         } else {
-            printHeader();
+               if(uline.length() > 0)
+                       printHeader();
         }
     }


Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2005-11-17 23:56:37 UTC (rev 
7551)
+++ trunk/freenet/src/freenet/node/Version.java 2005-11-18 01:04:54 UTC (rev 
7552)
@@ -20,10 +20,10 @@
        public static final String protocolVersion = "1.0";

        /** The build number of the current revision */
-       public static final int buildNumber = 187;
+       public static final int buildNumber = 188;

        /** Oldest build of Fred we will talk to */
-       public static final int lastGoodBuild = 187;
+       public static final int lastGoodBuild = 188;

        /** The highest reported build of fred */
        public static int highestSeenBuild = buildNumber;


Reply via email to