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.