Author: toad
Date: 2007-03-21 23:08:19 +0000 (Wed, 21 Mar 2007)
New Revision: 12261

Modified:
   trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
   trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
   trunk/freenet/src/freenet/node/RequestScheduler.java
   trunk/freenet/src/freenet/node/RequestStarter.java
   trunk/freenet/src/freenet/node/SendableGet.java
   trunk/freenet/src/freenet/node/SendableRequest.java
   trunk/freenet/src/freenet/node/SimpleSendableInsert.java
Log:
Implement FUQID-like promote-on-success.

Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2007-03-21 22:26:46 UTC (rev 12260)
+++ trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2007-03-21 23:08:19 UTC (rev 12261)
@@ -5,6 +5,7 @@

 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedList;

 import freenet.config.InvalidConfigValueException;
 import freenet.config.SubConfig;
@@ -80,6 +81,7 @@
        private final RequestStarter starter;
        private final Node node;
        public final String name;
+       private final LinkedList /* <RandomGrabArray> */ recentSuccesses = new 
LinkedList();

        public static final String PRIORITY_NONE = "NONE";
        public static final String PRIORITY_SOFT = "SOFT";
@@ -327,6 +329,30 @@
                                        innerRegister(req);
                                        continue;
                                }
+                               
+                               RandomGrabArray altRGA = null;
+                               synchronized(this) {
+                                       if(!recentSuccesses.isEmpty()) {
+                                               if(random.nextBoolean()) {
+                                                       altRGA = 
(RandomGrabArray) recentSuccesses.removeLast();
+                                               }
+                                       }
+                               }
+                               if(altRGA != null) {
+                                       SendableRequest altReq = 
(SendableRequest) (altRGA.removeRandom());
+                                       if(altReq != null && 
altReq.getPriorityClass() <= choosenPriorityClass && 
+                                                       altReq.getRetryCount() 
<= rga.getNumber()) {
+                                               // Use the recent one instead
+                                               innerRegister(req);
+                                               req = altReq;
+                                       } else {
+                                               synchronized(this) {
+                                                       
recentSuccesses.addLast(altRGA);
+                                               }
+                                               innerRegister(altReq);
+                                       }
+                               }
+                               
                                if(logMINOR) Logger.debug(this, "removeFirst() 
returning "+req+" ("+rga.getNumber()+", prio "+
                                                req.getPriorityClass()+", 
retries "+req.getRetryCount()+", client "+req.getClient()+", client-req 
"+req.getClientRequest()+ ')');
                                ClientRequester cr = req.getClientRequest();
@@ -371,4 +397,12 @@
        public String getChoosenPriorityScheduler() {
                return choosenPriorityScheduler;
        }
+
+       public void succeeded(RandomGrabArray parentGrabArray) {
+               synchronized(this) {
+                       recentSuccesses.addFirst(parentGrabArray);
+                       while(recentSuccesses.size() > 8)
+                               recentSuccesses.removeLast();
+               }
+       }
 }

Modified: trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleBlockInserter.java     
2007-03-21 22:26:46 UTC (rev 12260)
+++ trunk/freenet/src/freenet/client/async/SingleBlockInserter.java     
2007-03-21 23:08:19 UTC (rev 12261)
@@ -18,6 +18,7 @@
 import freenet.keys.SSKEncodeException;
 import freenet.node.LowLevelPutException;
 import freenet.node.NodeClientCore;
+import freenet.node.RequestScheduler;
 import freenet.node.SendableInsert;
 import freenet.support.Logger;
 import freenet.support.RandomGrabArray;
@@ -286,7 +287,7 @@
                return finished;
        }

