Author: toad
Date: 2006-11-12 03:57:31 +0000 (Sun, 12 Nov 2006)
New Revision: 10901
Modified:
trunk/freenet/src/freenet/client/async/ClientGetter.java
trunk/freenet/src/freenet/client/async/USKFetcher.java
trunk/freenet/src/freenet/client/async/USKInserter.java
Log:
Fix deadlock.
Modified: trunk/freenet/src/freenet/client/async/ClientGetter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientGetter.java 2006-11-12
03:44:31 UTC (rev 10900)
+++ trunk/freenet/src/freenet/client/async/ClientGetter.java 2006-11-12
03:57:31 UTC (rev 10901)
@@ -71,6 +71,7 @@
currentState = null;
cancelled = false;
}
+ // Possibility for deadlock?
currentState = SingleFileFetcher.create(this,
this, new ClientMetadata(),
uri, ctx, actx,
ctx.maxNonSplitfileRetries, 0, false, null, true,
returnBucket, true);
Modified: trunk/freenet/src/freenet/client/async/USKFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKFetcher.java 2006-11-12
03:44:31 UTC (rev 10900)
+++ trunk/freenet/src/freenet/client/async/USKFetcher.java 2006-11-12
03:57:31 UTC (rev 10901)
@@ -335,18 +335,17 @@
}
}
cancelBefore(curLatest);
-
- 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();
- }
+ }
+ 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();
}
}
}
@@ -435,7 +434,8 @@
add(i);
attempts = (USKAttempt[]) runningAttempts.toArray(new
USKAttempt[runningAttempts.size()]);
started = true;
- if(!cancelled)
+ }
+ if(!cancelled) {
for(int i=0;i<attempts.length;i++) {
// Race conditions happen here and waste a lot
more time than this simple check.
long lastEd = uskManager.lookup(origUSK);
Modified: trunk/freenet/src/freenet/client/async/USKInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKInserter.java 2006-11-12
03:44:31 UTC (rev 10900)
+++ trunk/freenet/src/freenet/client/async/USKInserter.java 2006-11-12
03:57:31 UTC (rev 10901)
@@ -102,14 +102,16 @@
scheduleInsert();
}
- private synchronized void scheduleInsert() {
+ private void scheduleInsert() {
long edNo = Math.max(edition, ctx.uskManager.lookup(pubUSK))+1;
- if(finished) return;
- edition = edNo;
- if(Logger.shouldLog(Logger.MINOR, this))
- Logger.minor(this, "scheduling insert for
"+pubUSK.getURI()+" "+edition);
- sbi = new SingleBlockInserter(parent, data, compressionCodec,
privUSK.getInsertableSSK(edition).getInsertURI(),
- ctx, this, isMetadata, sourceLength, token,
getCHKOnly, false, true /* we don't use it */, tokenObject);
+ synchronized(this) {
+ if(finished) return;
+ edition = edNo;
+ if(Logger.shouldLog(Logger.MINOR, this))
+ Logger.minor(this, "scheduling insert for
"+pubUSK.getURI()+" "+edition);
+ sbi = new SingleBlockInserter(parent, data,
compressionCodec, privUSK.getInsertableSSK(edition).getInsertURI(),
+ ctx, this, isMetadata, sourceLength,
token, getCHKOnly, false, true /* we don't use it */, tokenObject);
+ }
try {
sbi.schedule();
} catch (InserterException e) {