Author: toad
Date: 2008-06-25 20:54:28 +0000 (Wed, 25 Jun 2008)
New Revision: 20717
Added:
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
branches/db4o/freenet/src/freenet/support/io/DelayedFreeBucket.java
Log:
New class RegisterMeSortKey contains the sorting info for a RegisterMe.
Sort by it and create an index on it so we can run RegisterMe's in the correct
order and thus not have persistent inserts priorities turned upside down.
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
===================================================================
---
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
2008-06-25 20:43:31 UTC (rev 20716)
+++
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
2008-06-25 20:54:28 UTC (rev 20717)
@@ -131,13 +131,13 @@
registerMeSet = container.query(new Predicate()
{
public boolean match(RegisterMe reg) {
if(reg.core !=
ClientRequestSchedulerCore.this) return false;
- if(reg.addedTime > initTime)
return false;
+ if(reg.key.addedTime >
initTime) return false;
return true;
}
});
- long tEnd = System.currentTimeMillis();
- if(logMINOR)
- Logger.minor(this, "RegisterMe query
took "+(tEnd-tStart));
+ long tEnd = System.currentTimeMillis();
+ if(logMINOR)
+ Logger.minor(this, "RegisterMe query took
"+(tEnd-tStart));
// if(logMINOR)
// Logger.minor(this, "RegisterMe query
returned: "+registerMeSet.size());
context.jobRunner.queue(registerMeRunner,
NativeThread.NORM_PRIORITY, true);
@@ -489,21 +489,6 @@
class RegisterMeRunner implements DBJob {
public void run(ObjectContainer container, ClientContext
context) {
-// , new Comparator() {
-// public int compare(Object arg0, Object arg1) {
-// RegisterMe reg0 = (RegisterMe) arg0;
-// RegisterMe reg1 = (RegisterMe) arg1;
-// if(reg0.priority > reg1.priority)
-// return -1; // First is lower
priority, so use the second.
-// if(reg0.priority < reg1.priority)
-// return 1; // First is lower
priority, so use the second.
-// if(reg0.addedTime > reg1.addedTime)
-// return -1; // Second was added
earlier
-// if(reg0.addedTime < reg1.addedTime)
-// return 1;
-// return 0;
-// }
-// });
for(int i=0;i < 10; i++) {
try {
if(!registerMeSet.hasNext()) break;
@@ -527,7 +512,7 @@
container.delete(reg);
container.activate(reg.getter, 2);
if(logMINOR)
- Logger.minor(this, "Running RegisterMe
for "+reg.getter+" : "+reg.addedTime+" : "+reg.priority);
+ Logger.minor(this, "Running RegisterMe
for "+reg.getter+" : "+reg.key.addedTime+" : "+reg.key.priority);
// Don't need to activate, fields should exist?
FIXME
try {
sched.register(reg.getter, true, reg);
Modified: branches/db4o/freenet/src/freenet/client/async/RegisterMe.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/RegisterMe.java
2008-06-25 20:43:31 UTC (rev 20716)
+++ branches/db4o/freenet/src/freenet/client/async/RegisterMe.java
2008-06-25 20:54:28 UTC (rev 20717)
@@ -5,14 +5,12 @@
public class RegisterMe {
final SendableRequest getter;
final ClientRequestSchedulerCore core;
- final short priority;
- final long addedTime;
+ final RegisterMeSortKey key;
RegisterMe(SendableRequest getter, ClientRequestSchedulerCore core) {
this.getter = getter;
this.core = core;
- this.addedTime = System.currentTimeMillis();
- this.priority = getter.getPriorityClass();
+ this.key = new RegisterMeSortKey(getter.getPriorityClass());
}
}
Added: branches/db4o/freenet/src/freenet/client/async/RegisterMeSortKey.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/RegisterMeSortKey.java
(rev 0)
+++ branches/db4o/freenet/src/freenet/client/async/RegisterMeSortKey.java
2008-06-25 20:54:28 UTC (rev 20717)
@@ -0,0 +1,37 @@
+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-06-25 20:43:31 UTC
(rev 20716)
+++ branches/db4o/freenet/src/freenet/node/Node.java 2008-06-25 20:54:28 UTC
(rev 20717)
@@ -721,8 +721,7 @@
/* Client-server mode. Refresh objects if you have a long-lived
container! */
Db4o.configure().objectClass(freenet.client.async.PersistentCooldownQueueItem.class).objectField("key").indexed(true);
Db4o.configure().objectClass(freenet.client.async.RegisterMe.class).objectField("core").indexed(true);
-
Db4o.configure().objectClass(freenet.client.async.RegisterMe.class).objectField("priority").indexed(true);
-
Db4o.configure().objectClass(freenet.client.async.RegisterMe.class).objectField("addedTime").indexed(true);
+
Db4o.configure().objectClass(freenet.client.async.RegisterMe.class).objectField("key").indexed(true);
Db4o.configure().objectClass(freenet.client.async.PersistentCooldownQueueItem.class).objectField("time").indexed(true);
/** Maybe we want a different query evaluation mode?
* At the moment, a big splitfile insert will result in one
SingleBlockInserter
Modified: branches/db4o/freenet/src/freenet/support/io/DelayedFreeBucket.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/io/DelayedFreeBucket.java
2008-06-25 20:43:31 UTC (rev 20716)
+++ branches/db4o/freenet/src/freenet/support/io/DelayedFreeBucket.java
2008-06-25 20:54:28 UTC (rev 20717)
@@ -107,9 +107,21 @@
return super.toString()+":"+bucket.toString();
}
+ private transient int _activationCount = 0;
+
public void objectOnActivate(ObjectContainer container) {
+ StackTraceElement[] elements =
Thread.currentThread().getStackTrace();
+ if(elements != null && elements.length > 40) {
+ System.err.println("Infinite recursion in progress...");
+ }
+ synchronized(this) {
+ _activationCount++;
+ if(_activationCount > 10) {
+ Logger.error(this, "Activated 10 times!!:
"+super.toString());
+ }
+ }
if(Logger.shouldLog(Logger.MINOR, this))
- Logger.minor(this, "Activating "+super.toString());
+ Logger.minor(this, "Activating "+super.toString()+" :
"+bucket.getClass());
if(bucket == this) {
Logger.error(this, "objectOnActivate on
DelayedFreeBucket: wrapping self!!!");
return;