Author: robert
Date: 2008-01-03 23:00:36 +0000 (Thu, 03 Jan 2008)
New Revision: 16866

Modified:
   trunk/freenet/src/freenet/node/CHKInsertSender.java
Log:
Fix deadlock (and generally-bad-idea), waitForBackgroundTransfers() will 
already terminate when receiveFailed is true.
=============================
Found one Java-level deadlock:
=============================
"CHKInsertSender for UID -3348306612631418760 on 35322 at 1199063086969":
  waiting to lock monitor 0x020c2234 (object 0x1bd30fc0, a 
freenet.node.CHKInsertSender),
  which is held by "InsertHandler$DataReceiver for UID -3348306612631418760"
"InsertHandler$DataReceiver for UID -3348306612631418760":
  waiting to lock monitor 0x0212c068 (object 0x1bd31208, a java.util.Vector),
  which is held by "CHKInsertSender for UID -3348306612631418760 on 35322 at 
1199063086969"

Java stack information for the threads listed above:
===================================================
"CHKInsertSender for UID -3348306612631418760 on 35322 at 1199063086969":
        at 
freenet.node.CHKInsertSender.setTransferTimedOut(CHKInsertSender.java:583)
        - waiting to lock <0x1bd30fc0> (a freenet.node.CHKInsertSender)
        at 
freenet.node.CHKInsertSender.waitForBackgroundTransferCompletions(CHKInsertSender.java:708)
        at freenet.node.CHKInsertSender.finish(CHKInsertSender.java:620)
        - locked <0x1bd31208> (a java.util.Vector)
        at freenet.node.CHKInsertSender.realRun(CHKInsertSender.java:548)
        at freenet.node.CHKInsertSender.run(CHKInsertSender.java:234)
        at freenet.support.PooledExecutor$MyThread.run(PooledExecutor.java:129)
"InsertHandler$DataReceiver for UID -3348306612631418760":
        at java.util.Vector.removeAllElements(Vector.java:621)
        - waiting to lock <0x1bd31208> (a java.util.Vector)
        at java.util.Vector.clear(Vector.java:812)
        at freenet.node.CHKInsertSender.receiveFailed(CHKInsertSender.java:662)
        - locked <0x1bd30fc0> (a freenet.node.CHKInsertSender)
        at freenet.node.InsertHandler$DataReceiver.run(InsertHandler.java:436)
        at freenet.support.PooledExecutor$MyThread.run(PooledExecutor.java:129)




Modified: trunk/freenet/src/freenet/node/CHKInsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/CHKInsertSender.java 2008-01-03 21:41:52 UTC 
(rev 16865)
+++ trunk/freenet/src/freenet/node/CHKInsertSender.java 2008-01-03 23:00:36 UTC 
(rev 16866)
@@ -658,8 +658,6 @@
        synchronized(this) {
                status = RECEIVE_FAILED;
                allTransfersCompleted = true;
-                       //FIXME: Won't this leak unclaimed FIFO elements?
-               backgroundTransfers.clear(); // Effectively ... we certainly 
don't want to wait for it.
                notifyAll();
        }
        // Do not call finish(), that can only be called on the main thread and 
it will block.


Reply via email to