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
>