On Wed, May 21, 2008 at 7:10 AM,  <toad at freenetproject.org> wrote:
> Author: toad
> Date: 2008-05-20 23:10:04 +0000 (Tue, 20 May 2008)
> New Revision: 19992
>
> Modified:
>   branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
> Log:
> Ask both the transient and non-transient scheduler, or choose which one 
> depending on whether the request is transient.
>
> Modified: 
> branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
> ===================================================================
> --- 
> branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java  
> 2008-05-20 23:04:40 UTC (rev 19991)
> +++ 
> branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java  
> 2008-05-20 23:10:04 UTC (rev 19992)
> @@ -199,7 +199,10 @@
>        }
>
>        void addPendingKey(ClientKey key, SendableGet getter) {
> -               schedCore.addPendingKey(key, getter);
> +               if(getter.persistent())
> +                       schedCore.addPendingKey(key, getter);
> +               else
> +                       schedTransient.addPendingKey(key, getter);
>        }
>
>        public synchronized SendableRequest removeFirst() {
> @@ -214,7 +217,9 @@
>        }
>
>        public void removePendingKey(SendableGet getter, boolean complain, Key 
> key) {
> -               boolean dropped = schedCore.removePendingKey(getter, 
> complain, key);
> +               boolean dropped =
> +                       schedCore.removePendingKey(getter, complain, key) ||
> +                       schedTransient.removePendingKey(getter, complain, 
> key);

Should we try schedTransient first?
schedCore may need disk access

>                if(dropped && offeredKeys != null && !node.peersWantKey(key)) {
>                        for(int i=0;i<offeredKeys.length;i++)
>                                offeredKeys[i].remove(key);
> @@ -265,14 +270,26 @@
>                }
>                final Key key = block.getKey();
>                final SendableGet[] gets = schedCore.removePendingKey(key);
> +               final SendableGet[] transientGets = 
> schedTransient.removePendingKey(key);
>                if(gets == null) return;
> -               if(cooldownQueue != null)
> +               if(cooldownQueue != null) {
>                        for(int i=0;i<gets.length;i++)
>                                cooldownQueue.removeKey(key, gets[i], 
> gets[i].getCooldownWakeupByKey(key));
> +                       for(int i=0;i<gets.length;i++)
> +                               cooldownQueue.removeKey(key, 
> transientGets[i], transientGets[i].getCooldownWakeupByKey(key));
> +               }
>
>                Runnable r = new Runnable() {
>                        public void run() {
>                                if(logMINOR) Logger.minor(this, "Running 
> "+gets.length+" callbacks off-thread for "+block.getKey());
> +                               for(int i=0;i<transientGets.length;i++) {
> +                                       try {
> +                                               if(logMINOR) 
> Logger.minor(this, "Calling callback for "+transientGets[i]+" for "+key);
> +                                               
> transientGets[i].onGotKey(key, block, ClientRequestScheduler.this);
> +                                       } catch (Throwable t) {
> +                                               Logger.error(this, "Caught 
> "+t+" running callback "+transientGets[i]+" for "+key);
> +                                       }
> +                               }
>                                for(int i=0;i<gets.length;i++) {
>                                        try {
>                                                if(logMINOR) 
> Logger.minor(this, "Calling callback for "+gets[i]+" for "+key);
> @@ -288,7 +305,7 @@
>        }
>
>        public boolean anyWantKey(Key key) {
> -               return schedCore.anyWantKey(key);
> +               return schedCore.anyWantKey(key) || 
> schedTransient.anyWantKey(key);

same here

>        }
>
>        /** If we want the offered key, or if force is enabled, queue it */
> @@ -301,6 +318,7 @@
>                        priority = 
> RequestStarter.IMMEDIATE_SPLITFILE_PRIORITY_CLASS;
>                }
>                priority = schedCore.getKeyPrio(key, priority);
> +               priority = schedTransient.getKeyPrio(key, priority);
>                if(priority == Short.MAX_VALUE) return;
>                if(logMINOR)
>                        Logger.minor(this, "Priority: "+priority);
> @@ -325,18 +343,24 @@
>                while((key = cooldownQueue.removeKeyBefore(now)) != null) {
>                        if(logMINOR) Logger.minor(this, "Restoring key: "+key);
>                        SendableGet[] gets = 
> schedCore.getClientsForPendingKey(key);
> -                       if(gets == null) {
> +                       SendableGet[] transientGets = 
> schedTransient.getClientsForPendingKey(key);
> +                       if(gets == null && transientGets == null) {
>                                // Not an error as this can happen due to race 
> conditions etc.
>                                if(logMINOR) Logger.minor(this, "Restoring key 
> but no keys queued?? for "+key);
>                                continue;
>                        } else {
> +                               if(gets != null)
>                                for(int i=0;i<gets.length;i++)
>                                        gets[i].requeueAfterCooldown(key, now);
> +                               if(transientGets != null)
> +                               for(int i=0;i<transientGets.length;i++)
> +                                       
> transientGets[i].requeueAfterCooldown(key, now);
>                        }
>                }
>        }
>
>        public long countQueuedRequests() {
> -               return schedCore.countQueuedRequests();
> +               // Approximately... there might be some overlap in the two 
> pendingKeys's...
> +               return schedCore.countQueuedRequests() + 
> schedTransient.countQueuedRequests();
>        }
>  }
>
> _______________________________________________
> cvs mailing list
> cvs at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs
>

Reply via email to