Author: toad
Date: 2006-08-23 18:52:15 +0000 (Wed, 23 Aug 2006)
New Revision: 10245
Modified:
trunk/freenet/src/freenet/client/async/SingleFileInserter.java
trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java
trunk/freenet/src/freenet/node/Version.java
Log:
953: Maybe fix insert resuming. (For the n'th time).
Modified: trunk/freenet/src/freenet/client/async/SingleFileInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleFileInserter.java
2006-08-23 15:39:30 UTC (rev 10244)
+++ trunk/freenet/src/freenet/client/async/SingleFileInserter.java
2006-08-23 18:52:15 UTC (rev 10245)
@@ -85,6 +85,7 @@
SplitHandler sh = new SplitHandler();
sh.start(fs, false);
cb.onTransition(this, sh);
+ sh.schedule();
return;
} catch (ResumeException e) {
Logger.error(this, "Failed to restore:
"+e, e);
@@ -185,8 +186,12 @@
if(block.getData().size() > Integer.MAX_VALUE)
throw new
InserterException(InserterException.INTERNAL_ERROR, "2GB+ should not encode to
one block!", null);
-
- if(((block.clientMetadata == null) ||
block.clientMetadata.isTrivial()) && !insertAsArchiveManifest) {
+
+ boolean noMetadata = (block.clientMetadata == null) ||
block.clientMetadata.isTrivial();
+ if(metadata && !noMetadata) {
+ throw new
InserterException(InserterException.INTERNAL_ERROR, "MIME type set for a
metadata insert!", null);
+ }
+ if(noMetadata && !insertAsArchiveManifest) {
if(data.size() < blockSize) {
// Just insert it
ClientPutState bi =
@@ -226,6 +231,7 @@
mcb.addURIGenerator(metaPutter);
mcb.add(dataPutter);
cb.onTransition(this, mcb);
+ Logger.minor(this, ""+mcb+" : data
"+dataPutter+" meta "+metaPutter);
mcb.arm();
dataPutter.schedule();
metaPutter.schedule();
@@ -283,6 +289,7 @@
boolean metaInsertSetBlocks;
boolean metaInsertStarted;
boolean metaFetchable;
+ boolean dataFetchable;
/**
* Create a SplitHandler from a stored progress SimpleFieldSet.
@@ -303,6 +310,7 @@
throw new ResumeException("No
SplitFileInserter");
ClientPutState newSFI, newMetaPutter = null;
newSFI = new SplitFileInserter(parent, this,
forceMetadata ? null : block.clientMetadata, ctx, getCHKOnly, meta, token,
insertAsArchiveManifest, sfiFS);
+ Logger.minor(this, "Starting "+newSFI+" for "+this);
fs.removeSubset("SplitFileInserter");
SimpleFieldSet metaFS = fs.subset("MetadataPutter");
if(metaFS != null) {
@@ -322,13 +330,12 @@
// Will be reconstructed later
}
}
+ Logger.minor(this, "Metadata putter "+metadataPutter+"
for "+this);
fs.removeSubset("MetadataPutter");
synchronized(this) {
sfi = newSFI;
metadataPutter = newMetaPutter;
}
-
- newSFI.schedule();
}
public SplitHandler() {
@@ -343,28 +350,30 @@
}
public void onSuccess(ClientPutState state) {
- Logger.minor(this, "onSuccess("+state+")");
+ Logger.minor(this, "onSuccess("+state+") for "+this);
boolean lateStart = false;
synchronized(this) {
if(finished) return;
if(state == sfi) {
- Logger.minor(this, "Splitfile insert
succeeded");
+ Logger.minor(this, "Splitfile insert
succeeded for "+this+" : "+state);
splitInsertSuccess = true;
if(!metaInsertSuccess &&
!metaInsertStarted) {
- Logger.error(this, "Splitfile
insert succeeded but metadata not started, starting anyway...");
+ Logger.error(this, "Splitfile
insert succeeded but metadata not started, starting anyway...
"+metadataPutter+" for "+this+" ( "+sfi+" )");
+ metaInsertStarted = true;
lateStart = true;
+ } else {
+ Logger.minor(this, "Metadata
already started for "+this+" : success="+metaInsertSuccess+"
started="+metaInsertStarted);
}
} else if(state == metadataPutter) {
- Logger.minor(this, "Metadata insert
succeeded");
+ Logger.minor(this, "Metadata insert
succeeded for "+this+" : "+state);
metaInsertSuccess = true;
} else {
- Logger.error(this, "Unknown: "+state,
new Exception("debug"));
+ Logger.error(this, "Unknown: "+state+"
for "+this, new Exception("debug"));
}
if(splitInsertSuccess && metaInsertSuccess) {
- Logger.minor(this, "Both succeeded");
+ Logger.minor(this, "Both succeeded for
"+this);
finished = true;
}
- else return;
}
if(lateStart)
startMetadata();
@@ -426,12 +435,14 @@
try {
synchronized(this) {
metadataPutter = new
SingleFileInserter(parent, this, newBlock, true, ctx, false, getCHKOnly, false,
token, false, true);
+ if(!dataFetchable) return;
}
- Logger.minor(this, "Putting metadata on
"+metadataPutter+" from "+sfi+" ("+((SplitFileInserter)sfi).getLength());
+ Logger.minor(this, "Putting metadata on
"+metadataPutter+" from "+sfi+" ("+((SplitFileInserter)sfi).getLength()+")");
} catch (InserterException e1) {
cb.onFailure(e1, this);
return;
}
+ startMetadata();
}
private void fail(InserterException e) {
@@ -489,7 +500,7 @@
}
public void schedule() throws InserterException {
- // Do nothing
+ sfi.schedule();
}
public Object getToken() {
@@ -529,6 +540,7 @@
Logger.error(this, "onFetchable
for unknown state "+state);
return;
}
+ dataFetchable = true;
if(metaInsertStarted) return;
metaInsertStarted = true;
}
@@ -542,8 +554,19 @@
private void startMetadata() {
try {
-
((SingleFileInserter)metadataPutter).start(null);
+ ClientPutState putter;
+ synchronized(this) {
+ if(metadataPutter == null) {
+ Logger.minor(this, "Cannot
start metadata yet: no metadataPutter");
+ return;
+ }
+ putter = metadataPutter;
+ }
+ Logger.minor(this, "Starting metadata inserter:
"+putter+" for "+this);
+ putter.schedule();
+ Logger.minor(this, "Started metadata inserter:
"+putter+" for "+this);
} catch (InserterException e1) {
+ Logger.error(this, "Failing "+this+" : "+e1,
e1);
fail(e1);
return;
}
Modified: trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java
2006-08-23 15:39:30 UTC (rev 10244)
+++ trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java
2006-08-23 18:52:15 UTC (rev 10245)
@@ -135,6 +135,10 @@
hasURIs = false;
}
boolean blockFinished =
Fields.stringToBool(blockFS.get("Finished"), false) && checkURIs[i] != null;
+ if(blockFinished && checkURIs[i] == null) {
+ Logger.error(this, "No URI for check
block "+i+" of "+segNo+" yet apparently finished?");
+ encoded = false;
+ }
// Read data; only necessary if the block isn't
finished.
if(!blockFinished) {
SimpleFieldSet bucketFS =
blockFS.subset("Data");
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-08-23 15:39:30 UTC (rev
10244)
+++ trunk/freenet/src/freenet/node/Version.java 2006-08-23 18:52:15 UTC (rev
10245)
@@ -21,7 +21,7 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- private static final int buildNumber = 952;
+ private static final int buildNumber = 953;
/** Oldest build of Fred we will talk to */
private static final int oldLastGoodBuild = 944;