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;


Reply via email to