Author: toad
Date: 2008-05-22 18:30:05 +0000 (Thu, 22 May 2008)
New Revision: 20043
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
Log:
Use the new persistent cooldown queue.
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
2008-05-22 18:22:55 UTC (rev 20042)
+++ branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
2008-05-22 18:30:05 UTC (rev 20043)
@@ -90,7 +90,8 @@
private final RequestStarter starter;
private final Node node;
public final String name;
- private final CooldownQueue cooldownQueue;
+ private final CooldownQueue transientCooldownQueue;
+ private final CooldownQueue persistentCooldownQueue;
public static final String PRIORITY_NONE = "NONE";
public static final String PRIORITY_SOFT = "SOFT";
@@ -99,8 +100,9 @@
public ClientRequestScheduler(boolean forInserts, boolean forSSKs,
RandomSource random, RequestStarter starter, Node node, NodeClientCore core,
SubConfig sc, String name) {
this.selectorContainer = node.dbServer.openClient();
- schedCore = ClientRequestSchedulerCore.create(node, forInserts,
forSSKs, selectorContainer);
+ schedCore = ClientRequestSchedulerCore.create(node, forInserts,
forSSKs, selectorContainer, COOLDOWN_PERIOD);
schedTransient = new ClientRequestSchedulerNonPersistent(this);
+ persistentCooldownQueue = schedCore.persistentCooldownQueue;
this.starter = starter;
this.random = random;
this.node = node;
@@ -122,9 +124,9 @@
offeredKeys = null;
}
if(!forInserts)
- cooldownQueue = new
RequestCooldownQueue(COOLDOWN_PERIOD);
+ transientCooldownQueue = new
RequestCooldownQueue(COOLDOWN_PERIOD);
else
- cooldownQueue = null;
+ transientCooldownQueue = null;
logMINOR = Logger.shouldLog(Logger.MINOR, this);
}
@@ -226,8 +228,10 @@
for(int i=0;i<offeredKeys.length;i++)
offeredKeys[i].remove(key);
}
- if(cooldownQueue != null)
- cooldownQueue.removeKey(key, getter,
getter.getCooldownWakeupByKey(key));
+ if(transientCooldownQueue != null)
+ transientCooldownQueue.removeKey(key, getter,
getter.getCooldownWakeupByKey(key));
+ if(persistentCooldownQueue != null)
+ persistentCooldownQueue.removeKey(key, getter,
getter.getCooldownWakeupByKey(key));
}
/**
@@ -280,13 +284,14 @@
final SendableGet[] gets = schedCore.removePendingKey(key);
final SendableGet[] transientGets =
schedTransient.removePendingKey(key);
if(gets == null) return;
- if(cooldownQueue != null) {
+ if(transientCooldownQueue != null) {
for(int i=0;i<gets.length;i++)
- cooldownQueue.removeKey(key, gets[i],
gets[i].getCooldownWakeupByKey(key));
+ transientCooldownQueue.removeKey(key,
transientGets[i], transientGets[i].getCooldownWakeupByKey(key));
+ }
+ if(persistentCooldownQueue != null) {
for(int i=0;i<gets.length;i++)
- cooldownQueue.removeKey(key, transientGets[i],
transientGets[i].getCooldownWakeupByKey(key));
+ persistentCooldownQueue.removeKey(key, gets[i],
gets[i].getCooldownWakeupByKey(key));
}
-
Runnable r = new Runnable() {
public void run() {
if(logMINOR) Logger.minor(this, "Running
"+gets.length+" callbacks off-thread for "+block.getKey());
@@ -341,14 +346,22 @@
}
public long queueCooldown(ClientKey key, SendableGet getter) {
- return cooldownQueue.add(key.getNodeKey(), getter);
+ if(getter.persistent())
+ return persistentCooldownQueue.add(key.getNodeKey(),
getter);
+ else
+ return transientCooldownQueue.add(key.getNodeKey(),
getter);
}
public void moveKeysFromCooldownQueue() {
- if(cooldownQueue == null) return;
+ moveKeysFromCooldownQueue(transientCooldownQueue);
+ moveKeysFromCooldownQueue(persistentCooldownQueue);
+ }
+
+ private void moveKeysFromCooldownQueue(CooldownQueue queue) {
+ if(queue == null) return;
long now = System.currentTimeMillis();
Key key;
- while((key = cooldownQueue.removeKeyBefore(now)) != null) {
+ while((key = queue.removeKeyBefore(now)) != null) {
if(logMINOR) Logger.minor(this, "Restoring key: "+key);
SendableGet[] gets =
schedCore.getClientsForPendingKey(key);
SendableGet[] transientGets =
schedTransient.getClientsForPendingKey(key);
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
===================================================================
---
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
2008-05-22 18:22:55 UTC (rev 20042)
+++
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
2008-05-22 18:30:05 UTC (rev 20043)
@@ -34,9 +34,7 @@
private static boolean logMINOR;
/** Identifier in the database for the node we are attached to */
private final long nodeDBHandle;
- // FIXME cooldown queue ????
- // Can we make the cooldown queue non-persistent? It refers to
SendableGet's ... so
- // keeping it in memory may be a problem...
+ final PersistentCooldownQueue persistentCooldownQueue;
/**
* Fetch a ClientRequestSchedulerCore from the database, or create a
new one.
@@ -46,7 +44,7 @@
* @param selectorContainer
* @return
*/
- public static ClientRequestSchedulerCore create(Node node, final
boolean forInserts, final boolean forSSKs, ObjectContainer selectorContainer) {
+ public static ClientRequestSchedulerCore create(Node node, final
boolean forInserts, final boolean forSSKs, ObjectContainer selectorContainer,
long cooldownTime) {
final long nodeDBHandle = node.nodeDBHandle;
ObjectSet results = selectorContainer.query(new Predicate() {
public boolean match(ClientRequestSchedulerCore core) {
@@ -60,17 +58,24 @@
if(results.hasNext()) {
core = (ClientRequestSchedulerCore) (results.next());
} else {
- core = new ClientRequestSchedulerCore(node, forInserts,
forSSKs, selectorContainer);
+ core = new ClientRequestSchedulerCore(node, forInserts,
forSSKs, selectorContainer, cooldownTime);
}
logMINOR = Logger.shouldLog(Logger.MINOR,
ClientRequestSchedulerCore.class);
core.onStarted(selectorContainer);
return core;
}
- ClientRequestSchedulerCore(Node node, boolean forInserts, boolean
forSSKs, ObjectContainer selectorContainer) {
+ ClientRequestSchedulerCore(Node node, boolean forInserts, boolean
forSSKs, ObjectContainer selectorContainer, long cooldownTime) {
super(forInserts, forSSKs, forInserts ? null :
selectorContainer.ext().collections().newHashMap(1024),
selectorContainer.ext().collections().newHashMap(32),
selectorContainer.ext().collections().newLinkedList());
this.nodeDBHandle = node.nodeDBHandle;
this.container = selectorContainer;
+ if(!forInserts) {
+ this.persistentCooldownQueue = new
PersistentCooldownQueue();
+ persistentCooldownQueue.setContainer(container);
+ persistentCooldownQueue.setCooldownTime(cooldownTime);
+ } else {
+ this.persistentCooldownQueue = null;
+ }
}
private void onStarted(ObjectContainer container) {