[freenet-cvs] r15479 - trunk/freenet/src/freenet/node

toad at freenetproject.org toad at freenetproject.org
Mon Oct 22 19:05:24 UTC 2007


Author: toad
Date: 2007-10-22 19:05:24 +0000 (Mon, 22 Oct 2007)
New Revision: 15479

Modified:
   trunk/freenet/src/freenet/node/CHKInsertSender.java
Log:
Set the status code immediately on a receive failure. But don't do a full finish(). Make finish() understand this if it is called afterwards.
Minor javadocs.
Trivial code moving around.
Hopefully this will prevent runaway InsertHandler's waiting in waitForStatus.

Modified: trunk/freenet/src/freenet/node/CHKInsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/CHKInsertSender.java	2007-10-22 19:02:25 UTC (rev 15478)
+++ trunk/freenet/src/freenet/node/CHKInsertSender.java	2007-10-22 19:05:24 UTC (rev 15479)
@@ -550,17 +550,29 @@
    		notifyAll();
 	}
     
+    /**
+     * Finish the insert process. Will set status, wait for underlings to complete, and report success
+     * if appropriate.
+     * @param code The status code to set. 
+     * @param next The node we successfully inserted to.
+     */
     private void finish(int code, PeerNode next) {
     	if(logMINOR) Logger.minor(this, "Finished: "+code+" on "+this, new Exception("debug"));
      
         synchronized(this) {   
-        	if(status != NOT_FINISHED)
-        		throw new IllegalStateException("finish() called with "+code+" when was already "+status);
-
         	if((code == ROUTE_NOT_FOUND) && !sentRequest)
         		code = ROUTE_REALLY_NOT_FOUND;
 
-            status = code;
+        	if(status != NOT_FINISHED) {
+        		if(status == RECEIVE_FAILED) {
+        			if(code == SUCCESS)
+        				Logger.error(this, "Request succeeded despite receive failed?! on "+this);
+        		}
+        		throw new IllegalStateException("finish() called with "+code+" when was already "+status);
+        	} else {
+                status = code;
+        	}
+        	
         	notifyAll();
         	if(logMINOR) Logger.minor(this, "Set status code: "+getStatusString()+" on "+uid);
         }
@@ -607,6 +619,15 @@
     		receiveFailed = true;
     		nodesWaitingForCompletion.notifyAll();
     	}
+    	// Set status immediately.
+    	// The code (e.g. waitForStatus()) relies on a status eventually being set,
+    	// so we may as well set it here. The alternative is to set it in realRun()
+    	// when we notice that receiveFailed = true.
+    	synchronized(this) {
+    		status = RECEIVE_FAILED;
+    		notifyAll();
+    	}
+    	// Do not call finish(), that can only be called on the main thread and it will block.
     }
 
     /**




More information about the cvs mailing list