[freenet-cvs] r20918 - branches/db4o/freenet/src/freenet/client/async

toad at freenetproject.org toad at freenetproject.org
Tue Jul 1 17:14:16 UTC 2008


Author: toad
Date: 2008-07-01 17:14:16 +0000 (Tue, 01 Jul 2008)
New Revision: 20918

Modified:
   branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
Log:
tripPending() and succeeded() must run at the same high priority, because if succeeded() completes first we end up rerunning the request (through the recently-succeeded mechanism).

Modified: branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java	2008-07-01 16:36:38 UTC (rev 20917)
+++ branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java	2008-07-01 17:14:16 UTC (rev 20918)
@@ -507,6 +507,7 @@
 			ChosenRequest req = null;
 			synchronized(starterQueue) {
 				int size = starterQueue.size();
+				if(logMINOR) Logger.minor(this, "Queue size: "+size);
 				if(size >= MAX_STARTER_QUEUE_SIZE) {
 					if(size >= WARNING_STARTER_QUEUE_SIZE)
 						Logger.error(this, "Queue already full: "+starterQueue.size());
@@ -600,6 +601,14 @@
 		return choosenPriorityScheduler;
 	}
 
+	/*
+	 * tripPendingKey() callbacks must run quickly, since we've found a block.
+	 * succeeded() must run quickly, since we delete the PersistentChosenRequest.
+	 * tripPendingKey() must run before succeeded() so we don't choose the same
+	 * request again, then remove it from pendingKeys before it completes! 
+	 */
+	static final short TRIP_PENDING_PRIORITY = NativeThread.HIGH_PRIORITY-1;
+	
 	public synchronized void succeeded(final BaseSendableGet succeeded, final ChosenRequest req) {
 		if(req.isPersistent()) {
 			jobRunner.queue(new DBJob() {
@@ -609,7 +618,7 @@
 					container.delete((PersistentChosenRequest)req);
 				}
 				
-			}, NativeThread.HIGH_PRIORITY-1, false);
+			}, TRIP_PENDING_PRIORITY, false);
 			// Boost the priority so the PersistentChosenRequest gets deleted reasonably quickly.
 		} else
 			schedTransient.succeeded(succeeded, null);
@@ -674,7 +683,7 @@
 				if(logMINOR) Logger.minor(this, "Finished running callbacks");
 			}
 			
-		}, NativeThread.NORM_PRIORITY, false);
+		}, TRIP_PENDING_PRIORITY, false);
 		
 	}
 




More information about the cvs mailing list