Author: toad
Date: 2008-08-28 19:16:13 +0000 (Thu, 28 Aug 2008)
New Revision: 22202

Modified:
   
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerBase.java
Log:
Factor out allRequestsByClientRequest operations into separate methods, further 
refactoring to get rid of the last Db4oMap soon.
More consistent locking.


Modified: 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerBase.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerBase.java  
    2008-08-28 19:08:32 UTC (rev 22201)
+++ 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerBase.java  
    2008-08-28 19:16:13 UTC (rev 22202)
@@ -17,6 +17,7 @@
 import freenet.keys.KeyBlock;
 import freenet.keys.NodeSSK;
 import freenet.node.BaseSendableGet;
+import freenet.node.RequestClient;
 import freenet.node.RequestScheduler;
 import freenet.node.RequestStarter;
 import freenet.node.SendableGet;
@@ -88,6 +89,15 @@
                int retryCount = req.getRetryCount();
                short prio = req.getPriorityClass(container);
                if(logMINOR) Logger.minor(this, "Still registering "+req+" at 
prio "+prio+" retry "+retryCount+" for "+req.getClientRequest());
+               addToRequestsByClientRequest(req.getClientRequest(), req, 
container);
+               addToGrabArray(prio, retryCount, fixRetryCount(retryCount), 
req.getClient(), req.getClientRequest(), req, random, container);
+               if(logMINOR) Logger.minor(this, "Registered "+req+" on 
prioclass="+prio+", retrycount="+retryCount);
+               if(persistent())
+                       sched.maybeAddToStarterQueue(req, container);
+       }
+       
+       protected void addToRequestsByClientRequest(ClientRequester 
clientRequest, SendableRequest req, ObjectContainer container) {
+               synchronized(sched) {
                Set v = (Set) 
allRequestsByClientRequest.get(req.getClientRequest());
                if(persistent())
                        container.activate(v, 1);
@@ -99,13 +109,12 @@
                int vSize = v.size();
                if(persistent())
                        container.deactivate(v, 1);
-               addToGrabArray(prio, retryCount, fixRetryCount(retryCount), 
req.getClient(), req.getClientRequest(), req, random, container);
-               if(logMINOR) Logger.minor(this, "Registered "+req+" on 
prioclass="+prio+", retrycount="+retryCount+" v.size()="+vSize);
-               if(persistent())
-                       sched.maybeAddToStarterQueue(req, container);
+               if(logMINOR)
+                       Logger.minor(this, "Added to allRequestsByClientRequest 
for "+clientRequest+" size now "+v.size());
+               }
        }
-       
-       synchronized void addToGrabArray(short priorityClass, int retryCount, 
int rc, Object client, ClientRequester cr, SendableRequest req, RandomSource 
random, ObjectContainer container) {
+
+       synchronized void addToGrabArray(short priorityClass, int retryCount, 
int rc, RequestClient client, ClientRequester cr, SendableRequest req, 
RandomSource random, ObjectContainer container) {
                if((priorityClass > RequestStarter.MINIMUM_PRIORITY_CLASS) || 
(priorityClass < RequestStarter.MAXIMUM_PRIORITY_CLASS))
                        throw new IllegalStateException("Invalid priority: 
"+priorityClass+" - range is "+RequestStarter.MAXIMUM_PRIORITY_CLASS+" (most 
important) to "+RequestStarter.MINIMUM_PRIORITY_CLASS+" (least important)");
                // Priority
@@ -153,17 +162,8 @@
        }

        public void reregisterAll(ClientRequester request, RandomSource random, 
RequestScheduler lock, ObjectContainer container, ClientContext context) {
-               SendableRequest[] reqs;
-               synchronized(lock) {
-                       Set h = (Set) allRequestsByClientRequest.get(request);
-                       if(h == null) return;
-                       if(persistent())
-                               container.activate(h, 1);
-                       reqs = (SendableRequest[]) h.toArray(new 
SendableRequest[h.size()]);
-                       if(persistent())
-                               container.deactivate(h, 1);
-               }
-               
+               SendableRequest[] reqs = getSendableRequests(request, 
container);
+               if(reqs == null) return;
                for(int i=0;i<reqs.length;i++) {
                        SendableRequest req = reqs[i];
                        if(persistent())
@@ -177,6 +177,19 @@
                }
        }

+       private SendableRequest[] getSendableRequests(ClientRequester request, 
ObjectContainer container) {
+               synchronized(sched) {
+                       Set h = (Set) allRequestsByClientRequest.get(request);
+                       if(h == null) return null;
+                       if(persistent())
+                               container.activate(h, 1);
+                       SendableRequest[] reqs = (SendableRequest[]) 
h.toArray(new SendableRequest[h.size()]);
+                       if(persistent())
+                               container.deactivate(h, 1);
+                       return reqs;
+               }
+       }
+
        public void succeeded(BaseSendableGet succeeded, ObjectContainer 
container) {
                if(isInsertScheduler) return;
                if(persistent()) {
@@ -191,6 +204,7 @@
        }

        protected void removeFromAllRequestsByClientRequest(SendableRequest 
req, ClientRequester cr, boolean dontComplain, ObjectContainer container) {
+               synchronized(sched) {
                if(logMINOR)
                        Logger.minor(this, "Removing from 
allRequestsByClientRequest: "+req+ " for "+cr);
                        Set v = (Set) allRequestsByClientRequest.get(cr);
@@ -210,6 +224,7 @@
                                }
                                if(logMINOR) Logger.minor(this, (removed ? "" : 
"Not ") + "Removed "+req+" from HashSet for "+cr+" which now has "+vSize+" 
elements");
                        }
+               }
        }

        public synchronized void addPendingKeys(KeyListener listener) {


Reply via email to