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;
}