Author: toad
Date: 2006-07-21 18:50:11 +0000 (Fri, 21 Jul 2006)
New Revision: 9700

Modified:
   trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
   trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/Version.java
   trunk/freenet/src/freenet/node/fcp/FCPServer.java
   trunk/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
Log:
890: More insert resuming fixes, free buckets when they're finished with in 
segment insert, and don't let inserts continue forever unless maxretries=-1.

Modified: trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleBlockInserter.java     
2006-07-21 18:03:36 UTC (rev 9699)
+++ trunk/freenet/src/freenet/client/async/SingleBlockInserter.java     
2006-07-21 18:50:11 UTC (rev 9700)
@@ -164,6 +164,7 @@
                                fail(new 
InserterException(errors.getFirstCode()));
                        else
                                fail(new 
InserterException(InserterException.TOO_MANY_RETRIES_IN_BLOCKS, errors, 
getURI()));
+                       return;
                }
                try {
                        getScheduler(encode()).register(this);

Modified: trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java        
2006-07-21 18:03:36 UTC (rev 9699)
+++ trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java        
2006-07-21 18:50:11 UTC (rev 9700)
@@ -411,17 +411,30 @@

                if(finished) return true;
                if(x >= dataBlocks.length) {
-                       if(checkBlockInserters[x-dataBlocks.length] == null) {
+                       x -= dataBlocks.length;
+                       if(checkBlockInserters[x] == null) {
                                Logger.error(this, "Completed twice: check 
block "+x+" on "+this);
                                return true;
                        }
-                       checkBlockInserters[x-dataBlocks.length] = null;
+                       checkBlockInserters[x] = null;
+                       try {
+                               
parent.ctx.persistentBucketFactory.freeBucket(checkBlocks[x]);
+                       } catch (IOException e) {
+                               Logger.error(this, "Could not free 
"+checkBlocks[x]+" : "+e, e);
+                       }
+                       checkBlocks[x] = null;
                } else {
                        if(dataBlockInserters[x] == null) {
                                Logger.error(this, "Completed twice: data block 
"+x+" on "+this);
                                return true;
                        }
                        dataBlockInserters[x] = null;
+                       try {
+                               
parent.ctx.persistentBucketFactory.freeBucket(dataBlocks[x]);
+                       } catch (IOException e) {
+                               Logger.error(this, "Could not free 
"+dataBlocks[x]+" : "+e, e);
+                       }
+                       dataBlocks[x] = null;
                }
                blocksCompleted++;
                if(blocksCompleted != dataBlockInserters.length + 
checkBlockInserters.length) return true;

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2006-07-21 18:03:36 UTC (rev 
9699)
+++ trunk/freenet/src/freenet/node/Node.java    2006-07-21 18:50:11 UTC (rev 
9700)
@@ -1801,8 +1801,6 @@
                if(testnetHandler != null)
                        testnetHandler.start();

-               persistentTempBucketFactory.completedInit();
-
                redetectAddress();
                shouldInsertARK();

@@ -1886,6 +1884,8 @@

                this.fcpServer.finishStart();

+               persistentTempBucketFactory.completedInit();
+               
                this.hasStarted = true;
        }


Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-07-21 18:03:36 UTC (rev 
9699)
+++ trunk/freenet/src/freenet/node/Version.java 2006-07-21 18:50:11 UTC (rev 
9700)
@@ -18,7 +18,7 @@
        public static final String protocolVersion = "1.0";

        /** The build number of the current revision */
-       private static final int buildNumber = 889;
+       private static final int buildNumber = 890;

        /** Oldest build of Fred we will talk to */
        private static final int oldLastGoodBuild = 870;

Modified: trunk/freenet/src/freenet/node/fcp/FCPServer.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPServer.java   2006-07-21 18:03:36 UTC 
(rev 9699)
+++ trunk/freenet/src/freenet/node/fcp/FCPServer.java   2006-07-21 18:50:11 UTC 
(rev 9700)
@@ -35,6 +35,7 @@
 import freenet.node.Node;
 import freenet.node.RequestStarter;
 import freenet.support.Base64;
+import freenet.support.Bucket;
 import freenet.support.Logger;

 /**
@@ -473,31 +474,40 @@
                Logger.minor(this, "Storing persistent requests");
                ClientRequest[] persistentRequests = getPersistentRequests();
                Logger.minor(this, "Persistent requests count: 
"+persistentRequests.length);
-               synchronized(persistenceSync) {
-                       try {
-                               File compressedTemp = new 
File(persistentDownloadsTempFile+".gz");
-                               File compressedFinal = new 
File(persistentDownloadsFile.toString()+".gz");
-                               FileOutputStream fos = new 
FileOutputStream(compressedTemp);
-                               BufferedOutputStream bos = new 
BufferedOutputStream(fos);
-                               GZIPOutputStream gos = new 
GZIPOutputStream(bos);
-                               OutputStreamWriter osw = new 
OutputStreamWriter(gos);
-                               BufferedWriter w = new BufferedWriter(osw);
-                               
w.write(Integer.toString(persistentRequests.length)+"\n");
-                               for(int i=0;i<persistentRequests.length;i++)
-                                       persistentRequests[i].write(w);
-                               w.close();
-                               if(!compressedTemp.renameTo(compressedFinal)) {
-                                       Logger.minor(this, "Rename failed");
-                                       compressedFinal.delete();
+               Bucket[] toFree = null;
+               try {
+                       synchronized(persistenceSync) {
+                               toFree = 
node.persistentTempBucketFactory.grabBucketsToFree();
+                               try {
+                                       File compressedTemp = new 
File(persistentDownloadsTempFile+".gz");
+                                       File compressedFinal = new 
File(persistentDownloadsFile.toString()+".gz");
+                                       FileOutputStream fos = new 
FileOutputStream(compressedTemp);
+                                       BufferedOutputStream bos = new 
BufferedOutputStream(fos);
+                                       GZIPOutputStream gos = new 
GZIPOutputStream(bos);
+                                       OutputStreamWriter osw = new 
OutputStreamWriter(gos);
+                                       BufferedWriter w = new 
BufferedWriter(osw);
+                                       
w.write(Integer.toString(persistentRequests.length)+"\n");
+                                       for(int 
i=0;i<persistentRequests.length;i++)
+                                               persistentRequests[i].write(w);
+                                       w.close();
                                        
if(!compressedTemp.renameTo(compressedFinal)) {
-                                               Logger.error(this, "Could not 
rename persisted requests temp file "+persistentDownloadsTempFile+".gz to 
"+persistentDownloadsFile);
+                                               Logger.minor(this, "Rename 
failed");
+                                               compressedFinal.delete();
+                                               
if(!compressedTemp.renameTo(compressedFinal)) {
+                                                       Logger.error(this, 
"Could not rename persisted requests temp file 
"+persistentDownloadsTempFile+".gz to "+persistentDownloadsFile);
+                                               }
                                        }
+                               } catch (IOException e) {
+                                       Logger.error(this, "Cannot write 
persistent requests to disk: "+e);
                                }
-                       } catch (IOException e) {
-                               Logger.error(this, "Cannot write persistent 
requests to disk: "+e);
                        }
+                       Logger.minor(this, "Stored persistent requests");
+               } finally {
+                       if(toFree != null) {
+                               for(int i=0;i<toFree.length;i++)
+                                       toFree[i].free();
+                       }
                }
-               Logger.minor(this, "Stored persistent requests");
        }

        private void loadPersistentRequests() {

Modified: trunk/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
===================================================================
--- trunk/freenet/src/freenet/support/io/PersistentTempBucketFactory.java       
2006-07-21 18:03:36 UTC (rev 9699)
+++ trunk/freenet/src/freenet/support/io/PersistentTempBucketFactory.java       
2006-07-21 18:50:11 UTC (rev 9700)
@@ -4,6 +4,7 @@
 import java.io.IOException;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedList;

 import freenet.crypt.RandomSource;
 import freenet.support.Bucket;
@@ -33,6 +34,9 @@

        /** Random number generator */
        private final RandomSource rand;
+       
+       /** Buckets to free */
+       private final LinkedList bucketsToFree;

        public PersistentTempBucketFactory(File dir, String prefix, 
RandomSource rand) throws IOException {
                this.dir = dir;
@@ -61,6 +65,7 @@
                                originalFiles.add(f);
                        }
                }
+               bucketsToFree = new LinkedList();
        }

        /**
@@ -109,10 +114,21 @@
                return new PaddedEphemerallyEncryptedBucket(fileBucket, 1024, 
len, key, rand);
        }

+       /**
+        * Free an allocated bucket, but only after the change has been written 
to disk.
+        */
        public void freeBucket(Bucket b) throws IOException {
-               b.free();
+               synchronized(this) {
+                       bucketsToFree.add(b);
+               }
        }

+       public Bucket[] grabBucketsToFree() {
+               synchronized(this) {
+                       return (Bucket[]) bucketsToFree.toArray(new 
Bucket[bucketsToFree.size()]);
+               }
+       }
+       
        public File getDir() {
                return dir;
        }


Reply via email to