Author: toad
Date: 2008-07-25 22:00:50 +0000 (Fri, 25 Jul 2008)
New Revision: 21405
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerBase.java
Log:
Tracking down an NPE: list and activate keys first, then do things on them,
then deactivate, rather than listing, activating and deactivating each key
twice.
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
2008-07-25 21:59:29 UTC (rev 21404)
+++ branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
2008-07-25 22:00:50 UTC (rev 21405)
@@ -259,9 +259,9 @@
}
} else {
if(listener != null) {
- schedTransient.addPendingKeys(listener, null);
+ final Key[] keys =
listener.listKeys(selectorContainer);
+ schedTransient.addPendingKeys(listener, keys,
null);
short prio =
listener.getPriorityClass(selectorContainer);
- final Key[] keys =
listener.listKeys(selectorContainer);
final boolean dontCache =
listener.dontCache(null);
for(int i=0;i<keys.length;i++) {
if(keys[i].getRoutingKey() == null)
@@ -328,7 +328,13 @@
return;
} else {
short prio =
listener.getPriorityClass(selectorContainer);
- schedCore.addPendingKeys(listener,
selectorContainer);
+ final Key[] keys =
listener.listKeys(selectorContainer);
+ for(int i=0;i<keys.length;i++) {
+ selectorContainer.activate(keys[i], 5);
+ if(keys[i].getRoutingKey() == null)
+ throw new
NullPointerException();
+ }
+ schedCore.addPendingKeys(listener, keys,
selectorContainer);
if(reg == null && getters != null) {
reg = new RegisterMe(null, getters,
null, prio, schedCore, blocks, node.bootID);
selectorContainer.set(reg);
@@ -340,12 +346,10 @@
}
final RegisterMe regme = reg;
// Check the datastore before proceding.
- final Key[] keys =
listener.listKeys(selectorContainer);
for(int i=0;i<keys.length;i++) {
- selectorContainer.activate(keys[i], 5);
Key oldKey = keys[i];
keys[i] = oldKey.cloneKey();
- selectorContainer.deactivate(oldKey, 1);
+ selectorContainer.deactivate(oldKey, 5);
}
final boolean dontCache =
listener.dontCache(selectorContainer);
datastoreCheckerExecutor.execute(new Runnable()
{
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerBase.java
===================================================================
---
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerBase.java
2008-07-25 21:59:29 UTC (rev 21404)
+++
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerBase.java
2008-07-25 22:00:50 UTC (rev 21405)
@@ -178,10 +178,15 @@
}
}
- public void addPendingKeys(GotKeyListener getter, ObjectContainer
container) {
+ /**
+ * Keys must already be activated.
+ * @param getter
+ * @param keyTokens
+ * @param container
+ */
+ public void addPendingKeys(GotKeyListener getter, Key[] keyTokens,
ObjectContainer container) {
if(persistent())
container.activate(getter, 1);
- Key[] keyTokens = getter.listKeys(container);
Key prevTok = null;
for(int i=0;i<keyTokens.length;i++) {
Key key = keyTokens[i];
@@ -189,11 +194,7 @@
Logger.error(this, "Ignoring duplicate token");
continue;
}
- if(persistent())
- container.activate(key, 5);
addPendingKey(key, getter, container);
- if(persistent())
- container.deactivate(key, 5);
}
}