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()]);
        }

 }


Reply via email to