Author: toad
Date: 2007-12-22 19:23:57 +0000 (Sat, 22 Dec 2007)
New Revision: 16789
Modified:
trunk/freenet/src/freenet/io/comm/AsyncMessageFilterCallback.java
trunk/freenet/src/freenet/io/comm/MessageCore.java
trunk/freenet/src/freenet/io/comm/MessageFilter.java
trunk/freenet/src/freenet/io/comm/NullAsyncMessageFilterCallback.java
trunk/freenet/src/freenet/io/xfer/BulkTransmitter.java
trunk/freenet/src/freenet/node/CHKInsertSender.java
Log:
Add onTimeout() to AsyncMessageFilterCallback.
CHKInsertSender assumed matched(null) means timeout, it doesn't, it should
never happen.
Fixes CHKInsertSender's never completing because they are perpetually waiting
for transfer completions that never time out.
That bug caused some very serious problems: eventually the node would no longer
accept any requests or do anything.
Modified: trunk/freenet/src/freenet/io/comm/AsyncMessageFilterCallback.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/AsyncMessageFilterCallback.java
2007-12-22 19:04:07 UTC (rev 16788)
+++ trunk/freenet/src/freenet/io/comm/AsyncMessageFilterCallback.java
2007-12-22 19:23:57 UTC (rev 16789)
@@ -24,4 +24,8 @@
*/
boolean shouldTimeout();
+ /**
+ * Called when the filter times out and is removed from the list of
filters to match.
+ */
+ void onTimeout();
}
Modified: trunk/freenet/src/freenet/io/comm/MessageCore.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/MessageCore.java 2007-12-22 19:04:07 UTC
(rev 16788)
+++ trunk/freenet/src/freenet/io/comm/MessageCore.java 2007-12-22 19:23:57 UTC
(rev 16789)
@@ -99,10 +99,13 @@
*/
void removeTimedOutFilters() {
long tStart = System.currentTimeMillis();
+ boolean logDEBUG = Logger.shouldLog(Logger.DEBUG, this);
synchronized (_filters) {
for (ListIterator i = _filters.listIterator();
i.hasNext();) {
MessageFilter f = (MessageFilter) i.next();
if (f.timedOut(tStart)) {
+ if(logDEBUG)
+ Logger.minor(this, "Removing
"+f);
i.remove();
_timedOutFilters.add(f);
} else { // Because _filters are in order of
timeout, we
Modified: trunk/freenet/src/freenet/io/comm/MessageFilter.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/MessageFilter.java 2007-12-22
19:04:07 UTC (rev 16788)
+++ trunk/freenet/src/freenet/io/comm/MessageFilter.java 2007-12-22
19:23:57 UTC (rev 16789)
@@ -284,7 +284,10 @@
/**
* Notify waiters that we have timed out.
*/
- public synchronized void onTimedOut() {
- notifyAll();
+ public void onTimedOut() {
+ synchronized(this) {
+ notifyAll();
+ }
+ _callback.onTimeout();
}
}
Modified: trunk/freenet/src/freenet/io/comm/NullAsyncMessageFilterCallback.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/NullAsyncMessageFilterCallback.java
2007-12-22 19:04:07 UTC (rev 16788)
+++ trunk/freenet/src/freenet/io/comm/NullAsyncMessageFilterCallback.java
2007-12-22 19:23:57 UTC (rev 16789)
@@ -12,4 +12,8 @@
return false;
}
+ public void onTimeout() {
+ // Do nothing
+ }
+
}
Modified: trunk/freenet/src/freenet/io/xfer/BulkTransmitter.java
===================================================================
--- trunk/freenet/src/freenet/io/xfer/BulkTransmitter.java 2007-12-22
19:04:07 UTC (rev 16788)
+++ trunk/freenet/src/freenet/io/xfer/BulkTransmitter.java 2007-12-22
19:23:57 UTC (rev 16789)
@@ -83,6 +83,9 @@
if(BulkTransmitter.this.prb.isAborted()) return true;
return false;
}
+ public void onTimeout() {
+ // Ignore
+ }
});
prb.usm.addAsyncFilter(MessageFilter.create().setNoTimeout().setSource(peer).setType(DMT.FNPBulkReceivedAll).setField(DMT.UID,
uid),
new AsyncMessageFilterCallback() {
@@ -96,6 +99,9 @@
if(BulkTransmitter.this.prb.isAborted()) return true;
return false;
}
+ public void onTimeout() {
+ // Ignore
+ }
});
} catch (DisconnectedException e) {
cancel();
Modified: trunk/freenet/src/freenet/node/CHKInsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/CHKInsertSender.java 2007-12-22 19:04:07 UTC
(rev 16788)
+++ trunk/freenet/src/freenet/node/CHKInsertSender.java 2007-12-22 19:23:57 UTC
(rev 16789)
@@ -115,14 +115,6 @@
}
public void onMatched(Message m) {
- if (m==null) {
- /* FIXME: Cascading timeout...
- if this times out, we don't have any time to
report to the node of origin the timeout notification (anyTimedOut?).
- */
- Logger.error(this, "Timed out waiting for a
final ack from: "+pn);
- receivedNotice(false);
- return;
- }
PeerNode pn = (PeerNode) m.getSource();
// pn cannot be null, because the filters will prevent
garbage collection of the nodes
@@ -145,6 +137,14 @@
private MessageFilter getNotificationMessageFilter() {
return MessageFilter.create().setField(DMT.UID,
uid).setType(DMT.FNPInsertTransfersCompleted).setSource(pn).setTimeout(TRANSFER_COMPLETION_ACK_TIMEOUT);
}
+
+ public void onTimeout() {
+ /* FIXME: Cascading timeout...
+ if this times out, we don't have any time to report
to the node of origin the timeout notification (anyTimedOut?).
+ */
+ Logger.error(this, "Timed out waiting for a final ack
from: "+pn);
+ receivedNotice(false);
+ }
}
CHKInsertSender(NodeCHK myKey, long uid, byte[] headers, short htl,