Author: toad
Date: 2006-07-29 20:20:37 +0000 (Sat, 29 Jul 2006)
New Revision: 9816

Modified:
   trunk/freenet/src/freenet/io/comm/Message.java
   trunk/freenet/src/freenet/node/CHKInsertSender.java
   trunk/freenet/src/freenet/node/FNPPacketMangler.java
   trunk/freenet/src/freenet/node/InsertHandler.java
   trunk/freenet/src/freenet/node/MessageItem.java
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/NodePinger.java
   trunk/freenet/src/freenet/node/PacketSender.java
   trunk/freenet/src/freenet/node/PeerNode.java
   trunk/freenet/src/freenet/node/RequestHandler.java
   trunk/freenet/src/freenet/node/SSKInsertSender.java
   trunk/freenet/src/freenet/node/Version.java
   trunk/freenet/src/freenet/transport/IPAddressDetector.java
Log:
915:
Reduce maximum sleep time on PacketSender to 100ms, same as max coalescing 
delay. Only wake up PacketSender in sendAsync() if we need to.
SSKInsertSender fix - don't move on to the next node after getting a collision.
Message.encodeToPacket doesn't need a LowLevelFilter argument.
Up search timeout on inserts to 2 minutes.
Keep going on inserts when get a timeout before Accepted.
True multi-homing support.
Clear the last detected IP address when the use-local flag is enabled.
Logging.
Comments.

Modified: trunk/freenet/src/freenet/io/comm/Message.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/Message.java      2006-07-29 19:38:47 UTC 
(rev 9815)
+++ trunk/freenet/src/freenet/io/comm/Message.java      2006-07-29 20:20:37 UTC 
(rev 9816)
@@ -155,7 +155,7 @@
                _payload.put(key, value);
        }

-       public byte[] encodeToPacket(LowLevelFilter f, PeerContext destination) 
{
+       public byte[] encodeToPacket(PeerContext destination) {
 //             if (this.getSpec() != MessageTypes.ping && this.getSpec() != 
MessageTypes.pong)
 //             Logger.logMinor("<<<<< Send message : " + this);


Modified: trunk/freenet/src/freenet/node/CHKInsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/CHKInsertSender.java 2006-07-29 19:38:47 UTC 
(rev 9815)
+++ trunk/freenet/src/freenet/node/CHKInsertSender.java 2006-07-29 20:20:37 UTC 
(rev 9816)
@@ -138,7 +138,7 @@

     // Constants
     static final int ACCEPTED_TIMEOUT = 10000;
-    static final int SEARCH_TIMEOUT = 60000;
+    static final int SEARCH_TIMEOUT = 120000;
     static final int TRANSFER_COMPLETION_TIMEOUT = 120000;

     // Basics
@@ -310,8 +310,9 @@
                                        // Try to propagate back to source
                                        Logger.minor(this, "Timeout");
                                        next.localRejectedOverload("Timeout3");
-                                       finish(TIMED_OUT, next);
-                                       return;
+                                       // Try another node.
+                                       forwardRejectedOverload();
+                                       break;
                                }

                                if (msg.getSpec() == DMT.FNPRejectedOverload) {

Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java        2006-07-29 
19:38:47 UTC (rev 9815)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java        2006-07-29 
20:20:37 UTC (rev 9816)
@@ -821,7 +821,7 @@
                        mi_name = (mi.msg == null ? "(not a Message)" : 
mi.msg.getSpec().getName());
             if(mi.formatted) {
                 try {
-                    byte[] buf = mi.getData(this, pn);
+                    byte[] buf = mi.getData(pn);
                     KeyTracker kt = pn.getCurrentKeyTracker();
                     if(kt == null) {
                         Logger.minor(this, "kt = null");
@@ -866,7 +866,7 @@
                     return;
                 }
             } else {
-                byte[] data = mi.getData(this, pn);
+                byte[] data = mi.getData(pn);
                 messageData[x] = data;
                 newMsgs[x] = mi;
                 alreadyReported[x] = mi.alreadyReportedBytes;
@@ -1104,7 +1104,7 @@
     }

     public byte[] preformat(Message msg, PeerNode pn) {
-        byte[] buf = msg.encodeToPacket(this, pn);
+        byte[] buf = msg.encodeToPacket(pn);
         return preformat(buf, 0, buf.length);
     }


Modified: trunk/freenet/src/freenet/node/InsertHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/InsertHandler.java   2006-07-29 19:38:47 UTC 
(rev 9815)
+++ trunk/freenet/src/freenet/node/InsertHandler.java   2006-07-29 20:20:37 UTC 
(rev 9816)
@@ -335,6 +335,9 @@
         }
     }

