Author: toad
Date: 2008-05-29 23:43:06 +0000 (Thu, 29 May 2008)
New Revision: 20140

Modified:
   branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
   
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
Log:
Persistent requests: Add pending keys all at once, just before adding the job 
to queue the request.

Modified: 
branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2008-05-29 23:16:32 UTC (rev 20139)
+++ branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2008-05-29 23:43:06 UTC (rev 20140)
@@ -3,6 +3,8 @@
  * http://www.gnu.org/ for further details of the GPL. */
 package freenet.client.async;

+import java.util.Vector;
+
 import com.db4o.ObjectContainer;

 import freenet.config.EnumerableOptionCallback;
@@ -150,6 +152,8 @@
        public void register(final SendableRequest req, boolean 
onDatabaseThread) {
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                if(logMINOR) Logger.minor(this, "Registering "+req, new 
Exception("debug"));
+               boolean persistent = req.persistent();
+               Vector pending = null;
                if(isInsertScheduler != (req instanceof SendableInsert))
                        throw new IllegalArgumentException("Expected a 
SendableInsert: "+req);
                if(req instanceof SendableGet) {
@@ -172,7 +176,13 @@
                                                        if(block == null)
                                                                block = 
node.fetchKey(key, getter.dontCache());
                                                        if(block == null) {
-                                                               
addPendingKey(key, getter);
+                                                               if(persistent) {
+                                                                       
if(pending == null)
+                                                                               
pending = new Vector(keyTokens.length - i);
+                                                                       
pending.add(key);
+                                                               } else {
+                                                                       
schedTransient.addPendingKey(key, getter);
+                                                               }
                                                        } else {
                                                                if(logMINOR)
                                                                        
Logger.minor(this, "Got "+block);
@@ -205,16 +215,23 @@
                                }
                        }
                }
-               if(req.persistent()) {
+               if(persistent) {
                        // Add to the persistent registration queue
                        if(onDatabaseThread) {
                                if(!databaseExecutor.onThread()) {
                                        throw new IllegalStateException("Not on 
database thread!");
                                }
+                               if(pending != null)
+                                       schedCore.addPendingKeys(pending, 
(SendableGet) req);
                                schedCore.queueRegister(req, databaseExecutor);
                        } else {
+                               final Vector pendingKeys = pending;
+                               if(pending != null)
+                                       pending.setSize(pending.size());
                                databaseExecutor.execute(new Runnable() {
                                        public void run() {
+                                               if(pendingKeys != null)
+                                                       
schedCore.addPendingKeys(pendingKeys, (SendableGet) req);
                                                schedCore.queueRegister(req, 
databaseExecutor);
                                        }
                                }, NativeThread.NORM_PRIORITY, "Add persistent 
job to queue");

Modified: 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java  
    2008-05-29 23:16:32 UTC (rev 20139)
+++ 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java  
    2008-05-29 23:43:06 UTC (rev 20140)
@@ -4,6 +4,7 @@
 package freenet.client.async;

 import java.util.List;
+import java.util.Vector;

 import com.db4o.ObjectContainer;
 import com.db4o.ObjectSet;
@@ -13,6 +14,7 @@
 import com.db4o.types.Db4oMap;

 import freenet.crypt.RandomSource;
+import freenet.keys.ClientKey;
 import freenet.node.BaseSendableGet;
 import freenet.node.Node;
 import freenet.node.RequestStarter;
@@ -366,9 +368,12 @@
                container.set(reg);
                databaseExecutor.execute(registerMeRunner, 
NativeThread.NORM_PRIORITY, "Register request");
        }
+
+       public void addPendingKeys(Vector keys, SendableGet req) {
+               for(int i=0;i<keys.size();i++)
+                       addPendingKey((ClientKey) keys.get(i), req);
+       }

-       
-       
 }

 class RegisterMe {


Reply via email to