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);