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


Reply via email to