Author: toad
Date: 2008-06-24 13:03:39 +0000 (Tue, 24 Jun 2008)
New Revision: 20643
Added:
branches/db4o/freenet/src/freenet/client/async/RegisterMe.java
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
Log:
Run the RegisterMe query once just after startup. It can take a long time,
especially on IMMEDIATE evaluation mode, but also in other modes too.
Various debugging and timing.
Move RegisterMe to a top level class.
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
===================================================================
---
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
2008-06-24 13:01:32 UTC (rev 20642)
+++
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
2008-06-24 13:03:39 UTC (rev 20643)
@@ -46,6 +46,7 @@
private final long nodeDBHandle;
final PersistentCooldownQueue persistentCooldownQueue;
private transient ClientRequestScheduler sched;
+ private transient long initTime;
/**
* All Key's we are currently fetching.
@@ -114,10 +115,36 @@
keysFetching = null;
this.sched = sched;
InsertCompressor.load(container, context);
+ this.initTime = System.currentTimeMillis();
+ // We DO NOT want to rerun the query after consuming the
initial set...
+ preRegisterMeRunner = new DBJob() {
+
+ public void run(ObjectContainer container,
ClientContext context) {
+ long tStart = System.currentTimeMillis();
+ registerMeSet = container.query(new Predicate()
{
+ public boolean match(RegisterMe reg) {
+ if(reg.core !=
ClientRequestSchedulerCore.this) return false;
+ if(reg.addedTime > initTime)
return false;
+ return true;
+ }
+ });
+ 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);
+ }
+
+ };
+ registerMeRunner = new RegisterMeRunner();
+
}
+ private transient DBJob preRegisterMeRunner;
+
void start(DBJobRunner runner) {
- runner.queue(registerMeRunner, NativeThread.NORM_PRIORITY,
true);
+ runner.queue(preRegisterMeRunner, NativeThread.NORM_PRIORITY,
true);
}
void fillStarterQueue() {
@@ -429,20 +456,14 @@
return container;
}
- private final RegisterMeRunner registerMeRunner = new
RegisterMeRunner();
+ private transient ObjectSet registerMeSet;
+ private transient RegisterMeRunner registerMeRunner;
+
class RegisterMeRunner implements DBJob {
public void run(ObjectContainer container, ClientContext
context) {
- ObjectSet result = container.query(new Predicate() {
- public boolean match(RegisterMe reg) {
- if(reg.core !=
ClientRequestSchedulerCore.this) return false;
- return true;
- }
- });
- // Don't sort it. It has to activate everything before
sorting it!
- // FIXME an index may improve things
- //, new Comparator() {
+// , new Comparator() {
// public int compare(Object arg0, Object arg1) {
// RegisterMe reg0 = (RegisterMe) arg0;
// RegisterMe reg1 = (RegisterMe) arg1;
@@ -457,11 +478,16 @@
// return 0;
// }
// });
- for(int i=0;result.hasNext() && i < 5; i++) {
- RegisterMe reg = (RegisterMe) result.next();
+ for(int i=0;registerMeSet.hasNext() && i < 5; i++) {
+ long startNext = System.currentTimeMillis();
+ RegisterMe reg = (RegisterMe)
registerMeSet.next();
+ long endNext = System.currentTimeMillis();
if(logMINOR)
+ Logger.minor(this, "RegisterMe: next()
took "+(endNext-startNext));
+ if(logMINOR)
Logger.minor(this, "Running RegisterMe
for "+reg.getter+" : "+reg.addedTime+" : "+reg.priority);
container.delete(reg);
+ container.activate(reg.getter, 2);
// Don't need to activate, fields should exist?
FIXME
try {
sched.register(reg.getter, true, reg);
@@ -471,8 +497,10 @@
reg.getter.internalError(null, t,
sched, container, context);
}
}
- if(result.hasNext())
+ if(registerMeSet.hasNext())
context.jobRunner.queue(registerMeRunner,
NativeThread.NORM_PRIORITY, true);
+ else
+ registerMeSet = null;
}
}
@@ -517,17 +545,3 @@
}
-class RegisterMe {
- final SendableRequest getter;
- final ClientRequestSchedulerCore core;
- final short priority;
- final long addedTime;
-
- RegisterMe(SendableRequest getter, ClientRequestSchedulerCore core) {
- this.getter = getter;
- this.core = core;
- this.addedTime = System.currentTimeMillis();
- this.priority = getter.getPriorityClass();
- }
-}
-
Added: branches/db4o/freenet/src/freenet/client/async/RegisterMe.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/RegisterMe.java
(rev 0)
+++ branches/db4o/freenet/src/freenet/client/async/RegisterMe.java
2008-06-24 13:03:39 UTC (rev 20643)
@@ -0,0 +1,18 @@
+package freenet.client.async;
+
+import freenet.node.SendableRequest;
+
+public class RegisterMe {
+ final SendableRequest getter;
+ final ClientRequestSchedulerCore core;
+ final short priority;
+ final long addedTime;
+
+ RegisterMe(SendableRequest getter, ClientRequestSchedulerCore core) {
+ this.getter = getter;
+ this.core = core;
+ this.addedTime = System.currentTimeMillis();
+ this.priority = getter.getPriorityClass();
+ }
+}
+