Author: toad
Date: 2008-10-23 18:20:33 +0000 (Thu, 23 Oct 2008)
New Revision: 23061
Modified:
branches/db4o/freenet/src/freenet/node/NodeClientCore.java
branches/db4o/freenet/src/freenet/node/NodeRestartJobsQueue.java
Log:
Keep restart jobs on the restart queue until they have actually been completed.
Nonetheless, we should only run those that were on the queue at startup time.
Modified: branches/db4o/freenet/src/freenet/node/NodeClientCore.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NodeClientCore.java 2008-10-23
18:19:43 UTC (rev 23060)
+++ branches/db4o/freenet/src/freenet/node/NodeClientCore.java 2008-10-23
18:20:33 UTC (rev 23061)
@@ -51,6 +51,7 @@
import freenet.keys.SSKBlock;
import freenet.keys.SSKVerifyException;
import freenet.l10n.L10n;
+import freenet.node.NodeRestartJobsQueue.RestartDBJob;
import freenet.node.SecurityLevels.PHYSICAL_THREAT_LEVEL;
import freenet.node.fcp.FCPServer;
import freenet.node.useralerts.SimpleUserAlert;
@@ -138,8 +139,8 @@
* of them, so only cache a small number of them */
private static final int FEC_QUEUE_CACHE_SIZE = 20;
private UserAlert startingUpAlert;
- private DBJob[] startupDatabaseJobs;
-
+ private RestartDBJob[] startupDatabaseJobs;
+
NodeClientCore(Node node, Config config, SubConfig nodeConfig, File
nodeDir, int portNumber, int sortOrder, SimpleFieldSet oldConfig, SubConfig
fproxyConfig, SimpleToadletServer toadlets, ObjectContainer container) throws
NodeInitException {
this.node = node;
this.nodeStats = node.nodeStats;
@@ -579,10 +580,11 @@
private DBJob startupJobRunner = new DBJob() {
public void run(ObjectContainer container, ClientContext
context) {
- DBJob job =
startupDatabaseJobs[startupDatabaseJobsDone];
+ RestartDBJob job =
startupDatabaseJobs[startupDatabaseJobsDone];
try {
- container.activate(job, 1);
- job.run(container, context);
+ container.activate(job.job, 1);
+ job.job.run(container, context);
+ restartJobsQueue.removeRestartJob(job.job,
job.prio, container);
container.commit();
} catch (Throwable t) {
Logger.error(this, "Caught "+t+" in startup job
"+job, t);
@@ -1397,6 +1399,9 @@
System.exit(NodeInitException.EXIT_OUT_OF_MEMORY_PROTECTING_DATABASE);
}
+ /**
+ * 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);
}
Modified: branches/db4o/freenet/src/freenet/node/NodeRestartJobsQueue.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NodeRestartJobsQueue.java
2008-10-23 18:19:43 UTC (rev 23060)
+++ branches/db4o/freenet/src/freenet/node/NodeRestartJobsQueue.java
2008-10-23 18:20:33 UTC (rev 23061)
@@ -107,16 +107,24 @@
if(!jobWasActive) container.deactivate(job, 1);
}
- synchronized DBJob[] getRestartDatabaseJobs(ObjectContainer container) {
- ArrayList<DBJob> list = new ArrayList<DBJob>();
+ class RestartDBJob {
+ public RestartDBJob(DBJob job2, int i) {
+ job = job2;
+ prio = i;
+ }
+ DBJob job;
+ int prio;
+ }
+
+ synchronized RestartDBJob[] getRestartDatabaseJobs(ObjectContainer
container) {
+ ArrayList<RestartDBJob> list = new ArrayList<RestartDBJob>();
for(int i=dbJobs.length-1;i>=0;i--) {
container.activate(dbJobs[i], 1);
- list.addAll(dbJobs[i]);
- dbJobs[i].clear();
- container.store(dbJobs[i]);
+ for(DBJob job : dbJobs[i])
+ list.add(new RestartDBJob(job, i));
container.deactivate(dbJobs[i], 1);
}
- return list.toArray(new DBJob[list.size()]);
+ return list.toArray(new RestartDBJob[list.size()]);
}
}