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

Reply via email to