+    /**
+     * Verify data, or send DataInsertRejected.
+     */
     private void maybeCommit() {
         Message toSend = null;


Modified: trunk/freenet/src/freenet/node/MessageItem.java
===================================================================
--- trunk/freenet/src/freenet/node/MessageItem.java     2006-07-29 19:38:47 UTC 
(rev 9815)
+++ trunk/freenet/src/freenet/node/MessageItem.java     2006-07-29 20:20:37 UTC 
(rev 9816)
@@ -39,9 +39,9 @@
     /**
      * Return the data contents of this MessageItem.
      */
-    public byte[] getData(FNPPacketMangler mangler, PeerNode pn) {
+    public byte[] getData(PeerNode pn) {
         if(buf == null)
-            buf = msg.encodeToPacket(mangler, pn);
+            buf = msg.encodeToPacket(pn);
         return buf;
     }
 }

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2006-07-29 19:38:47 UTC (rev 
9815)
+++ trunk/freenet/src/freenet/node/Node.java    2006-07-29 20:20:37 UTC (rev 
9816)
@@ -51,7 +51,6 @@
 import freenet.clients.http.SimpleToadletServer;
 import freenet.config.BooleanCallback;
 import freenet.config.Config;
-import freenet.config.FilePersistentConfig;
 import freenet.config.IntCallback;
 import freenet.config.InvalidConfigValueException;
 import freenet.config.LongCallback;
@@ -60,10 +59,8 @@
 import freenet.crypt.DSAGroup;
 import freenet.crypt.DSAPrivateKey;
 import freenet.crypt.DSAPublicKey;
-import freenet.crypt.DiffieHellman;
 import freenet.crypt.Global;
 import freenet.crypt.RandomSource;
-import freenet.crypt.Yarrow;
 import freenet.io.comm.DMT;
 import freenet.io.comm.DisconnectedException;
 import freenet.io.comm.FreenetInetAddress;
@@ -406,6 +403,10 @@
                        roundTripTime.report(Math.max(rtt, 10));
                        Logger.minor(this, "Reported successful completion: 
"+rtt+" on "+this+" avg "+roundTripTime.currentValue());
                }
+               
+               public String toString() {
+                       return "rtt: "+roundTripTime.currentValue()+" 
_s="+throttleWindow.currentValue();
+               }
        }

        /** Config object for the whole node. */
@@ -1112,6 +1113,8 @@

                        public void set(boolean val) throws 
InvalidConfigValueException {
                                includeLocalAddressesInNoderefs = val;
+                               lastIPAddress = null;
+                               ipDetector.clearCached();
                        }

                });
@@ -2423,11 +2426,12 @@
                        // If the IP is overridden, the override has to be the 
first element.
                        addresses.add(new Peer(overrideIPAddress, portNumber));
                }
