Author: toad
Date: 2008-01-26 17:26:04 +0000 (Sat, 26 Jan 2008)
New Revision: 17303

Modified:
   trunk/freenet/src/freenet/node/updater/UpdateOverMandatoryManager.java
Log:
UOM logic:
- Try each node which has offered us the key once. Don't loop indefinitely 
trying the first node only.
- Refactoring.
- Logging.

Modified: trunk/freenet/src/freenet/node/updater/UpdateOverMandatoryManager.java
===================================================================
--- trunk/freenet/src/freenet/node/updater/UpdateOverMandatoryManager.java      
2008-01-26 13:04:31 UTC (rev 17302)
+++ trunk/freenet/src/freenet/node/updater/UpdateOverMandatoryManager.java      
2008-01-26 17:26:04 UTC (rev 17303)
@@ -206,7 +206,7 @@
                        try {
                                FreenetURI mainJarURI = new 
FreenetURI(jarKey).setSuggestedEdition(mainJarVersion);
                                
if(mainJarURI.equals(updateManager.updateURI.setSuggestedEdition(mainJarVersion)))
 {
-                                       sendUOMRequestMain(source);
+                                       sendUOMRequestMain(source, true);
                                } else {
                                        System.err.println("Node 
"+source.userToString()+" offered us a new main jar (version 
"+mainJarVersion+") but his key was different to ours:\n"+
                                                        "our key: 
"+updateManager.updateURI+"\nhis key:"+mainJarURI);
@@ -221,11 +221,12 @@
                return true;
        }

-       protected void sendUOMRequestMain(final PeerNode source) {
+       protected void sendUOMRequestMain(final PeerNode source, boolean 
addOnFail) {
                synchronized(this) {
-                       if(nodesAskedSendMainJar.size() + 
nodesSendingMainJar.size() >= MAX_NODES_SENDING_MAIN_JAR) {
-                               if(nodesOfferedMainJar.add(source))
+                       if(addOnFail && nodesAskedSendMainJar.size() + 
nodesSendingMainJar.size() >= MAX_NODES_SENDING_MAIN_JAR) {
+                               if(nodesOfferedMainJar.add(source)) {
                                        System.err.println("Offered main jar by 
"+source.userToString()+" (already fetching from 
"+nodesSendingMainJar.size()+"), but will use this offer if our current fetches 
fail).");
+                               }
                                return;
                        } else {
                                if(nodesSendingMainJar.contains(source)) {
@@ -281,18 +282,24 @@


        protected void maybeRequestMainJar() {
-               while(true) {
-                       PeerNode pn;
+                       PeerNode[] offers;
                        synchronized(this) {
                                if(nodesAskedSendMainJar.size() + 
nodesSendingMainJar.size() 
                                                >= MAX_NODES_SENDING_MAIN_JAR)
                                        return;
                                if(nodesOfferedMainJar.isEmpty()) return;
-                               pn = (PeerNode) 
(nodesOfferedMainJar.iterator().next());
+                               offers = (PeerNode[]) 
nodesOfferedMainJar.toArray(new PeerNode[nodesOfferedMainJar.size()]);
                        }
-                       if(!pn.isConnected()) continue;
-                       sendUOMRequestMain(pn);
-               }
+                       for(int i=0;i<offers.length;i++) {
+                               if(offers[i].isConnected()) continue;
+                               synchronized(this) {
+                                       if(nodesAskedSendMainJar.size() + 
nodesSendingMainJar.size() 
+                                                       >= 
MAX_NODES_SENDING_MAIN_JAR)
+                                               return;
+                                       
if(nodesSendingMainJar.contains(offers[i])) continue;
+                               }
+                               sendUOMRequestMain(offers[i], false);
+                       }
        }

        private void alertUser() {


Reply via email to