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

toad at freenetproject.org toad at freenetproject.org
Sat Feb 2 23:05:43 UTC 2008


Author: toad
Date: 2008-02-02 23:05:43 +0000 (Sat, 02 Feb 2008)
New Revision: 17484

Modified:
   trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
   trunk/freenet/src/freenet/client/async/OfferedKeysList.java
Log:
Wire in OfferedKeysList.onFound().

Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java	2008-02-02 23:00:04 UTC (rev 17483)
+++ trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java	2008-02-02 23:05:43 UTC (rev 17484)
@@ -572,6 +572,11 @@
 	}
 
 	public void tripPendingKey(final KeyBlock block) {
+		if(offeredKeys != null) {
+			for(int i=0;i<offeredKeys.length;i++) {
+				offeredKeys[i].onFoundKey(block.getKey());
+			}
+		}
 		final Key key = block.getKey();
 		final SendableGet[] gets;
 		Object o;

Modified: trunk/freenet/src/freenet/client/async/OfferedKeysList.java
===================================================================
--- trunk/freenet/src/freenet/client/async/OfferedKeysList.java	2008-02-02 23:00:04 UTC (rev 17483)
+++ trunk/freenet/src/freenet/client/async/OfferedKeysList.java	2008-02-02 23:05:43 UTC (rev 17484)
@@ -3,11 +3,13 @@
  * http://www.gnu.org/ for further details of the GPL. */
 package freenet.client.async;
 
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Vector;
 
 import freenet.crypt.RandomSource;
 import freenet.keys.ClientKey;
+import freenet.keys.Key;
 import freenet.node.LowLevelGetException;
 import freenet.node.NodeClientCore;
 import freenet.node.RequestScheduler;
@@ -30,6 +32,7 @@
  */
 public class OfferedKeysList extends SendableRequest {
 
+	private final HashMap clientKeysByKey;
 	private final HashSet keys;
 	// FIXME is there any way to avoid the O(n) shuffling penalty here?
 	private final Vector keysList;
@@ -41,15 +44,18 @@
 	OfferedKeysList(NodeClientCore core, RandomSource random, short priorityClass) {
 		this.keys = new HashSet();
 		this.keysList = new Vector();
+		clientKeysByKey = new HashMap();
 		this.random = random;
 		this.priorityClass = priorityClass;
 		this.core = core;
 		logMINOR = Logger.shouldLog(Logger.MINOR, this);
 	}
 	
-	/** Called when a key is found. */
-	public synchronized void onFoundKey(ClientKey key) {
+	/** Called when a key is found */
+	public synchronized void onFoundKey(Key key) {
 		logMINOR = Logger.shouldLog(Logger.MINOR, this);
+		ClientKey ck = (ClientKey) clientKeysByKey.remove(key);
+		if(ck == null) return;
 		if(logMINOR) Logger.minor(this, "Found "+key+" , removing it");
 		keys.remove(key);
 		keysList.remove(key);
@@ -61,6 +67,7 @@
 		if(logMINOR) Logger.minor(this, "No offers for "+key+" , removing it");
 		keys.remove(key);
 		keysList.remove(key);
+		clientKeysByKey.remove(key.getNodeKey());
 	}
 
 	public synchronized boolean isEmpty() {
@@ -75,9 +82,10 @@
 	public Object chooseKey() {
 		// Pick a random key
 		if(keysList.isEmpty()) return null;
-		Object o = keysList.remove(random.nextInt(keysList.size()));
-		keys.remove(o);
-		return o;
+		ClientKey ck = (ClientKey) keysList.remove(random.nextInt(keysList.size()));
+		keys.remove(ck);
+		clientKeysByKey.remove(ck.getNodeKey());
+		return ck;
 	}
 
 	public Object getClient() {




More information about the cvs mailing list