Author: toad
Date: 2008-08-13 12:06:59 +0000 (Wed, 13 Aug 2008)
New Revision: 21792

Modified:
   branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
Log:
Eliminate starterQueueLength. It's not practical to keep it up to date.


Modified: 
branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2008-08-13 12:01:34 UTC (rev 21791)
+++ branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2008-08-13 12:06:59 UTC (rev 21792)
@@ -568,9 +568,6 @@

        private transient LinkedList<PersistentChosenRequest> starterQueue = 
new LinkedList<PersistentChosenRequest>();

-       /** Length of the starter queue in requests. */
-       private transient int starterQueueLength;
-       
        /**
         * Called by RequestStarter to find a request to run.
         */
@@ -590,7 +587,7 @@
                                return 
getBetterNonPersistentRequest(Short.MAX_VALUE, Integer.MAX_VALUE);
                        }
                        ChosenBlock block;
-                       int length = starterQueueLength;
+                       int finalLength = 0;
                        synchronized(starterQueue) {
                                block = 
reqGroup.grabNotStarted(clientContext.fastWeakRandom);
                                if(block == null) {
@@ -598,13 +595,14 @@
                                                if(starterQueue.get(i) == 
reqGroup) {
                                                        starterQueue.remove(i);
                                                        i--;
+                                               } else {
+                                                       finalLength += 
starterQueue.get(i).sizeNotStarted();
                                                }
                                        }
                                        continue;
                                }
-                               starterQueueLength--;
                        }
-                       if(length < MAX_STARTER_QUEUE_SIZE)
+                       if(finalLength < MAX_STARTER_QUEUE_SIZE)
                                queueFillRequestStarterQueue();
                        if(logMINOR)
                                Logger.minor(this, "grabRequest() returning 
"+block);
@@ -613,11 +611,18 @@
        }

        public void queueFillRequestStarterQueue() {
+               if(starterQueueLength() > MAX_STARTER_QUEUE_SIZE / 2)
+                       return;
+               jobRunner.queue(requestStarterQueueFiller, 
NativeThread.MAX_PRIORITY, true);
+       }
+
+       private int starterQueueLength() {
+               int length = 0;
                synchronized(starterQueue) {
-                       if(starterQueueLength > MAX_STARTER_QUEUE_SIZE / 2)
-                               return;
+                       for(PersistentChosenRequest request : starterQueue)
+                               length += request.sizeNotStarted();
                }
-               jobRunner.queue(requestStarterQueueFiller, 
NativeThread.MAX_PRIORITY, true);
+               return length;
        }

        /**
@@ -632,9 +637,10 @@
                synchronized(starterQueue) {
                        // Since we pass in runningPersistentRequests, we don't 
need to check whether it is already in the starterQueue.
                        starterQueue.add(chosen);
-                       starterQueueLength += chosen.sizeNotStarted();
+                       int length = starterQueueLength();
+                       length += chosen.sizeNotStarted();
                        runningPersistentRequests.add(request);
-                       return starterQueueLength < MAX_STARTER_QUEUE_SIZE;
+                       return length < MAX_STARTER_QUEUE_SIZE;
                }
        }

@@ -660,17 +666,13 @@
                                int length = 0;
                                for(PersistentChosenRequest req : starterQueue)
                                        length += req.sizeNotStarted();
-                               if(length != starterQueueLength) {
-                                       Logger.error(this, "Correcting 
starterQueueLength from "+starterQueueLength+" to "+length);
-                                       starterQueueLength = length;
-                               }
                                if(logMINOR) Logger.minor(this, "Queue size: 
"+length+" SSK="+isSSKScheduler+" insert="+isInsertScheduler);
-                               if(starterQueueLength > MAX_STARTER_QUEUE_SIZE 
* 3 / 4) {
+                               if(length >= MAX_STARTER_QUEUE_SIZE) {
+                                       if(length >= WARNING_STARTER_QUEUE_SIZE)
+                                               Logger.error(this, "Queue 
already full: "+starterQueue.size());
                                        return;
                                }
-                               if(starterQueueLength >= 
MAX_STARTER_QUEUE_SIZE) {
-                                       if(starterQueueLength >= 
WARNING_STARTER_QUEUE_SIZE)
-                                               Logger.error(this, "Queue 
already full: "+starterQueue.size());
+                               if(length > MAX_STARTER_QUEUE_SIZE * 3 / 4) {
                                        return;
                                }
                        }
@@ -713,7 +715,8 @@
        private void trimStarterQueue(ObjectContainer container) {
                ArrayList<PersistentChosenRequest> dumped = null;
                synchronized(starterQueue) {
-                       while(starterQueueLength > MAX_STARTER_QUEUE_SIZE) {
+                       int length = starterQueueLength();
+                       while(length > MAX_STARTER_QUEUE_SIZE) {
                                // Find the lowest priority/retry count request.
                                // If we can dump it without going below the 
limit, then do so.
                                // If we can't, return.
@@ -721,27 +724,28 @@
                                short worstPrio = -1;
                                int worstRetryCount = -1;
                                int worstIndex = -1;
+                               int worstLength = -1;
                                if(starterQueue.isEmpty()) {
-                                       if(starterQueueLength != 0) {
-                                               Logger.error(this, "Starter 
queue empty but starterQueueLength is "+starterQueueLength);
-                                               starterQueueLength = 0;
-                                       }
                                        break;
                                }
+                               length = 0;
                                for(int i=0;i<starterQueue.size();i++) {
                                        PersistentChosenRequest req = 
starterQueue.get(i);
                                        short prio = req.prio;
                                        int retryCount = req.retryCount;
+                                       int size = req.sizeNotStarted();
+                                       length += size;
                                        if(prio > worstPrio ||
                                                        (prio == worstPrio && 
retryCount > worstRetryCount)) {
                                                worstPrio = prio;
                                                worstRetryCount = retryCount;
                                                worst = req;
                                                worstIndex = i;
+                                               worstLength = size;
                                                continue;
                                        }
                                }
-                               int lengthAfter = starterQueueLength - 
worst.sizeNotStarted();
+                               int lengthAfter = length - worstLength;
                                if(lengthAfter >= MAX_STARTER_QUEUE_SIZE) {
                                        if(dumped == null)
                                                dumped = new 
ArrayList<PersistentChosenRequest>(2);


Reply via email to