Author: toad
Date: 2006-06-08 01:34:42 +0000 (Thu, 08 Jun 2006)
New Revision: 9078
Modified:
trunk/freenet/src/freenet/client/async/USKFetcher.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:
787: Fix deadlock, hopefully no adverse effects...
Modified: trunk/freenet/src/freenet/client/async/USKFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKFetcher.java 2006-06-07
23:32:19 UTC (rev 9077)
+++ trunk/freenet/src/freenet/client/async/USKFetcher.java 2006-06-08
01:34:42 UTC (rev 9078)
@@ -206,12 +206,12 @@
void onDNF(USKAttempt att) {
Logger.minor(this, "DNF: "+att);
boolean finished = false;
+ long curLatest = uskManager.lookup(origUSK);
synchronized(this) {
if(completed || cancelled) return;
lastFetchedEdition = Math.max(lastFetchedEdition,
att.number);
runningAttempts.remove(att);
if(runningAttempts.isEmpty()) {
- long curLatest = uskManager.lookup(origUSK);
Logger.minor(this, "latest: "+curLatest+", last
fetched: "+lastFetchedEdition+", curLatest+MIN_FAILURES:
"+(curLatest+minFailures));
if(started) {
finished = true;
@@ -226,9 +226,9 @@
private void finishSuccess() {
if(backgroundPoll) {
+ long valAtEnd = uskManager.lookup(origUSK);
synchronized(this) {
started = false; // don't finish before have
rescheduled
- long valAtEnd = uskManager.lookup(origUSK);
if(valAtEnd > valueAtSchedule) {
// Have advanced.
minFailures = origMinFailures;
@@ -243,21 +243,25 @@
long newSleepTime = sleepTime * 2;
if(newSleepTime > maxSleepTime) newSleepTime =
maxSleepTime;
sleepTime = newSleepTime;
- long now = System.currentTimeMillis();
- long end = now + sleepTime;
- long newValAtEnd = valAtEnd;
- // FIXME do this without occupying a thread
- while(now < end && ((newValAtEnd =
uskManager.lookup(origUSK)) == valAtEnd)) {
- long d = end - now;
- if(d > 0)
- try {
+ }
+ long now = System.currentTimeMillis();
+ long end = now + sleepTime;
+ long newValAtEnd = valAtEnd;
+ // FIXME do this without occupying a thread
+ while(now < end && ((newValAtEnd =
uskManager.lookup(origUSK)) == valAtEnd)) {
+ long d = end - now;
+ if(d > 0)
+ try {
+ synchronized(this) {
wait(d);
- } catch (InterruptedException
e) {
- // Maybe break? Go
around loop.
}
- now = System.currentTimeMillis();
- }
- if(newValAtEnd != valAtEnd) {
+ } catch (InterruptedException e) {
+ // Maybe break? Go around loop.
+ }
+ now = System.currentTimeMillis();
+ }
+ if(newValAtEnd != valAtEnd) {
+ synchronized(this) {
minFailures = origMinFailures;
sleepTime = origSleepTime;
}
@@ -277,10 +281,10 @@
void onSuccess(USKAttempt att, boolean dontUpdate, ClientSSKBlock
block) {
LinkedList l = null;
+ long lastEd = uskManager.lookup(origUSK);
synchronized(this) {
runningAttempts.remove(att);
long curLatest = att.number;
- long lastEd = uskManager.lookup(origUSK);
if(!dontUpdate)
uskManager.update(origUSK, curLatest);
if(completed || cancelled) return;
@@ -307,17 +311,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();
}
}
}
@@ -391,9 +395,10 @@
public void schedule() {
USKAttempt[] attempts;
+ long lookedUp = uskManager.lookup(origUSK);
synchronized(this) {
+ valueAtSchedule = Math.max(lookedUp, valueAtSchedule);
if(cancelled) return;
- valueAtSchedule = uskManager.lookup(origUSK);
long startPoint = Math.max(origUSK.suggestedEdition,
valueAtSchedule);
for(long i=startPoint;i<startPoint+minFailures;i++)
add(i);
Modified: trunk/freenet/src/freenet/client/async/USKInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKInserter.java 2006-06-07
23:32:19 UTC (rev 9077)
+++ trunk/freenet/src/freenet/client/async/USKInserter.java 2006-06-08
01:34:42 UTC (rev 9078)
@@ -102,9 +102,9 @@
}
private void scheduleInsert() {
+ long edNo = Math.max(edition, ctx.uskManager.lookup(pubUSK))+1;
synchronized(this) {
if(finished) return;
- long edNo = Math.max(edition,
ctx.uskManager.lookup(pubUSK))+1;
edition = edNo;
Logger.minor(this, "scheduling insert for
"+pubUSK.getURI()+" "+edition);
try {
Modified: trunk/freenet/src/freenet/client/async/USKManager.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKManager.java 2006-06-07
23:32:19 UTC (rev 9077)
+++ trunk/freenet/src/freenet/client/async/USKManager.java 2006-06-08
01:34:42 UTC (rev 9078)
@@ -112,8 +112,13 @@
while(temporaryBackgroundFetchersLRU.size() >
MAX_BACKGROUND_FETCHERS) {
USK del = (USK)
temporaryBackgroundFetchersLRU.pop();
USKFetcher fetcher = (USKFetcher)
backgroundFetchersByClearUSK.get(del.clearCopy());
- if(!fetcher.hasSubscribers())
+ if(!fetcher.hasSubscribers()) {
fetcher.cancel();
+
backgroundFetchersByClearUSK.remove(fetcher);
+ } else {
+ Logger.minor(this, "Allowing temporary
background fetcher to continue as it has subscribers... "+fetcher);
+ // It will burn itself out anyway as
it's a temp fetcher, so no big harm here.
+ }
}
}
if(sched != null) sched.schedule();
@@ -154,8 +159,8 @@
USKFetcher sched = null;
long ed = origUSK.suggestedEdition;
long curEd;
+ curEd = lookup(origUSK);
synchronized(this) {
- curEd = lookup(origUSK);
USK clear = origUSK.clearCopy();
USKCallback[] callbacks = (USKCallback[])
subscribersByClearUSK.get(clear);
if(callbacks == null)
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-06-07 23:32:19 UTC (rev
9077)
+++ trunk/freenet/src/freenet/node/Version.java 2006-06-08 01:34:42 UTC (rev
9078)
@@ -18,7 +18,7 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- private static final int buildNumber = 786;
+ private static final int buildNumber = 787;
/** Oldest build of Fred we will talk to */
private static final int lastGoodBuild = 765;