Author: toad
Date: 2008-11-01 20:00:24 +0000 (Sat, 01 Nov 2008)
New Revision: 23282
Removed:
branches/db4o/freenet/src/freenet/client/async/RegisterMeSortKey.java
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
branches/db4o/freenet/src/freenet/client/async/RegisterMe.java
branches/db4o/freenet/src/freenet/node/Node.java
Log:
Fix priority inversion. Remove RegisterMeSortKey, query RegisterMe's by
priority.
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
===================================================================
---
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
2008-11-01 14:16:34 UTC (rev 23281)
+++
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
2008-11-01 20:00:24 UTC (rev 23282)
@@ -146,8 +146,18 @@
// }
//
// });
- Query query = container.query();
- query.constrain(RegisterMe.class);
+ ObjectSet results = null;
+ for(int
i=RequestStarter.MAXIMUM_PRIORITY_CLASS;i<=RequestStarter.MINIMUM_PRIORITY_CLASS;i++)
{
+ Query query = container.query();
+ query.constrain(RegisterMe.class);
+ query.descend("priority").constrain(i);
+ results = query.execute();
+ if(results.hasNext()) {
+ break;
+ } else results = null;
+ }
+ if(results == null)
+ return;
// This throws NotSupported.
//
query.descend("core").constrain(this).identity().
//
and(query.descend("key").descend("addedTime").constrain(new
Long(initTime)).smaller());
@@ -175,7 +185,6 @@
// query.constrain(eval);
//
query.descend("key").descend("priority").orderAscending();
//
query.descend("key").descend("addedTime").orderAscending();
- ObjectSet results = query.execute();
synchronized(ClientRequestSchedulerCore.this) {
registerMeSet = results;
}
@@ -607,7 +616,6 @@
container.deactivate(reg, 1);
continue; // Don't delete.
}
- container.activate(reg.key, 1);
// if(reg.key.addedTime > initTime) {
// if(logMINOR) Logger.minor(this,
"Ignoring RegisterMe as created since startup");
// container.deactivate(reg.key, 1);
@@ -619,7 +627,7 @@
Logger.minor(this, "RegisterMe: next()
took "+(endNext-startNext));
if(logMINOR)
- Logger.minor(this, "Running RegisterMe
"+reg+" for "+reg.nonGetRequest+" : "+reg.key.addedTime+" : "+reg.key.priority);
+ Logger.minor(this, "Running RegisterMe
"+reg+" for "+reg.nonGetRequest+" : "+reg.addedTime+" : "+reg.priority);
// Don't need to activate, fields should exist?
FIXME
if(reg.nonGetRequest != null) {
container.activate(reg.nonGetRequest,
1);
@@ -647,9 +655,8 @@
shouldReRunRegisterMeRunner = false;
registerMeSet = null;
}
- if(rerun) {
- preRegisterMeRunner.run(container,
context);
- }
+ // Always re-run the query. If there is nothing
to register, it won't call back to us.
+ preRegisterMeRunner.run(container, context);
}
}
Modified: branches/db4o/freenet/src/freenet/client/async/RegisterMe.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/RegisterMe.java
2008-11-01 14:16:34 UTC (rev 23281)
+++ branches/db4o/freenet/src/freenet/client/async/RegisterMe.java
2008-11-01 20:00:24 UTC (rev 23282)
@@ -1,7 +1,5 @@
package freenet.client.async;
-import com.db4o.ObjectContainer;
-
import freenet.node.SendableRequest;
/**
@@ -12,7 +10,8 @@
public class RegisterMe {
final SendableRequest nonGetRequest;
final ClientRequestSchedulerCore core;
- final RegisterMeSortKey key;
+ final long addedTime;
+ final short priority;
/**
* Only set if the key is on the queue.
*/
@@ -24,7 +23,8 @@
this.bootID = bootID;
this.core = core;
this.nonGetRequest = nonGetRequest;
- this.key = new RegisterMeSortKey(prio);
+ priority = prio;
+ addedTime = System.currentTimeMillis();
this.blocks = blocks;
int hash = core.hashCode();
if(nonGetRequest != null)
@@ -33,10 +33,6 @@
hashCode = hash;
}
- public void objectOnActivate(ObjectContainer container) {
- container.activate(key, 1);
- }
-
public int hashCode() {
return hashCode;
}
Deleted: branches/db4o/freenet/src/freenet/client/async/RegisterMeSortKey.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/RegisterMeSortKey.java
2008-11-01 14:16:34 UTC (rev 23281)
+++ branches/db4o/freenet/src/freenet/client/async/RegisterMeSortKey.java
2008-11-01 20:00:24 UTC (rev 23282)
@@ -1,37 +0,0 @@
-package freenet.client.async;
-
-public class RegisterMeSortKey implements Comparable {
-
- final long addedTime;
- final short priority;
-
- public RegisterMeSortKey(short priorityClass) {
- this.addedTime = System.currentTimeMillis();
- this.priority = priorityClass;
- }
-
- public int compareTo(Object arg0) {
- RegisterMeSortKey key = (RegisterMeSortKey) arg0;
- if(key.priority < priority)
- return 1;
- if(key.priority > priority)
- return -1;
- if(key.addedTime < addedTime)
- return 1;
- if(key.addedTime > addedTime)
- return -1;
- return 0;
- }
-
- public boolean equals(Object arg0) {
- if(arg0 == this) return true;
- if(!(arg0 instanceof RegisterMeSortKey)) return false;
- RegisterMeSortKey key = (RegisterMeSortKey) arg0;
- return key.priority == priority && key.addedTime == addedTime;
- }
-
- public int hashCode() {
- return (int) addedTime ^ ((int) addedTime >>> 32) ^ priority;
- }
-
-}
Modified: branches/db4o/freenet/src/freenet/node/Node.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/Node.java 2008-11-01 14:16:34 UTC
(rev 23281)
+++ branches/db4o/freenet/src/freenet/node/Node.java 2008-11-01 20:00:24 UTC
(rev 23282)
@@ -827,6 +827,7 @@
dbConfig.objectClass(freenet.client.async.PersistentCooldownQueueItem.class).objectField("time").indexed(true);
dbConfig.objectClass(freenet.client.async.RegisterMe.class).objectField("core").indexed(true);
dbConfig.objectClass(freenet.client.async.RegisterMe.class).objectField("key").indexed(true);
+
dbConfig.objectClass(freenet.client.async.RegisterMe.class).objectField("priority").indexed(true);
dbConfig.objectClass(freenet.client.async.PersistentCooldownQueueItem.class).objectField("time").indexed(true);
dbConfig.objectClass(freenet.client.FECJob.class).objectField("priority").indexed(true);
dbConfig.objectClass(freenet.client.FECJob.class).objectField("addedTime").indexed(true);