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);
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);
}
/** 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();
}
}