Author: toad
Date: 2008-11-03 23:22:49 +0000 (Mon, 03 Nov 2008)
New Revision: 23301

Modified:
   branches/db4o/freenet/src/freenet/support/io/SegmentedBucketChainBucket.java
Log:
Run segment store jobs asynchronously.


Modified: 
branches/db4o/freenet/src/freenet/support/io/SegmentedBucketChainBucket.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/support/io/SegmentedBucketChainBucket.java    
    2008-11-03 22:32:53 UTC (rev 23300)
+++ 
branches/db4o/freenet/src/freenet/support/io/SegmentedBucketChainBucket.java    
    2008-11-03 23:22:49 UTC (rev 23301)
@@ -10,6 +10,7 @@
 import freenet.client.async.ClientContext;
 import freenet.client.async.DBJob;
 import freenet.client.async.DBJobRunner;
+import freenet.support.Logger;
 import freenet.support.api.Bucket;
 import freenet.support.api.BucketFactory;

@@ -258,23 +259,48 @@

        private transient DBJob killMe;

+       private transient boolean runningSegStore;
+       
        protected SegmentedChainBucketSegment makeSegment(int index, final 
SegmentedChainBucketSegment oldSeg) {
                if(oldSeg != null) {
+                       synchronized(this) {
+                               while(runningSegStore) {
+                                       Logger.normal(this, "Waiting for last 
segment-store job to finish on "+this);
+                                       try {
+                                               wait();
+                                       } catch (InterruptedException e) {
+                                               // Ignore
+                                       }
+                               }
+                               runningSegStore = true;
+                       }
+                       try {
                        dbJobRunner.runBlocking(new DBJob() {

                                public void run(ObjectContainer container, 
ClientContext context) {
-                                       oldSeg.storeTo(container);
-                                       container.ext().store(segments, 1);
-                                       
container.ext().store(SegmentedBucketChainBucket.this, 1);
-                                       container.deactivate(oldSeg, 1);
-                                       
synchronized(SegmentedBucketChainBucket.this) {
-                                               if(killMe != null) return;
-                                               killMe = new 
SegmentedBucketChainBucketKillJob(SegmentedBucketChainBucket.this);
+                                       try {
+                                               oldSeg.storeTo(container);
+                                               container.ext().store(segments, 
1);
+                                               
container.ext().store(SegmentedBucketChainBucket.this, 1);
+                                               container.deactivate(oldSeg, 1);
+                                               
synchronized(SegmentedBucketChainBucket.this) {
+                                                       if(killMe != null) 
return;
+                                                       killMe = new 
SegmentedBucketChainBucketKillJob(SegmentedBucketChainBucket.this);
+                                               }
+                                               
dbJobRunner.queueRestartJob(killMe, NativeThread.HIGH_PRIORITY, container);
+                                       } finally {
+                                               
synchronized(SegmentedBucketChainBucket.this) {
+                                                       runningSegStore = false;
+                                                       
SegmentedBucketChainBucket.this.notifyAll();
+                                               }
                                        }
-                                       dbJobRunner.queueRestartJob(killMe, 
NativeThread.HIGH_PRIORITY, container);
                                }

                        }, NativeThread.HIGH_PRIORITY-1);
+                       } catch (Throwable t) {
+                               Logger.error(this, "Caught throwable: "+t, t);
+                               runningSegStore = false;
+                       }
                }
                synchronized(this) {
                        SegmentedChainBucketSegment seg = new 
SegmentedChainBucketSegment(this);


Reply via email to