Author: toad
Date: 2007-04-14 16:39:39 +0000 (Sat, 14 Apr 2007)
New Revision: 12699

Modified:
   trunk/freenet/src/freenet/node/CHKInsertSender.java
Log:
Actually wait for the downstream nodes.
And complete when all have acknowledged, or 2 minutes after the last 
acknowledgement.

Modified: trunk/freenet/src/freenet/node/CHKInsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/CHKInsertSender.java 2007-04-14 16:37:27 UTC 
(rev 12698)
+++ trunk/freenet/src/freenet/node/CHKInsertSender.java 2007-04-14 16:39:39 UTC 
(rev 12699)
@@ -146,7 +146,7 @@
     // Constants
     static final int ACCEPTED_TIMEOUT = 10000;
     static final int SEARCH_TIMEOUT = 120000;
-    static final int TRANSFER_COMPLETION_TIMEOUT = 120000;
+    static final int TRANSFER_COMPLETION_ACK_TIMEOUT = 120000;

     // Basics
     final NodeCHK myKey;
@@ -179,7 +179,10 @@
     /** Time at which we set status to a value other than NOT_FINISHED */
     private long setStatusTime = -1;

+    /** Time when all transfers were completed */
+    private long transfersCompletedTime = -1;

+    
     private int status = -1;
     /** Still running */
     static final int NOT_FINISHED = -1;
@@ -653,12 +656,12 @@
                        boolean noTimeLeft = false;

                        long now = System.currentTimeMillis();
-                       if((status == NOT_FINISHED) || (setStatusTime == -1)) {
+                       if((status == NOT_FINISHED) || (setStatusTime == -1) || 
transfersCompletedTime == -1) {
                                // Wait 5 seconds, then try again
                                timeout = 5000;
                        } else {
                                // Completed, wait for everything
-                               timeout = (int)Math.min(Integer.MAX_VALUE, 
(setStatusTime + TRANSFER_COMPLETION_TIMEOUT) - now);
+                               timeout = (int)Math.min(Integer.MAX_VALUE, 
(transfersCompletedTime + TRANSFER_COMPLETION_ACK_TIMEOUT) - now);
                        }
                        if(timeout <= 0) {
                                noTimeLeft = true;
@@ -667,14 +670,19 @@


                        MessageFilter mf = null;
+                       boolean waitingForAny = false;
+                       boolean anyNotCompleted = false;
                        for(int i=0;i<waiters.length;i++) {
                                AwaitingCompletion awc = waiters[i];
                                if(!awc.pn.isRoutable()) {
                                        Logger.normal(this, "Disconnected: 
"+awc.pn+" in "+CHKInsertSender.this);
                                        continue;
                                }
-                               if(!awc.completedTransfer)
+                               waitingForAny = true;
+                               if(!awc.completedTransfer) {
+                                       anyNotCompleted = true;
                                        continue;
+                               }
                                if(!awc.receivedCompletionNotice) {
                                        MessageFilter m =
                                                
MessageFilter.create().setField(DMT.UID, 
uid).setType(DMT.FNPInsertTransfersCompleted).setSource(awc.pn).setTimeout(timeout);
@@ -697,27 +705,30 @@
                                                
synchronized(CHKInsertSender.this) {
                                                        if(logMINOR) 
Logger.minor(this, "All transfers completed (1) on "+uid);
                                                        allTransfersCompleted = 
true;
+                                                       transfersCompletedTime 
= System.currentTimeMillis();
                                                        
CHKInsertSender.this.notifyAll();
+                                                       // Now wait for the 
acknowledgements
                                                }
+                                       }
+                               } else {
+                                       
+                                       if(!waitingForAny) {
+                                               // All are disconnected
+                                               allTransfersCompleted = true;
                                                return;
                                        }
-                                       if(noTimeLeft) {
-                                               for(int 
i=0;i<waiters.length;i++) {
-                                                       
if(!waiters[i].pn.isRoutable()) continue;
-                                                       
if(!waiters[i].completedTransfer) {
-                                                               
waiters[i].completedTransfer(false);
-                                                       }
-                                               }
+                                       
+                                       if(!anyNotCompleted) {
+                                               // All have completed 
transferring, AND all have received completion notices!
+                                               // All done!
+                                               if(logMINOR) Logger.minor(this, 
"Completed, status="+getStatusString()+", nothing left to wait for for "+uid+" 
.");
                                                
synchronized(CHKInsertSender.this) {
-                                                       if(logMINOR) 
Logger.minor(this, "All transfers completed (2) on "+uid);
                                                        allTransfersCompleted = 
true;
                                                        
CHKInsertSender.this.notifyAll();
                                                }
                                                return;
                                        }
-                                       // Otherwise, not finished, go back 
around loop
-                                       continue;
-                               } else {
+                                       
                                        // Still waiting for request 
completion, so more may be added
                                        synchronized(nodesWaitingForCompletion) 
{
                                                try {
@@ -822,15 +833,7 @@
                                        }
                                }
                        }
-                       if(completedTransfers) {
-                               // All done!
-                               if(logMINOR) Logger.minor(this, "Completed, 
status="+getStatusString()+", nothing left to wait for for "+uid+" .");
-                               synchronized(CHKInsertSender.this) {
-                                       allTransfersCompleted = true;
-                                       CHKInsertSender.this.notifyAll();
-                               }
-                               return true;
-                       } else return false;
+                       return completedTransfers;
                }

                public String toString() {


Reply via email to