[freenet-cvs] r18921 - trunk/freenet/src/freenet/client/async

toad at freenetproject.org toad at freenetproject.org
Wed Apr 2 19:55:50 UTC 2008


Author: toad
Date: 2008-04-02 19:55:49 +0000 (Wed, 02 Apr 2008)
New Revision: 18921

Modified:
   trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
Log:
Prevent race condition resulting in losing blocks immediately after scheduling them.

Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java	2008-04-02 17:11:56 UTC (rev 18920)
+++ trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java	2008-04-02 19:55:49 UTC (rev 18921)
@@ -329,6 +329,9 @@
 			prio.add(clientGrabber);
 			if(logMINOR) Logger.minor(this, "Registering retry count "+rc+" with prioclass "+priorityClass+" on "+clientGrabber+" for "+prio);
 		}
+		// SectoredRandomGrabArrayWithInt and lower down have hierarchical locking and auto-remove.
+		// To avoid a race condition it is essential to mirror that here.
+		synchronized(clientGrabber) {
 		// Request
 		SectoredRandomGrabArrayWithObject requestGrabber = (SectoredRandomGrabArrayWithObject) clientGrabber.getGrabber(client);
 		if(requestGrabber == null) {
@@ -338,6 +341,7 @@
 			clientGrabber.addGrabber(client, requestGrabber);
 		}
 		requestGrabber.add(cr, req);
+		}
 	}
 
 	/**
@@ -492,7 +496,7 @@
 						// Whether it is running a request, waiting to execute, or waiting on the
 						// cooldown queue, ULPRs and backdoor coalescing should still be active.
 					}
-					if(logMINOR) Logger.minor(this, "removeFirst() returning "+req);
+					if(logMINOR) Logger.minor(this, "removeFirst() returning "+req+" of "+req.getClientRequest());
 					return req;
 				}
 			}




More information about the cvs mailing list