Author: toad
Date: 2007-07-14 14:19:47 +0000 (Sat, 14 Jul 2007)
New Revision: 14104

Modified:
   trunk/freenet/src/freenet/node/OpennetManager.java
Log:
Opennet: Don't forget to add the node to the LRU!!!
Also if we get onSuccess() and the node isn't present, re-add it at the top, if 
possible.

Modified: trunk/freenet/src/freenet/node/OpennetManager.java
===================================================================
--- trunk/freenet/src/freenet/node/OpennetManager.java  2007-07-14 14:13:23 UTC 
(rev 14103)
+++ trunk/freenet/src/freenet/node/OpennetManager.java  2007-07-14 14:19:47 UTC 
(rev 14104)
@@ -192,13 +192,13 @@
                        Logger.error(this, "Not adding "+pn.userToString()+" to 
opennet list as already there");
                        return false;
                }
-               return wantPeer(pn);
+               return wantPeer(pn, false);
        }

        /** When did we last offer our noderef to some other node? */
        private long timeLastOffered;

-       public boolean wantPeer(PeerNode nodeToAddNow) {
+       public boolean wantPeer(PeerNode nodeToAddNow, boolean addAtLRU) {
                synchronized(this) {
                        if(peersLRU.size() < MAX_PEERS) {
                                if(nodeToAddNow != null) {
@@ -235,6 +235,10 @@
                                                ret = false;
                                                Logger.error(this, "Could not 
add opennet peer "+nodeToAddNow+" because already in list");
                                        } else {
+                                               if(addAtLRU)
+                                                       
peersLRU.pushLeast(nodeToAddNow);
+                                               else
+                                                       
peersLRU.push(nodeToAddNow);
                                                Logger.error(this, "Added 
opennet peer "+nodeToAddNow+" after clearing "+dropList.size()+" items");       
                              
                                        }
                                        timeLastDropped = now;
@@ -300,9 +304,18 @@
                return null;
        }

-       public synchronized void onSuccess(OpennetPeerNode pn) {
-               peersLRU.push(pn);
-               Logger.error(this, "Opennet peer "+pn+" promoted to top of LRU 
because of successful request");
+       public void onSuccess(OpennetPeerNode pn) {
+               synchronized(this) {
+                       if(peersLRU.contains(pn)) {
+                               peersLRU.push(pn);
+                               Logger.normal(this, "Opennet peer "+pn+" 
promoted to top of LRU because of successful request");
+                               return;
+                       } else {
+                               Logger.error(this, "Success on opennet peer 
which isn't in the LRU!: "+pn, new Exception("debug"));
+                               // Re-add it: nasty race condition when we have 
few peers
+                       }
+               }
+               wantPeer(pn, false);
        }

        public synchronized void onRemove(OpennetPeerNode pn) {


Reply via email to