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() {