[freenet-cvs] r17487 - in trunk/freenet/src/freenet: client/async node

toad at freenetproject.org toad at freenetproject.org
Sat Feb 2 23:38:44 UTC 2008


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

Modified:
   trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
   trunk/freenet/src/freenet/client/async/OfferedKeysList.java
   trunk/freenet/src/freenet/node/FailureTable.java
   trunk/freenet/src/freenet/node/NodeClientCore.java
Log:
Queue keys we want at the priority level we want them at.
Queue keys other people want at IMMEDIATE_SPLITFILE_PRIORITY_CLASS.

Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java	2008-02-02 23:20:27 UTC (rev 17486)
+++ trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java	2008-02-02 23:38:43 UTC (rev 17487)
@@ -612,4 +612,30 @@
 			return pendingKeys.get(key) != null;
 		}
 	}
+
+	/** If we want the offered key, or if force is enabled, queue it */
+	public void maybeQueueOfferedKey(Key key, boolean force) {
+		short priority = Short.MAX_VALUE;
+		synchronized(this) {
+			if(force) {
+				// FIXME what priority???
+				priority = RequestStarter.IMMEDIATE_SPLITFILE_PRIORITY_CLASS;
+			}
+			Object o = pendingKeys.get(key);
+			if(o == null) {
+				// Blah
+			} else if(o instanceof SendableGet) {
+				short p = ((SendableGet)o).getPriorityClass();
+				if(p < priority) priority = p;
+			} else { // if(o instanceof SendableGet[]) {
+				SendableGet[] gets = (SendableGet[]) o;
+				for(int i=0;i<gets.length;i++) {
+					short p = gets[i].getPriorityClass();
+					if(p < priority) priority = p;
+				}
+			}
+		}
+		if(priority == Short.MAX_VALUE) return;
+		offeredKeys[priority].queueKey(key);
+	}
 }

Modified: trunk/freenet/src/freenet/client/async/OfferedKeysList.java
===================================================================
--- trunk/freenet/src/freenet/client/async/OfferedKeysList.java	2008-02-02 23:20:27 UTC (rev 17486)
+++ trunk/freenet/src/freenet/client/async/OfferedKeysList.java	2008-02-02 23:38:43 UTC (rev 17487)
@@ -3,7 +3,6 @@
  * 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;
 
@@ -31,7 +30,6 @@
  */
 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;
@@ -43,7 +41,6 @@
 	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;
@@ -53,11 +50,10 @@
 	/** Called when a key is found, when it no longer belogns to this list etc. */
 	public synchronized void remove(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);
+		if(keys.remove(key)) {
+			if(logMINOR) Logger.minor(this, "Found "+key+" , removing it");
+			keysList.remove(key);
+		}
 	}
 	
 	/** Called when there are no more valid offers for a key */
@@ -67,7 +63,6 @@
 		Key k = key.getNodeKey();
 		keys.remove(k);
 		keysList.remove(k);
-		clientKeysByKey.remove(k);
 	}
 
 	public synchronized boolean isEmpty() {
@@ -84,7 +79,6 @@
 		if(keysList.isEmpty()) return null;
 		Key k = (Key) keysList.remove(random.nextInt(keysList.size()));
 		keys.remove(k);
-		clientKeysByKey.remove(k);
 		return k;
 	}
 
@@ -123,4 +117,10 @@
 		return false;
 	}
 
+	public synchronized void queueKey(Key key) {
+		if(keys.add(key)) {
+			keysList.add(key);
+		}
+	}
+
 }

Modified: trunk/freenet/src/freenet/node/FailureTable.java
===================================================================
--- trunk/freenet/src/freenet/node/FailureTable.java	2008-02-02 23:20:27 UTC (rev 17486)
+++ trunk/freenet/src/freenet/node/FailureTable.java	2008-02-02 23:38:43 UTC (rev 17487)
@@ -6,6 +6,7 @@
 import java.lang.ref.WeakReference;
 import java.util.Vector;
 
+import freenet.client.async.ClientRequestScheduler;
 import freenet.io.comm.DMT;
 import freenet.io.comm.Message;
 import freenet.io.comm.NotConnectedException;
@@ -238,22 +239,12 @@
 	 * @param peer The node offering it.
 	 * @param authenticator 
 	 */
-	public void onOffer(Key key, PeerNode peer, byte[] authenticator) {
-		if(wantOffer(key, peer, authenticator)) {
-			// Okay, we want the offer. Now what?
-			// Two ClientRequestScheduler's? Then you'd have to remove the key from two different RGA's :(
-			// Anyway, we don't want a key to be requested just because another key in the same group has an offer.
-			// So what we want is a list of keys at each level which have been offered.
-			// These would be considered before the other keys at that level, but only if the offer is still valid.
-		}
-	}
-	
-	boolean wantOffer(Key key, PeerNode peer, byte[] authenticator) {
+	void onOffer(Key key, PeerNode peer, byte[] authenticator) {
 		FailureTableEntry entry;
 		long now = System.currentTimeMillis();
 		synchronized(this) {
 			entry = (FailureTableEntry) entriesByKey.get(key);
-			if(entry == null) return false; // we haven't asked for it
+			if(entry == null) return; // we haven't asked for it
 			
 			/*
 			 * Accept (subject to later checks) if we asked for it.
@@ -287,7 +278,7 @@
 			if(!(entry.askedFromPeer(peer, now) || 
 					((key instanceof NodeCHK) && entry.askedByPeer(peer, now)))) {
 				if(entry.isEmpty(now)) entriesByKey.removeKey(key);
-				return false;
+				return;
 			}
 			if(entry.isEmpty(now)) entriesByKey.removeKey(key);
 			
@@ -307,10 +298,8 @@
 		}
 		
 		// Now, does anyone want it?
-		// Firstly, do we want it?
-		if(!node.clientCore.clientWantKey(key)) return true;
-		if(entry.othersWant(peer)) return true;
-		return false;
+		
+		node.clientCore.maybeQueueOfferedKey(key, entry.othersWant(peer));
 	}
 
 	private synchronized void trimOffersList(long now) {

Modified: trunk/freenet/src/freenet/node/NodeClientCore.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeClientCore.java	2008-02-02 23:20:27 UTC (rev 17486)
+++ trunk/freenet/src/freenet/node/NodeClientCore.java	2008-02-02 23:38:43 UTC (rev 17487)
@@ -9,6 +9,7 @@
 import freenet.client.HighLevelSimpleClientImpl;
 import freenet.client.InsertContext;
 import freenet.client.async.BackgroundBlockEncoder;
+import freenet.client.async.ClientRequestScheduler;
 import freenet.client.async.HealingQueue;
 import freenet.client.async.SimpleHealingQueue;
 import freenet.client.async.USKManager;
@@ -1096,4 +1097,14 @@
 	public boolean hasLoadedQueue() {
 		return fcpServer.hasFinishedStart();
 	}
+
+	/** Pass the offered key down to the client layer.
+	 * If the client layer wants it, or force is enabled, queue it. */
+	public void maybeQueueOfferedKey(Key key, boolean force) {
+		ClientRequestScheduler sched =
+			key instanceof NodeSSK ?
+					requestStarters.sskFetchScheduler :
+						requestStarters.chkFetchScheduler;
+		sched.maybeQueueOfferedKey(key, force);
+	}
 }




More information about the cvs mailing list