-               InetAddress detectedAddr = ipDetector.getAddress();
-               if(detectedAddr != null) {
-                       Peer a = new Peer(new FreenetInetAddress(detectedAddr), 
portNumber);
-                       if(!addresses.contains(a))
-                               addresses.add(a);
+               InetAddress[] detectedAddrs = ipDetector.getAddress();
+               if(detectedAddrs != null) {
+                       for(int i=0;i<detectedAddrs.length;i++) {
+                               Peer p = new Peer(detectedAddrs[i], portNumber);
+                               if(!addresses.contains(p)) addresses.add(p);
+                       }
                }
                if((pluginDetectedIPs != null) && (pluginDetectedIPs.length > 
0)) {
                        for(int i=0;i<pluginDetectedIPs.length;i++) {
@@ -2438,7 +2442,7 @@
                                        addresses.add(a);
                        }
                }
-               if((detectedAddr == null) && (oldIPAddress != null) && 
!oldIPAddress.equals(overrideIPAddress))
+               if((detectedAddrs == null) && (oldIPAddress != null) && 
!oldIPAddress.equals(overrideIPAddress))
                        addresses.add(new Peer(oldIPAddress, portNumber));
                // Try to pick it up from our connections
                if(peers != null) {
@@ -2481,7 +2485,7 @@
                                        }
                                }
                                if(best != null) {
-                                       if((bestPopularity > 2) || 
(detectedAddr == null)) {
+                                       if((bestPopularity > 2) || 
(detectedAddrs == null)) {
                                                if(!addresses.contains(best))
                                                        addresses.add(best);
                                                if((secondBest != null) && 
(secondBestPopularity > 2)) {

Modified: trunk/freenet/src/freenet/node/NodePinger.java
===================================================================
--- trunk/freenet/src/freenet/node/NodePinger.java      2006-07-29 19:38:47 UTC 
(rev 9815)
+++ trunk/freenet/src/freenet/node/NodePinger.java      2006-07-29 20:20:37 UTC 
(rev 9816)
@@ -15,14 +15,13 @@
        private TimeDecayingRunningAverage tdra;

        NodePinger(Node n) {
-               Logger.normal(this, "Starting NodePinger");
-               System.out.println("Starting NodePinger");
                this.node = n;
                this.tdra = new TimeDecayingRunningAverage(0.0, 30*1000, // 30 
seconds
                                0.0, Double.MAX_VALUE);
        }

        void start() {
+               Logger.normal(this, "Starting NodePinger");
                Thread t = new Thread(this, "Node pinger");
                t.setDaemon(true);
                t.start();

Modified: trunk/freenet/src/freenet/node/PacketSender.java
===================================================================
--- trunk/freenet/src/freenet/node/PacketSender.java    2006-07-29 19:38:47 UTC 
(rev 9815)
+++ trunk/freenet/src/freenet/node/PacketSender.java    2006-07-29 20:20:37 UTC 
(rev 9816)
@@ -227,7 +227,7 @@
                        int sz = 56; // overhead; FIXME should be a constant or 
something
                        for(int j=0;j<messages.length;j++) {
                                if(l > messages[j].submitted) l = 
messages[j].submitted;
-                               sz += 2 + /* FIXME only 2? */ 
messages[j].getData(node.packetMangler, pn).length;
+                               sz += 2 + /* FIXME only 2? */ 
messages[j].getData(pn).length;
                        }
                        if((l + 100 > now) && (sz < 1024 /* sensible size */)) {
                                // Don't send immediately
@@ -324,8 +324,8 @@
                }

         long sleepTime = nextActionTime - now;
-        // 200ms maximum sleep time
-        sleepTime = Math.min(sleepTime, 200);
+        // 100ms maximum sleep time - same as the maximum coalescing delay
+        sleepTime = Math.min(sleepTime, 100);

         if(now - node.startupTime > 60*1000*5) {
             if(now - lastReceivedPacketFromAnyNode > Node.ALARM_TIME) {

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2006-07-29 19:38:47 UTC 
(rev 9815)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2006-07-29 20:20:37 UTC 
(rev 9816)
@@ -12,6 +12,7 @@
 import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;
 import java.util.Hashtable;
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.Vector;
 import java.util.zip.DataFormatException;
@@ -772,14 +773,28 @@
         Logger.minor(this, "Sending async: "+msg+" : "+cb+" on "+this);
         if(!isConnected()) throw new NotConnectedException();
         MessageItem item = new MessageItem(msg, cb == null ? null : new 
AsyncMessageCallback[] {cb}, alreadyReportedBytes, ctr);
+        item.getData(this);
         long now = System.currentTimeMillis();
                reportBackoffStatus(now);
+               int x = 0;
         synchronized(messagesToSendNow) {
             messagesToSendNow.addLast(item);
+            Iterator i = messagesToSendNow.iterator();
+            for(;i.hasNext();) {
+               MessageItem it = (MessageItem) (i.next());
+               x += it.getData(this).length + 2;
+               if(x > 1024) break;
+            }
         }
-        synchronized(node.ps) {
-            node.ps.notifyAll();
+        if(x > 1024) {
+               // If there is a packet's worth to send, wake up the 
packetsender.
+               synchronized(node.ps) {
+                       node.ps.notifyAll();
+               }
         }
+        // We DO NOT NEED to wake up the PacketSender
+        // It will wake up before the maximum coalescing delay (100ms) because
+        // it wakes up every 100ms *anyway*.
     }

     /**

Modified: trunk/freenet/src/freenet/node/RequestHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestHandler.java  2006-07-29 19:38:47 UTC 
(rev 9815)
+++ trunk/freenet/src/freenet/node/RequestHandler.java  2006-07-29 20:20:37 UTC 
(rev 9816)
@@ -42,7 +42,6 @@
         source = (PeerNode) req.getSource();
         closestLoc = req.getDouble(DMT.NEAREST_LOCATION);
         double myLoc = n.lm.getLocation().getValue();
-        // FIXME should be more generic when implement SSKs
         key = (Key) req.getObject(DMT.FREENET_ROUTING_KEY);
         double keyLoc = key.toNormalizedDouble();
         if(PeerManager.distance(keyLoc, myLoc) < PeerManager.distance(keyLoc, 
closestLoc)) {

Modified: trunk/freenet/src/freenet/node/SSKInsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/SSKInsertSender.java 2006-07-29 19:38:47 UTC 
(rev 9815)
+++ trunk/freenet/src/freenet/node/SSKInsertSender.java 2006-07-29 20:20:37 UTC 
(rev 9816)
@@ -199,8 +199,8 @@
                                        // Try to propagate back to source
                                        Logger.minor(this, "Timeout");
                                        next.localRejectedOverload("Timeout");
-                                       finish(TIMED_OUT, next);
-                                       return;
+                                       forwardRejectedOverload();
+                                       break;
                                }

                                if (msg.getSpec() == DMT.FNPRejectedOverload) {
@@ -262,12 +262,12 @@
                                }

                if(newAck == null) {
-                                       // Terminal overload
                                        // Try to propagate back to source
                                        Logger.minor(this, "Timeout");
                                        next.localRejectedOverload("Timeout2");
-                                       finish(TIMED_OUT, next);
-                                       return;
+                                       forwardRejectedOverload();
+                                       // Try another peer
+                                       break;
                }
             }

@@ -406,7 +406,7 @@
                                                hasCollided = true;
                                                notifyAll();
                                        }
-                                       break; // go to next node
+                                       continue;
                                }

                                if (msg.getSpec() != DMT.FNPInsertReply) {

Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-07-29 19:38:47 UTC (rev 
9815)
+++ trunk/freenet/src/freenet/node/Version.java 2006-07-29 20:20:37 UTC (rev 
9816)
@@ -18,7 +18,7 @@
        public static final String protocolVersion = "1.0";

        /** The build number of the current revision */
-       private static final int buildNumber = 914;
+       private static final int buildNumber = 915;

        /** Oldest build of Fred we will talk to */
        private static final int oldLastGoodBuild = 870;

Modified: trunk/freenet/src/freenet/transport/IPAddressDetector.java
===================================================================
--- trunk/freenet/src/freenet/transport/IPAddressDetector.java  2006-07-29 
19:38:47 UTC (rev 9815)
+++ trunk/freenet/src/freenet/transport/IPAddressDetector.java  2006-07-29 
20:20:37 UTC (rev 9816)
@@ -47,51 +47,28 @@
         * Fetches the currently detected IP address. If not detected yet a 
detection is forced
         * @return Detected ip address
         */
-       public InetAddress getAddress() {
-               return getAddress(0, null);
+       public InetAddress[] getAddress() {
+               return getAddress(0);
        }

        /**
         * Get the IP address
-        * @param preferedAddress An address that for some reason is prefered 
above others. Might be null
         * @return Detected ip address
         */
-       public InetAddress getAddress(long recheckTime, String preferedAddress) 
{
-               if ((lastInetAddress == null)
-                       || (System.currentTimeMillis() > (lastDetectedTime + 
recheckTime)))
-                       checkpoint(preferedAddress);
-               return lastInetAddress;
+       public InetAddress[] getAddress(long recheckTime) {
+               if(System.currentTimeMillis() > (lastDetectedTime + recheckTime)
+                               || lastAddressList == null)
+                       checkpoint();
+               return lastAddressList;
        }

-       /**
-        * Get the IP address
-        * @return Detected ip address
-        */
-       public InetAddress getAddress(long recheckTime) {
-               return getAddress(recheckTime, null);
-       }
-
-       public void checkpoint() {
-               checkpoint((InetAddress)null);
-       }
-
        boolean old = false;

-       protected synchronized void checkpoint(String preferredAddress) {
-           InetAddress preferredInetAddress = null;
-               try {
-                       preferredInetAddress = 
InetAddress.getByName(preferredAddress);
-                       //It there was something preferred then convert it to a 
proper class
-               } catch (UnknownHostException e) {
-               }
-               checkpoint(preferredInetAddress);
-       }
-       
        /**
         * Execute a checkpoint - detect our internet IP address and log it
         * @param preferedAddress An address that for some reason is prefered 
above others. Might be null
         */
-       protected synchronized void checkpoint(InetAddress preferedInetAddress) 
{
+       protected synchronized void checkpoint() {
                boolean logDEBUG = Logger.shouldLog(Logger.DEBUG, this);
                Vector addrs = new Vector();

@@ -142,14 +119,8 @@
                                        "Finished scanning interfaces");
                }

-               if ((preferedInetAddress == null)
-                       && (lastInetAddress != null)
-                               ? isInternetAddress(lastInetAddress)
-                               : true) //If no specific other address is 
preferred then we prefer to keep our old address
-                       preferedInetAddress = lastInetAddress;
-
                InetAddress oldAddress = lastInetAddress;
-               onGetAddresses(addrs, preferedInetAddress);
+               onGetAddresses(addrs);
                lastDetectedTime = System.currentTimeMillis();
                if ((oldAddress != null) && (lastInetAddress != null) && 
                        !lastInetAddress.equals(oldAddress)) {
@@ -199,16 +170,16 @@
         * @param v Vector of InetAddresses
         * @param preferedInetAddress An address that for some reason is 
prefered above others. Might be null
         */
-       protected void onGetAddresses(Vector v, InetAddress 
preferedInetAddress) {
+       protected void onGetAddresses(Vector v) {
+               Vector output = new Vector();
                boolean logDEBUG = Logger.shouldLog(Logger.DEBUG, this);
                if (logDEBUG)
                        Logger.debug(
                                this,
                                "onGetAddresses found " + v.size() + " 
potential addresses)");
-               InetAddress addrDetected = null;
                if (v.size() == 0) {
                        Logger.error(this, "No addresses found!");
-                       addrDetected = null;
+                       lastAddressList = null;
                } else {
 //                     InetAddress lastNonValidAddress = null;
                        for (int x = 0; x < v.size(); x++) {
@@ -218,39 +189,22 @@
                                                Logger.debug(
                                                        this,
                                                        "Address " + x + ": " + 
i);
-                                       if (isInternetAddress(i)) {
-                                               //Do not even consider this 
address if it isn't globally addressable
-                                               if (logDEBUG)
-                                                       Logger.debug(
-                                                               this,
-                                                               "Setting 
default address to "
-                                                                       + 
i.getHostAddress());
-
-                                               addrDetected = i;
-                                               //Use the last detected valid 
IP as 'detected' IP
-                                               if ((preferedInetAddress != 
null)
-                                                       && addrDetected.equals(
-                                                               
preferedInetAddress)) { //Prefer the specified address if it is still available 
to us. Do not look for more ones
-                                                       if (logDEBUG)
-                                                               Logger.debug(
-                                                                       this,
-                                                                       
"Detected address is the preferred address, setting final address to "
-                                                                               
+ lastInetAddress.getHostAddress());
-                                                       lastInetAddress = 
addrDetected;
-                                                       return;
+                                       if(i.isAnyLocalAddress()) {
+                                               // Wildcard address, 0.0.0.0, 
ignore.
+                                       } else if(i.isLinkLocalAddress() || 
i.isLoopbackAddress() ||
+                                                       i.isSiteLocalAddress()) 
{
+                                               
if(node.includeLocalAddressesInNoderefs) {
+                                                       output.add(i);
                                                }
-
-                                       }// else
-//                                             lastNonValidAddress = i;
+                                       } else if(i.isMulticastAddress()) {
+                                               // Ignore
+                                       } else {
+                                               output.add(i);
+                                       }
                                }
                        }
-                       //If we are here we didn't manage to find a valid 
globally addressable IP. Do the best of the situation, return the last valid 
non-addressable IP
-                       //This address will be used by the node if the user has 
configured localIsOK.
-//                     if (lastInetAddress == null || (!detectedInetAddress))
-//                             lastInetAddress = lastNonValidAddress;
                }
-               lastInetAddress = addrDetected;
-               // FIXME: add support for multihoming
+               lastAddressList = (InetAddress[]) output.toArray(new 
InetAddress[output.size()]);
        }

        protected boolean isInternetAddress(InetAddress addr) {
@@ -271,4 +225,9 @@
                        }
                }
        }
+
+       public void clearCached() {
+               lastAddressList = null;
+               lastDetectedTime = -1;
+       }
 }


Reply via email to