-       public boolean send(NodeClientCore core) {
+       public boolean send(NodeClientCore core, RequestScheduler sched) {
                try {
                        if(logMINOR) Logger.minor(this, "Starting request: 
"+this);
                        ClientKeyBlock b = getBlock();

Modified: trunk/freenet/src/freenet/node/RequestScheduler.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestScheduler.java        2007-03-21 
22:26:46 UTC (rev 12260)
+++ trunk/freenet/src/freenet/node/RequestScheduler.java        2007-03-21 
23:08:19 UTC (rev 12261)
@@ -3,8 +3,17 @@
  * http://www.gnu.org/ for further details of the GPL. */
 package freenet.node;

+import freenet.support.RandomGrabArray;
+
 public interface RequestScheduler {

        public SendableRequest removeFirst();
+
+       /** Tell the scheduler that a request from a specific RandomGrabArray 
succeeded.
+        * Definition of "succeeded" will vary, but the point is most 
schedulers will run another
+        * request from the parentGrabArray in the near future on the theory 
that if one works,
+        * another may also work. 
+        * */
+       public void succeeded(RandomGrabArray parentGrabArray);

 }

Modified: trunk/freenet/src/freenet/node/RequestStarter.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestStarter.java  2007-03-21 22:26:46 UTC 
(rev 12260)
+++ trunk/freenet/src/freenet/node/RequestStarter.java  2007-03-21 23:08:19 UTC 
(rev 12261)
@@ -162,7 +162,7 @@
                }

                public void run() {
-                       if(!req.send(core))
+                       if(!req.send(core, sched))
                                Logger.normal(this, "run() not able to send a 
request");
                        if(Logger.shouldLog(Logger.MINOR, this)) 
                                Logger.minor(this, "Finished "+req);

Modified: trunk/freenet/src/freenet/node/SendableGet.java
===================================================================
--- trunk/freenet/src/freenet/node/SendableGet.java     2007-03-21 22:26:46 UTC 
(rev 12260)
+++ trunk/freenet/src/freenet/node/SendableGet.java     2007-03-21 23:08:19 UTC 
(rev 12261)
@@ -54,7 +54,7 @@
        /** Do the request, blocking. Called by RequestStarter. 
         * @return True if a request was executed. False if caller should try 
to find another request, and remove
         * this one from the queue. */
-       public boolean send(NodeClientCore core) {
+       public boolean send(NodeClientCore core, RequestScheduler sched) {
                FetchContext ctx = getContext();
                boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
                while(true) {
@@ -89,6 +89,7 @@
                                        return true;
                                }
                                onSuccess(block, false, keyNum);
+                               sched.succeeded(this.getParentGrabArray());
                        } catch (Throwable t) {
                                Logger.error(this, "Caught "+t, t);
                                onFailure(new 
LowLevelGetException(LowLevelGetException.INTERNAL_ERROR), keyNum);

Modified: trunk/freenet/src/freenet/node/SendableRequest.java
===================================================================
--- trunk/freenet/src/freenet/node/SendableRequest.java 2007-03-21 22:26:46 UTC 
(rev 12260)
+++ trunk/freenet/src/freenet/node/SendableRequest.java 2007-03-21 23:08:19 UTC 
(rev 12261)
@@ -19,9 +19,10 @@

        /** ONLY called by RequestStarter. Start the actual request using the 
NodeClientCore
         * provided. The request has been removed from the structure already, 
if canRemove().
+        * @param sched The scheduler this request has just been removed from.
         * @return True if a request was sent, false otherwise (in which case 
the request will
         * be removed if it hasn't already been). */
-       public abstract boolean send(NodeClientCore node);
+       public abstract boolean send(NodeClientCore node, RequestScheduler 
sched);

        /** Get client context object */
        public abstract Object getClient();

Modified: trunk/freenet/src/freenet/node/SimpleSendableInsert.java
===================================================================
--- trunk/freenet/src/freenet/node/SimpleSendableInsert.java    2007-03-21 
22:26:46 UTC (rev 12260)
+++ trunk/freenet/src/freenet/node/SimpleSendableInsert.java    2007-03-21 
23:08:19 UTC (rev 12261)
@@ -45,7 +45,7 @@
                return 0;
        }

-       public boolean send(NodeClientCore core) {
+       public boolean send(NodeClientCore core, RequestScheduler sched) {
                boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
                try {
                        if(logMINOR) Logger.minor(this, "Starting request: 
"+this);


Reply via email to