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 {
