Author: toad
Date: 2009-01-31 20:39:55 +0000 (Sat, 31 Jan 2009)
New Revision: 25451
Modified:
branches/db4o/freenet/src/freenet/client/async/DBJobRunner.java
branches/db4o/freenet/src/freenet/client/async/SimpleManifestPutter.java
branches/db4o/freenet/src/freenet/client/async/SplitFileInserterSegmentRegisterJob.java
branches/db4o/freenet/src/freenet/node/NodeClientCore.java
branches/db4o/freenet/src/freenet/node/NodeRestartJobsQueue.java
branches/db4o/freenet/src/freenet/support/io/SegmentedBucketChainBucketKillJob.java
Log:
Split restart jobs into early and late. Late restart jobs are treated as
ordinary jobs, early restart jobs are done before anything else.
Modified: branches/db4o/freenet/src/freenet/client/async/DBJobRunner.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/DBJobRunner.java
2009-01-31 17:46:50 UTC (rev 25450)
+++ branches/db4o/freenet/src/freenet/client/async/DBJobRunner.java
2009-01-31 20:39:55 UTC (rev 25451)
@@ -23,8 +23,10 @@
public int getQueueSize(int priority);
/** Queue a database job to be executed just after restart.
- * All such jobs must be completed before any bucket cleanup occurs. */
- public void queueRestartJob(DBJob job, int priority, ObjectContainer
container);
+ * @param early If true, the job will be run just after startup, at
HIGH priority; the priority
+ * given determines the order of such jobs. If false, it will be queued
to the database job
+ * scheduler at the given priority. Late jobs are responsible for
removing themselves! */
+ public void queueRestartJob(DBJob job, int priority, ObjectContainer
container, boolean early);
/** Remove a queued on-restart database job. */
public void removeRestartJob(DBJob job, int priority, ObjectContainer
container);
Modified:
branches/db4o/freenet/src/freenet/client/async/SimpleManifestPutter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SimpleManifestPutter.java
2009-01-31 17:46:50 UTC (rev 25450)
+++ branches/db4o/freenet/src/freenet/client/async/SimpleManifestPutter.java
2009-01-31 20:39:55 UTC (rev 25451)
@@ -539,7 +539,7 @@
// and maximise the opportunities for garbage collection.
if(persistent()) {
container.activate(runGotAllMetadata, 1); // need to
activate .this!
- context.jobRunner.queueRestartJob(runGotAllMetadata,
NativeThread.NORM_PRIORITY, container);
+ context.jobRunner.queueRestartJob(runGotAllMetadata,
NativeThread.NORM_PRIORITY, container, false);
context.jobRunner.queue(runGotAllMetadata,
NativeThread.NORM_PRIORITY, false);
} else {
innerGotAllMetadata(null, context);
Modified:
branches/db4o/freenet/src/freenet/client/async/SplitFileInserterSegmentRegisterJob.java
===================================================================
---
branches/db4o/freenet/src/freenet/client/async/SplitFileInserterSegmentRegisterJob.java
2009-01-31 17:46:50 UTC (rev 25450)
+++
branches/db4o/freenet/src/freenet/client/async/SplitFileInserterSegmentRegisterJob.java
2009-01-31 20:39:55 UTC (rev 25451)
@@ -31,7 +31,7 @@
public void schedule(ObjectContainer container, ClientContext context,
int nowPriority, boolean persistent) {
if(persistent)
- context.jobRunner.queueRestartJob(this,
restartPriority, container);
+ context.jobRunner.queueRestartJob(this,
restartPriority, container, false);
context.jobRunner.queue(this, nowPriority, false);
}
Modified: branches/db4o/freenet/src/freenet/node/NodeClientCore.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NodeClientCore.java 2009-01-31
17:46:50 UTC (rev 25450)
+++ branches/db4o/freenet/src/freenet/node/NodeClientCore.java 2009-01-31
20:39:55 UTC (rev 25451)
@@ -160,7 +160,11 @@
alerts = new UserAlertManager(this);
logMINOR = Logger.shouldLog(Logger.MINOR, this);
restartJobsQueue = NodeRestartJobsQueue.init(node.nodeDBHandle,
container);
- startupDatabaseJobs =
restartJobsQueue.getRestartDatabaseJobs(container);
+ startupDatabaseJobs =
restartJobsQueue.getEarlyRestartDatabaseJobs(container);
+ if(startupDatabaseJobs != null &&
+ startupDatabaseJobs.length > 0)
+ queue(startupJobRunner, NativeThread.HIGH_PRIORITY,
false);
+ restartJobsQueue.addLateRestartDatabaseJobs(this, container);
persister = new ConfigurablePersister(this, nodeConfig,
"clientThrottleFile", "client-throttle.dat", sortOrder++, true, false,
"NodeClientCore.fileForClientStats",
"NodeClientCore.fileForClientStatsLong", node.ps, nodeDir);
@@ -581,9 +585,6 @@
}
}, "Startup completion thread");
- if(startupDatabaseJobs != null &&
- startupDatabaseJobs.length > 0)
- queue(startupJobRunner, NativeThread.HIGH_PRIORITY, false);
clientDatabaseExecutor.start(node.executor, "Client database
access thread");
}
@@ -603,7 +604,7 @@
} catch (Throwable t) {
Logger.error(this, "Caught "+t+" in startup job
"+job, t);
// Try again next time
- restartJobsQueue.queueRestartJob(job.job,
job.prio, container);
+ restartJobsQueue.queueRestartJob(job.job,
job.prio, container, true);
}
startupDatabaseJobsDone++;
if(startupDatabaseJobsDone ==
startupDatabaseJobs.length)
@@ -1435,8 +1436,8 @@
/**
* Queue a job to be run soon after startup. The job must delete itself.
*/
- public void queueRestartJob(DBJob job, int priority, ObjectContainer
container) {
- restartJobsQueue.queueRestartJob(job, priority, container);
+ public void queueRestartJob(DBJob job, int priority, ObjectContainer
container, boolean early) {
+ restartJobsQueue.queueRestartJob(job, priority, container,
early);
}
public void removeRestartJob(DBJob job, int priority, ObjectContainer
container) {
Modified: branches/db4o/freenet/src/freenet/node/NodeRestartJobsQueue.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NodeRestartJobsQueue.java
2009-01-31 17:46:50 UTC (rev 25450)
+++ branches/db4o/freenet/src/freenet/node/NodeRestartJobsQueue.java
2009-01-31 20:39:55 UTC (rev 25451)
@@ -9,6 +9,7 @@
import com.db4o.query.Predicate;
import freenet.client.async.DBJob;
+import freenet.client.async.DBJobRunner;
import freenet.support.Logger;
import freenet.support.io.NativeThread;
@@ -19,8 +20,11 @@
public NodeRestartJobsQueue(long nodeDBHandle2) {
nodeDBHandle = nodeDBHandle2;
dbJobs = new Set[NativeThread.JAVA_PRIORITY_RANGE];
- for(int i=0;i<dbJobs.length;i++)
+ dbJobsEarly = new Set[NativeThread.JAVA_PRIORITY_RANGE];
+ for(int i=0;i<dbJobs.length;i++) {
dbJobs[i] = new HashSet<DBJob>();
+ dbJobsEarly[i] = new HashSet<DBJob>();
+ }
}
public static NodeRestartJobsQueue init(final long nodeDBHandle,
ObjectContainer container) {
@@ -34,6 +38,7 @@
});
if(results.hasNext()) {
+ System.err.println("Found old restart jobs queue");
NodeRestartJobsQueue queue = (NodeRestartJobsQueue)
results.next();
container.activate(queue, 1);
queue.onInit(container);
@@ -41,18 +46,20 @@
}
NodeRestartJobsQueue queue = new
NodeRestartJobsQueue(nodeDBHandle);
container.store(queue);
+ System.err.println("Created new restart jobs queue");
return queue;
}
private void onInit(ObjectContainer container) {
- // FIXME do something, maybe activate?
}
- private final Set<DBJob>[] dbJobs;
+ private Set<DBJob>[] dbJobs;
+ private Set<DBJob>[] dbJobsEarly;
- public synchronized void queueRestartJob(DBJob job, int priority,
ObjectContainer container) {
- container.activate(dbJobs[priority], 1);
- if(dbJobs[priority].add(job)) {
+ public synchronized void queueRestartJob(DBJob job, int priority,
ObjectContainer container, boolean early) {
+ Set<DBJob> jobs = early ? dbJobsEarly[priority] :
dbJobs[priority];
+ container.activate(jobs, 1);
+ if(jobs.add(job)) {
/*
* Store to 1 hop only.
* Otherwise db4o will update ALL the jobs on the queue
to a depth of 3,
@@ -61,16 +68,17 @@
* take ages and is in any case not what we want.
* See http://tracker.db4o.com/browse/COR-1436
*/
- container.ext().store(dbJobs[priority], 1);
+ container.ext().store(jobs, 1);
}
- container.deactivate(dbJobs[priority], 1);
+ container.deactivate(jobs, 1);
}
public synchronized void removeRestartJob(DBJob job, int priority,
ObjectContainer container) {
boolean jobWasActive = container.ext().isActive(job);
if(!jobWasActive) container.activate(job, 1);
container.activate(dbJobs[priority], 1);
- if(!dbJobs[priority].remove(job)) {
+ container.activate(dbJobsEarly[priority], 1);
+ if(!(dbJobs[priority].remove(job) ||
dbJobs[priority].remove(job))) {
int found = 0;
for(int i=0;i<dbJobs.length;i++) {
container.activate(dbJobs[priority], 1);
@@ -86,7 +94,20 @@
container.ext().store(dbJobs[priority],
1);
found++;
}
+ if(dbJobsEarly[priority].remove(job)) {
+ /*
+ * Store to 1 hop only.
+ * Otherwise db4o will update ALL the
jobs on the queue to a depth of 3,
+ * which in practice means all the
buckets inside the BucketChainBucket's
+ * linked by the
BucketChainBucketKillTag's (adding new ones). This will
+ * take ages and is in any case not
what we want.
+ * See
http://tracker.db4o.com/browse/COR-1436
+ */
+
container.ext().store(dbJobsEarly[priority], 1);
+ found++;
+ }
container.deactivate(dbJobs[priority], 1);
+ container.deactivate(dbJobsEarly[priority], 1);
}
if(found > 0)
Logger.error(this, "Job "+job+" not in
specified priority "+priority+" found in "+found+" other priorities when
removing");
@@ -103,6 +124,8 @@
*/
container.ext().store(dbJobs[priority], 1);
container.deactivate(dbJobs[priority], 1);
+ container.ext().store(dbJobsEarly[priority], 1);
+ container.deactivate(dbJobsEarly[priority], 1);
}
if(!jobWasActive) container.deactivate(job, 1);
}
@@ -116,15 +139,29 @@
int prio;
}
- synchronized RestartDBJob[] getRestartDatabaseJobs(ObjectContainer
container) {
+ synchronized RestartDBJob[] getEarlyRestartDatabaseJobs(ObjectContainer
container) {
ArrayList<RestartDBJob> list = new ArrayList<RestartDBJob>();
- for(int i=dbJobs.length-1;i>=0;i--) {
- container.activate(dbJobs[i], 1);
- for(DBJob job : dbJobs[i])
+ for(int i=dbJobsEarly.length-1;i>=0;i--) {
+ container.activate(dbJobsEarly[i], 1);
+ if(!dbJobsEarly[i].isEmpty())
+ System.err.println("Adding
"+dbJobsEarly[i].size()+" early restart jobs at priority "+i);
+ for(DBJob job : dbJobsEarly[i])
list.add(new RestartDBJob(job, i));
- container.deactivate(dbJobs[i], 1);
+ container.deactivate(dbJobsEarly[i], 1);
}
return list.toArray(new RestartDBJob[list.size()]);
}
+ void addLateRestartDatabaseJobs(DBJobRunner runner, ObjectContainer
container) {
+ for(int i=dbJobsEarly.length-1;i>=0;i--) {
+ container.activate(dbJobs[i], 1);
+ if(!dbJobs[i].isEmpty())
+ System.err.println("Adding "+dbJobs[i].size()+"
restart jobs at priority "+i);
+ for(DBJob job : dbJobs[i]) {
+ container.activate(job, 1);
+ runner.queue(job, i, false);
+ }
+ }
+ }
+
}
Modified:
branches/db4o/freenet/src/freenet/support/io/SegmentedBucketChainBucketKillJob.java
===================================================================
---
branches/db4o/freenet/src/freenet/support/io/SegmentedBucketChainBucketKillJob.java
2009-01-31 17:46:50 UTC (rev 25450)
+++
branches/db4o/freenet/src/freenet/support/io/SegmentedBucketChainBucketKillJob.java
2009-01-31 20:39:55 UTC (rev 25451)
@@ -33,7 +33,7 @@
}
public void scheduleRestart(ObjectContainer container, ClientContext
context) {
- context.jobRunner.queueRestartJob(this, RESTART_PRIO,
container);
+ context.jobRunner.queueRestartJob(this, RESTART_PRIO,
container, true);
}
}
_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs