Author: nextgens
Date: 2006-06-17 22:18:02 +0000 (Sat, 17 Jun 2006)
New Revision: 9278
Modified:
trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
trunk/freenet/src/freenet/node/Node.java
Log:
A new request scheduler is aviable ... I don't think that performances will be
good for now it misses a loop
Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
2006-06-17 22:16:42 UTC (rev 9277)
+++ trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
2006-06-17 22:18:02 UTC (rev 9278)
@@ -38,6 +38,17 @@
private final RequestStarter starter;
private final Node node;
+ // FIXME : shoudln't be hardcoded !
+ private int[] prioritySelecter = {
+ 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1,
+ 2, 2, 2, 2, 2,
+ 3, 3, 3, 3,
+ 4, 4, 4,
+ 5, 5,
+ 6
+ };
+
public ClientRequestScheduler(boolean forInserts, boolean forSSKs,
RandomSource random, RequestStarter starter, Node node) {
this.starter = starter;
this.random = random;
@@ -108,7 +119,61 @@
}
public synchronized SendableRequest removeFirst() {
+ if(node.currentScheduler == Node.SCHEDULER_IMPROVED_1)
+ return improved_scheduler_1_removeFirst();
+ else
+ return default_Scheduler_removeFirst();
+ }
+
+ public SendableRequest improved_scheduler_1_removeFirst() {
// Priorities start at 0
+ // Maybe we should retry ... we were looping previously
+ Logger.minor(this, "removeFirst() (improved_1)");
+ int i = random.nextInt(prioritySelecter.length);
+ SortedVectorByNumber s = priorities[prioritySelecter[i]];
+ if(s == null) {
+ Logger.minor(this, "Priority "+prioritySelecter[i]+" is
null");
+ return null;
+ }
+
+ i=prioritySelecter[i];
+
+ SectoredRandomGrabArrayWithInt rga =
(SectoredRandomGrabArrayWithInt) s.getFirst(); // will discard finished items
+ if(rga == null) {
+ Logger.minor(this, "No retrycount's in priority "+i);
+ priorities[i] = null;
+ return null;
+ }
+ SendableRequest req = (SendableRequest) rga.removeRandom();
+ if(rga.isEmpty()) {
+ Logger.minor(this, "Removing retrycount
"+rga.getNumber());
+ s.remove(rga.getNumber());
+ if(s.isEmpty()) {
+ Logger.minor(this, "Removing priority "+i);
+ priorities[i] = null;
+ }
+ }
+ if(req == null) {
+ Logger.minor(this, "No requests in priority "+i+",
retrycount "+rga.getNumber()+" ("+rga+")");
+ return null;
+ }
+ if(req.getPriorityClass() > i) {
+ // Reinsert it
+ Logger.minor(this, "In wrong priority class: "+req);
+ innerRegister(req);
+ return null;
+ }
+ Logger.minor(this, "removeFirst() returning "+req+"
("+rga.getNumber()+")");
+ ClientRequester cr = req.getClientRequest();
+ HashSet v = (HashSet) allRequestsByClientRequest.get(cr);
+ v.remove(req);
+ if(v.isEmpty())
+ allRequestsByClientRequest.remove(cr);
+ return req;
+ }
+
+ public SendableRequest default_Scheduler_removeFirst() {
+ // Priorities start at 0
Logger.minor(this, "removeFirst()");
for(int i=0;i<RequestStarter.MINIMUM_PRIORITY_CLASS;i++) {
SortedVectorByNumber s = priorities[i];
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2006-06-17 22:16:42 UTC (rev
9277)
+++ trunk/freenet/src/freenet/node/Node.java 2006-06-17 22:18:02 UTC (rev
9278)
@@ -42,6 +42,7 @@
import freenet.client.async.ClientGetter;
import freenet.client.async.ClientPutter;
import freenet.client.async.ClientRequestScheduler;
+import freenet.client.async.RequestScheduler;
import freenet.client.async.USKManager;
import freenet.clients.http.BookmarkManager;
import freenet.clients.http.FProxyToadlet;
@@ -415,6 +416,11 @@
* between the two, reject some packets. */
public static final long SUB_MAX_THROTTLE_DELAY = 1000;
+ public static final int SCHEDULER_DEFAULT = 0;
+ public static final int SCHEDULER_IMPROVED_1 = 1;
+
+ public final int currentScheduler;
+
/** Accept one request every 10 seconds regardless, to ensure we update
the
* block send time.
*/
@@ -1355,9 +1361,23 @@
nodeNameUserAlert = new MeaningfulNodeNameUserAlert();
myName = nodeConfig.getString("name");
- nodeConfig.finishedInitialization();
- writeNodeFile();
+ // Select the request scheduler
+
+ nodeConfig.register("scheduler", 0, 12, true, "Scheduler",
"Scheduler",
+ new IntCallback(){
+ public int get(){
+ return currentScheduler;
+ }
+
+ public void set(int val){
+ if(val == get()) return;
+ //FIXME: implement!
+ }
+ });
+
+ currentScheduler = nodeConfig.getInt("scheduler");
+
// FIXME make all the below arbitrary constants configurable!
archiveManager = new ArchiveManager(MAX_ARCHIVE_HANDLERS,
MAX_CACHED_ARCHIVE_DATA, MAX_ARCHIVE_SIZE, MAX_ARCHIVED_FILE_SIZE,
MAX_CACHED_ELEMENTS, random, tempFilenameGenerator);
@@ -1386,14 +1406,19 @@
sskPutScheduler = new ClientRequestScheduler(true, true,
random, sskInsertStarter, this);
sskInsertStarter.setScheduler(sskPutScheduler);
sskInsertStarter.start();
-
- Logger.normal(this, "Initializing USK Manager");
- System.out.println("Initializing USK Manager");
+
+
+ nodeConfig.finishedInitialization();
+ writeNodeFile();
+
+
+ Logger.normal(this, "Initializing USK Manager");
+ System.out.println("Initializing USK Manager");
uskManager = new USKManager(this);
// And finally, Initialize the plugin manager
- Logger.normal(this, "Initializing Plugin Manager");
- System.out.println("Initializing Plugin Manager");
+ Logger.normal(this, "Initializing Plugin Manager");
+ System.out.println("Initializing Plugin Manager");
pluginManager = new PluginManager(this);
FetcherContext ctx = makeClient((short)0).getFetcherContext();