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, 


Reply via email to