Author: toad
Date: 2006-05-17 13:49:06 +0000 (Wed, 17 May 2006)
New Revision: 8739
Modified:
trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
trunk/freenet/src/freenet/client/async/SingleFileInserter.java
trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java
trunk/freenet/src/freenet/client/async/USKFetcher.java
trunk/freenet/src/freenet/client/async/USKFetcherWrapper.java
trunk/freenet/src/freenet/client/async/USKInserter.java
trunk/freenet/src/freenet/client/async/USKManager.java
trunk/freenet/src/freenet/node/Version.java
Log:
716: Many bugfixes relating to USK and manifest inserts.
Modified: trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
2006-05-17 11:37:04 UTC (rev 8738)
+++ trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
2006-05-17 13:49:06 UTC (rev 8739)
@@ -85,10 +85,10 @@
}
public void onEncode(BaseClientKey key, ClientPutState state) {
+ Logger.minor(this, "onEncode("+key+") for "+this);
if(metadata == null) {
- // Don't have metadata yet
- // Do have key
- // So make a redirect to the key
+ // The file was too small to have its own
metadata, we get this instead.
+ // So we make the key into metadata.
Metadata m =
new Metadata(Metadata.SIMPLE_REDIRECT,
key.getURI(), cm);
onMetadata(m, null);
@@ -171,6 +171,7 @@
private final String defaultName;
private int numberOfFiles;
private long totalSize;
+ private boolean metadataBlockSetFinalized;
private final static String[] defaultDefaultNames =
new String[] { "index.html", "index.htm", "default.html",
"default.htm" };
@@ -313,10 +314,17 @@
}
private void insertedAllFiles() {
+ Logger.minor(this, "Inserted all files");
synchronized(this) {
insertedAllFiles = true;
- if(finished || cancelled) return;
- if(!insertedManifest) return;
+ if(finished || cancelled) {
+ Logger.minor(this, "Already
"+(finished?"finished":"cancelled"));
+ return;
+ }
+ if(!insertedManifest) {
+ Logger.minor(this, "Haven't inserted manifest");
+ return;
+ }
finished = true;
}
complete();
@@ -347,10 +355,17 @@
}
public void onSuccess(ClientPutState state) {
+ Logger.minor(this, "Inserted manifest successfully on "+this);
synchronized(this) {
insertedManifest = true;
- if(!finished) return;
- if(!insertedAllFiles) return;
+ if(finished) {
+ Logger.minor(this, "Already finished");
+ return;
+ }
+ if(!insertedAllFiles) {
+ Logger.minor(this, "Not inserted all files");
+ return;
+ }
finished = true;
}
complete();
@@ -385,9 +400,21 @@
}
public void onBlockSetFinished(ClientPutState state) {
+ synchronized(this) {
+ this.metadataBlockSetFinalized = true;
+ if(!waitingForBlockSets.isEmpty()) return;
+ }
this.blockSetFinalized();
}
+ public void blockSetFinalized() {
+ synchronized(this) {
+ if(!metadataBlockSetFinalized) return;
+ if(waitingForBlockSets.isEmpty()) return;
+ }
+ super.blockSetFinalized();
+ }
+
/**
* Convert a HashMap of name -> bucket to a HashSet of ManifestEntry's.
* All are to have mimeOverride=null, i.e. we use the auto-detected
mime type
Modified: trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
2006-05-17 11:37:04 UTC (rev 8738)
+++ trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
2006-05-17 13:49:06 UTC (rev 8739)
@@ -35,6 +35,7 @@
private int retries;
private final FailureCodeTracker errors;
private boolean finished;
+ private final boolean dontSendEncoded;
private ClientKey key;
private WeakReference refToClientKeyBlock;
final int token; // for e.g. splitfiles
@@ -43,10 +44,11 @@
final int sourceLength;
private int consecutiveRNFs;
- public SingleBlockInserter(BaseClientPutter parent, Bucket data, short
compressionCodec, FreenetURI uri, InserterContext ctx, PutCompletionCallback
cb, boolean isMetadata, int sourceLength, int token, boolean getCHKOnly,
boolean addToParent) throws InserterException {
+ public SingleBlockInserter(BaseClientPutter parent, Bucket data, short
compressionCodec, FreenetURI uri, InserterContext ctx, PutCompletionCallback
cb, boolean isMetadata, int sourceLength, int token, boolean getCHKOnly,
boolean addToParent, boolean dontSendEncoded) throws InserterException {
this.consecutiveRNFs = 0;
this.token = token;
this.parent = parent;
+ this.dontSendEncoded = dontSendEncoded;
this.retries = 0;
this.finished = false;
this.ctx = ctx;
@@ -104,7 +106,8 @@
refToClientKeyBlock =
new WeakReference(block);
resultingURI = block.getClientKey().getURI();
- cb.onEncode(block.getClientKey(), this);
+ if(!dontSendEncoded)
+ cb.onEncode(block.getClientKey(), this);
return block;
}
Modified: trunk/freenet/src/freenet/client/async/SingleFileInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleFileInserter.java
2006-05-17 11:37:04 UTC (rev 8738)
+++ trunk/freenet/src/freenet/client/async/SingleFileInserter.java
2006-05-17 13:49:06 UTC (rev 8739)
@@ -174,7 +174,7 @@
if (data.size() < ClientCHKBlock.MAX_COMPRESSED_DATA_LENGTH) {
// Insert single block, then insert pointer to it
if(reportMetadataOnly) {
- SingleBlockInserter dataPutter = new
SingleBlockInserter(parent, data, codecNumber, FreenetURI.EMPTY_CHK_URI, ctx,
cb, metadata, (int)origSize, -1, getCHKOnly, true);
+ SingleBlockInserter dataPutter = new
SingleBlockInserter(parent, data, codecNumber, FreenetURI.EMPTY_CHK_URI, ctx,
cb, metadata, (int)origSize, -1, getCHKOnly, true, true);
Metadata meta = new
Metadata(Metadata.SIMPLE_REDIRECT, dataPutter.getURI(), block.clientMetadata);
cb.onMetadata(meta, this);
cb.onTransition(this, dataPutter);
@@ -183,7 +183,7 @@
} else {
MultiPutCompletionCallback mcb =
new MultiPutCompletionCallback(cb,
parent);
- SingleBlockInserter dataPutter = new
SingleBlockInserter(parent, data, codecNumber, FreenetURI.EMPTY_CHK_URI, ctx,
mcb, metadata, (int)origSize, -1, getCHKOnly, true);
+ SingleBlockInserter dataPutter = new
SingleBlockInserter(parent, data, codecNumber, FreenetURI.EMPTY_CHK_URI, ctx,
mcb, metadata, (int)origSize, -1, getCHKOnly, true, false);
Metadata meta = new
Metadata(Metadata.SIMPLE_REDIRECT, dataPutter.getURI(), block.clientMetadata);
Bucket metadataBucket;
try {
@@ -233,7 +233,7 @@
}
} else {
return new SingleBlockInserter(parent, data,
compressionCodec, uri, ctx, cb, isMetadata, sourceLength, token,
- getCHKOnly, addToParent);
+ getCHKOnly, addToParent, false);
}
}
Modified: trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java
2006-05-17 11:37:04 UTC (rev 8738)
+++ trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java
2006-05-17 13:49:06 UTC (rev 8739)
@@ -55,7 +55,7 @@
public void start() throws InserterException {
for(int i=0;i<dataBlockInserters.length;i++) {
dataBlockInserters[i] =
- new SingleBlockInserter(parent.parent,
dataBlocks[i], (short)-1, FreenetURI.EMPTY_CHK_URI, blockInsertContext, this,
false, ClientCHKBlock.DATA_LENGTH, i, getCHKOnly, false);
+ new SingleBlockInserter(parent.parent,
dataBlocks[i], (short)-1, FreenetURI.EMPTY_CHK_URI, blockInsertContext, this,
false, ClientCHKBlock.DATA_LENGTH, i, getCHKOnly, false, false);
dataBlockInserters[i].schedule();
}
if(splitfileAlgo == null) {
@@ -81,7 +81,7 @@
// Start the inserts
for(int i=0;i<checkBlockInserters.length;i++) {
checkBlockInserters[i] =
- new SingleBlockInserter(parent.parent,
checkBlocks[i], (short)-1, FreenetURI.EMPTY_CHK_URI, blockInsertContext, this,
false, ClientCHKBlock.DATA_LENGTH, i + dataBlocks.length, getCHKOnly, false);
+ new SingleBlockInserter(parent.parent,
checkBlocks[i], (short)-1, FreenetURI.EMPTY_CHK_URI, blockInsertContext, this,
false, ClientCHKBlock.DATA_LENGTH, i + dataBlocks.length, getCHKOnly, false,
false);
checkBlockInserters[i].schedule();
}
// Tell parent only after have started the inserts.
Modified: trunk/freenet/src/freenet/client/async/USKFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKFetcher.java 2006-05-17
11:37:04 UTC (rev 8738)
+++ trunk/freenet/src/freenet/client/async/USKFetcher.java 2006-05-17
13:49:06 UTC (rev 8739)
@@ -99,6 +99,7 @@
boolean succeeded;
/** DNF? */
boolean dnf;
+ boolean cancelled = false;
public USKAttempt(long i) {
this.number = i;
this.succeeded = false;
@@ -134,6 +135,7 @@
}
public void cancel() {
+ cancelled = true;
if(checker != null) checker.cancel();
}
@@ -292,16 +294,23 @@
long addFrom = Math.max(lastAddedEdition + 1, curLatest
+ 1);
if(addTo >= addFrom) {
l = new LinkedList();
- for(long i=addFrom;i<=addTo;i++)
+ for(long i=addFrom;i<=addTo;i++) {
+ Logger.minor(this, "Adding checker for
edition "+i);
l.add(add(i));
+ }
}
cancelBefore(curLatest);
- }
- if(l == null) return;
- else if(!cancelled) {
- for(Iterator i=l.iterator();i.hasNext();) {
- USKAttempt a = (USKAttempt) i.next();
- a.schedule();
+ if(l == null) return;
+ // If we schedule them here, we don't get icky
recursion problems.
+ else if(!cancelled) {
+ for(Iterator i=l.iterator();i.hasNext();) {
+ // We may be called recursively through
onSuccess().
+ // So don't start obsolete requests.
+ USKAttempt a = (USKAttempt) i.next();
+ lastEd = uskManager.lookup(origUSK);
+ if(lastEd <= a.number && !a.cancelled)
+ a.schedule();
+ }
}
}
}
@@ -336,8 +345,10 @@
private synchronized void cancelBefore(long curLatest) {
for(Iterator i=runningAttempts.iterator();i.hasNext();) {
USKAttempt att = (USKAttempt) (i.next());
- if(att.number < curLatest)
+ if(att.number < curLatest) {
att.cancel();
+ i.remove();
+ }
}
}
@@ -350,8 +361,8 @@
Logger.minor(this, "Adding USKAttempt for "+i+" for
"+origUSK.getURI());
if(!runningAttempts.isEmpty()) {
USKAttempt last = (USKAttempt)
runningAttempts.lastElement();
- if(last.number > i)
- throw new IllegalStateException("Adding "+i+"
but last was "+last.number);
+ if(last.number >= i)
+ return null;
}
USKAttempt a = new USKAttempt(i);
runningAttempts.add(a);
Modified: trunk/freenet/src/freenet/client/async/USKFetcherWrapper.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKFetcherWrapper.java
2006-05-17 11:37:04 UTC (rev 8738)
+++ trunk/freenet/src/freenet/client/async/USKFetcherWrapper.java
2006-05-17 13:49:06 UTC (rev 8739)
@@ -11,8 +11,8 @@
USK usk;
- public USKFetcherWrapper(USK usk, ClientRequestScheduler chkScheduler,
ClientRequestScheduler sskScheduler) {
- super(RequestStarter.UPDATE_PRIORITY_CLASS, chkScheduler,
sskScheduler, usk);
+ public USKFetcherWrapper(USK usk, short prio, ClientRequestScheduler
chkScheduler, ClientRequestScheduler sskScheduler) {
+ super(prio, chkScheduler, sskScheduler, usk);
this.usk = usk;
}
Modified: trunk/freenet/src/freenet/client/async/USKInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKInserter.java 2006-05-17
11:37:04 UTC (rev 8738)
+++ trunk/freenet/src/freenet/client/async/USKInserter.java 2006-05-17
13:49:06 UTC (rev 8739)
@@ -68,7 +68,7 @@
Logger.minor(this, "scheduling fetcher for "+pubUSK.getURI());
synchronized(this) {
if(finished) return;
- fetcher =
ctx.uskManager.getFetcherForInsertDontSchedule(pubUSK, this);
+ fetcher =
ctx.uskManager.getFetcherForInsertDontSchedule(pubUSK, parent.priorityClass,
this);
}
fetcher.schedule();
}
@@ -108,7 +108,7 @@
Logger.minor(this, "scheduling insert for
"+pubUSK.getURI()+" "+edition);
try {
sbi = new SingleBlockInserter(parent, data,
compressionCodec, privUSK.getInsertableSSK(edition).getInsertURI(),
- ctx, this, isMetadata,
sourceLength, token, getCHKOnly, false);
+ ctx, this, isMetadata,
sourceLength, token, getCHKOnly, false, true /* we don't use it */);
} catch (InserterException e) {
cb.onFailure(e, this);
return;
Modified: trunk/freenet/src/freenet/client/async/USKManager.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKManager.java 2006-05-17
11:37:04 UTC (rev 8738)
+++ trunk/freenet/src/freenet/client/async/USKManager.java 2006-05-17
13:49:06 UTC (rev 8739)
@@ -91,9 +91,9 @@
return f;
}
- public USKFetcher getFetcherForInsertDontSchedule(USK usk,
USKFetcherCallback cb) {
+ public USKFetcher getFetcherForInsertDontSchedule(USK usk, short
prioClass, USKFetcherCallback cb) {
USKFetcher f = new USKFetcher(usk, this,
backgroundFetchContext,
- new USKFetcherWrapper(usk, chkRequestScheduler,
sskRequestScheduler), 3, false);
+ new USKFetcherWrapper(usk, prioClass,
chkRequestScheduler, sskRequestScheduler), 3, false);
f.addCallback(cb);
return f;
}
@@ -104,7 +104,7 @@
synchronized(this) {
USKFetcher f = (USKFetcher)
backgroundFetchersByClearUSK.get(clear);
if(f == null) {
- f = new USKFetcher(usk, this,
backgroundFetchContext, new USKFetcherWrapper(usk, chkRequestScheduler,
sskRequestScheduler), 10, true);
+ f = new USKFetcher(usk, this,
backgroundFetchContext, new USKFetcherWrapper(usk,
RequestStarter.UPDATE_PRIORITY_CLASS, chkRequestScheduler,
sskRequestScheduler), 10, true);
sched = f;
backgroundFetchersByClearUSK.put(clear, f);
}
@@ -170,7 +170,7 @@
if(runBackgroundFetch) {
USKFetcher f = (USKFetcher)
backgroundFetchersByClearUSK.get(clear);
if(f == null) {
- f = new USKFetcher(origUSK, this,
backgroundFetchContext, new USKFetcherWrapper(origUSK, chkRequestScheduler,
sskRequestScheduler), 10, true);
+ f = new USKFetcher(origUSK, this,
backgroundFetchContext, new USKFetcherWrapper(origUSK,
RequestStarter.UPDATE_PRIORITY_CLASS, chkRequestScheduler,
sskRequestScheduler), 10, true);
sched = f;
backgroundFetchersByClearUSK.put(clear,
f);
}
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-05-17 11:37:04 UTC (rev
8738)
+++ trunk/freenet/src/freenet/node/Version.java 2006-05-17 13:49:06 UTC (rev
8739)
@@ -18,7 +18,7 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- private static final int buildNumber = 715;
+ private static final int buildNumber = 716;
/** Oldest build of Fred we will talk to */
private static final int lastGoodBuild = 591;