Author: toad
Date: 2008-06-21 17:52:52 +0000 (Sat, 21 Jun 2008)
New Revision: 20597

Modified:
   branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
   
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
   branches/db4o/freenet/src/freenet/node/RequestStarter.java
Log:
Don't query for the RegisterMe, pass it in and delete it.

Modified: 
branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2008-06-21 17:28:46 UTC (rev 20596)
+++ branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2008-06-21 17:52:52 UTC (rev 20597)
@@ -156,10 +156,13 @@
        }

        public void register(final SendableRequest req) {
-               register(req, databaseExecutor.onThread());
+               register(req, databaseExecutor.onThread(), null);
        }

-       public void register(final SendableRequest req, boolean 
onDatabaseThread) {
+       /**
+        * Register and then delete the RegisterMe which is passed in to avoid 
querying.
+        */
+       public void register(final SendableRequest req, boolean 
onDatabaseThread, final RegisterMe reg) {
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                if(logMINOR) Logger.minor(this, "Registering "+req, new 
Exception("debug"));
                boolean persistent = req.persistent();
@@ -178,7 +181,7 @@
                                datastoreCheckerExecutor.execute(new Runnable() 
{

                                        public void run() {
-                                               registerCheckStore(getter, 
true, keyTokens, keys);
+                                               registerCheckStore(getter, 
true, keyTokens, keys, reg);
                                        }

                                }, getter.getPriorityClass(), "Checking 
datastore");
@@ -195,7 +198,7 @@
                                                
datastoreCheckerExecutor.execute(new Runnable() {

                                                        public void run() {
-                                                               
registerCheckStore(getter, true, keyTokens, keys);
+                                                               
registerCheckStore(getter, true, keyTokens, keys, reg);
                                                        }

                                                }, getter.getPriorityClass(), 
"Checking datastore");
@@ -213,7 +216,7 @@
                                datastoreCheckerExecutor.execute(new Runnable() 
{

                                        public void run() {
-                                               registerCheckStore(getter, 
false, keyTokens, keys);
+                                               registerCheckStore(getter, 
false, keyTokens, keys, null);
                                        }

                                }, getter.getPriorityClass(), "Checking 
datastore");
@@ -224,7 +227,7 @@
                        // Pretend to not be on the database thread.
                        // In some places (e.g. SplitFileInserter.start(), we 
call register() *many* times within a single transaction.
                        // We can greatly improve responsiveness at the cost of 
some throughput and RAM by only adding the tags at this point.
-                       finishRegister(req, persistent, false, true);
+                       finishRegister(req, persistent, false, true, reg);
                }
        }

@@ -234,8 +237,9 @@
         * (for a persistent request) queue a job on the databaseExecutor and 
(for a transient 
         * request) finish registering the request immediately.
         * @param getter
+        * @param reg 
         */
-       protected void registerCheckStore(SendableGet getter, boolean 
persistent, Object[] keyTokens, ClientKey[] keys) {
+       protected void registerCheckStore(SendableGet getter, boolean 
persistent, Object[] keyTokens, ClientKey[] keys, RegisterMe reg) {
                boolean anyValid = false;
                for(int i=0;i<keyTokens.length;i++) {
                        Object tok = keyTokens[i];
@@ -305,10 +309,10 @@
                                anyValid = true;
                        }
                }
-               finishRegister(getter, persistent, false, anyValid);
+               finishRegister(getter, persistent, false, anyValid, reg);
        }

-       private void finishRegister(final SendableRequest req, boolean 
persistent, boolean onDatabaseThread, final boolean anyValid) {
+       private void finishRegister(final SendableRequest req, boolean 
persistent, boolean onDatabaseThread, final boolean anyValid, final RegisterMe 
reg) {
                if(persistent) {
                        // Add to the persistent registration queue
                        if(onDatabaseThread) {
@@ -317,7 +321,7 @@
                                }
                                if(anyValid)
                                        schedCore.innerRegister(req, random, 
selectorContainer);
-                               schedCore.deleteRegisterMe(req);
+                               selectorContainer.delete(reg);
                                starter.wakeUp();
                        } else {
                                jobRunner.queue(new DBJob() {
@@ -325,7 +329,7 @@
                                        public void run(ObjectContainer 
container, ClientContext context) {
                                                if(anyValid)
                                                        
schedCore.innerRegister(req, random, container);
-                                               schedCore.deleteRegisterMe(req);
+                                               container.delete(reg);
                                        }

                                }, NativeThread.NORM_PRIORITY, false);
@@ -373,7 +377,7 @@
                return schedCore.removeFirst(fuzz, random, offeredKeys, 
starter, schedTransient, true, prio, retryCount, clientContext);
        }

-       private static final int MAX_STARTER_QUEUE_SIZE = 10;
+       private static final int MAX_STARTER_QUEUE_SIZE = 100;

        private LinkedList starterQueue = new LinkedList();


Modified: 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java  
    2008-06-21 17:28:46 UTC (rev 20596)
+++ 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java  
    2008-06-21 17:52:52 UTC (rev 20597)
@@ -461,7 +461,7 @@
                                container.delete(reg);
                                // Don't need to activate, fields should exist? 
FIXME
                                try {
-                                       sched.register(reg.getter, true);
+                                       sched.register(reg.getter, true, reg);
                                } catch (Throwable t) {
                                        Logger.error(this, "Caught "+t+" 
running RegisterMeRunner", t);
                                        // Cancel the request, and commit so it 
isn't tried again.
@@ -481,20 +481,6 @@
                container.set(reg);
        }

-       public void deleteRegisterMe(final SendableRequest req) {
-               ObjectSet result = container.query(new Predicate() {
-                       public boolean match(RegisterMe reg) {
-                               if(reg.core != ClientRequestSchedulerCore.this) 
return false;
-                               if(reg.getter != req) return false;
-                               return true;
-                       }
-               });
-               while(result.hasNext()) {
-                       RegisterMe me = (RegisterMe) result.next();
-                       container.delete(me);
-               }
-       }
-       
        public boolean hasKey(Key key) {
                synchronized(keysFetching) {
                        return keysFetching.contains(key);

Modified: branches/db4o/freenet/src/freenet/node/RequestStarter.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/RequestStarter.java  2008-06-21 
17:28:46 UTC (rev 20596)
+++ branches/db4o/freenet/src/freenet/node/RequestStarter.java  2008-06-21 
17:52:52 UTC (rev 20597)
@@ -122,7 +122,7 @@
                        sched.moveKeysFromCooldownQueue();
                        boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
                        if(req == null) {
-                               req = getRequest();
+                               req = getRequest(logMINOR);
                        }
                        if(req != null) {
                                if(logMINOR) Logger.minor(this, "Running "+req);
@@ -162,7 +162,7 @@
                                // Always take the lock on RequestStarter 
first. AFAICS we don't synchronize on RequestStarter anywhere else.
                                // Nested locks here prevent extra latency when 
there is a race, and therefore allow us to sleep indefinitely
                                synchronized(this) {
-                                       req = getRequest();
+                                       req = getRequest(logMINOR);
                                        if(req == null) {
                                                try {
                                                        wait(1*1000); // as 
close to indefinite as I'm comfortable with! Toad
@@ -192,7 +192,7 @@
         * thread is probably doing other things so we have to wait for that to 
finish).
         * @return
         */
-       private ChosenRequest getRequest() {
+       private ChosenRequest getRequest(boolean logMINOR) {
                boolean usedReq = true;
                ChosenRequest req = null;
                while(true) {
@@ -219,11 +219,14 @@
                }
                if(usedReq || req == null)
                        sched.queueFillRequestStarterQueue();
+               if(req == null)
+               if(req == null && logMINOR) Logger.minor(this, "No requests 
found");
                return req;
        }

        private boolean startRequest(ChosenRequest req, boolean logMINOR) {
                if((!isInsert) && sched.fetchingKeys().hasKey(req.key)) return 
false;
+               if(logMINOR) Logger.minor(this, "Running request "+req);
                core.getExecutor().execute(new SenderThread(req, req.key), 
"RequestStarter$SenderThread for "+req);
                return true;
        }


Reply via email to