Author: toad
Date: 2008-07-04 14:53:20 +0000 (Fri, 04 Jul 2008)
New Revision: 20997

Modified:
   branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
Log:
Risky optimisation: if the starter queue is less than 25% full, attempt to add 
newly registered requests directly to it, storing a PersistentChosenRequest and 
bypassing the queue registration.

Modified: 
branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2008-07-04 14:33:45 UTC (rev 20996)
+++ branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2008-07-04 14:53:20 UTC (rev 20997)
@@ -382,6 +382,11 @@
                }
                finishRegister(getter, persistent, false, anyValid, reg);
        }
+       
+       /** If enabled, if the queue is less than 25% full, attempt to add 
newly 
+        * registered requests directly to it, storing a 
PersistentChosenRequest and 
+        * bypassing registration on the queue. Risky optimisation. */
+       static final boolean TRY_DIRECT = true;

        private void finishRegister(final SendableRequest req, boolean 
persistent, boolean onDatabaseThread, final boolean anyValid, final RegisterMe 
reg) {
                if(persistent) {
@@ -392,10 +397,40 @@
                                }
                                if(persistent)
                                        selectorContainer.activate(req, 1);
+                               boolean tryDirect = false;
+                               if(anyValid && TRY_DIRECT) {
+                                       synchronized(starterQueue) {
+                                               tryDirect = starterQueue.size() 
< MAX_STARTER_QUEUE_SIZE * 1 / 4;
+                                       }
+                                       if(tryDirect) {
+                                               while(true) {
+                                                       PersistentChosenRequest 
cr = (PersistentChosenRequest) schedCore.maybeMakeChosenRequest(req, 
selectorContainer, clientContext);
+                                                       if(cr == null) {
+                                                               
if(!(req.isEmpty(selectorContainer) || req.isCancelled(selectorContainer)))
+                                                                       // 
Still needs to be registered
+                                                                       
tryDirect = false;
+                                                               break;
+                                                       }
+                                                       
synchronized(starterQueue) {
+                                                               
if(starterQueue.size() >= MAX_STARTER_QUEUE_SIZE) {
+                                                                       break;
+                                                               }
+                                                               
starterQueue.add(cr);
+                                                       }
+                                               }
+                                       }
+                               }
                                if(logMINOR)
                                        Logger.minor(this, "finishRegister() 
for "+req);
-                               if(anyValid)
-                                       schedCore.innerRegister(req, random, 
selectorContainer);
+                               if(anyValid) {
+                                       if(!tryDirect) {
+                                               
if(req.isCancelled(selectorContainer) || req.isEmpty(selectorContainer)) {
+                                                       Logger.error(this, 
"Request is empty/cancelled: "+req);
+                                               } else {
+                                                       
schedCore.innerRegister(req, random, selectorContainer);
+                                               }
+                                       }
+                               }
                                if(reg != null)
                                        selectorContainer.delete(reg);
                                maybeFillStarterQueue(selectorContainer, 
clientContext);


Reply via email to