Author: nextgens
Date: 2008-11-24 09:53:45 +0000 (Mon, 24 Nov 2008)
New Revision: 23834

Modified:
   trunk/freenet/src/freenet/node/FNPPacketMangler.java
   trunk/freenet/src/freenet/node/PeerNode.java
Log:
Various minor optimization, locking changes, logging, and maybe fix one of the 
jfk-races.

REVIEW IT

Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java        2008-11-23 
15:16:07 UTC (rev 23833)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java        2008-11-24 
09:53:45 UTC (rev 23834)
@@ -7,11 +7,9 @@
 import java.math.BigInteger;
 import java.security.MessageDigest;
 import java.util.Arrays;
-import java.util.Calendar;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedList;
-import java.util.TimeZone;
 
 import net.i2p.util.NativeBigInteger;
 import freenet.crypt.BlockCipher;

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2008-11-23 15:16:07 UTC 
(rev 23833)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2008-11-24 09:53:45 UTC 
(rev 23834)
@@ -188,6 +188,7 @@
        * public key (FIXME). Cannot be changed.
        */
        final byte[] identity;
+       final String identityAsBase64String;
        /** Hash of node identity. Used in setup key. */
        final byte[] identityHash;
        /** Hash of hash of node identity. Used in setup key. */
@@ -501,6 +502,7 @@
 
                if(identity == null)
                        throw new FSParseException("No identity");
+               identityAsBase64String = Base64.encode(identity);
                identityHash = SHA256.digest(identity);
                identityHashHash = SHA256.digest(identityHash);
                swapIdentifier = Fields.bytesToLong(identityHashHash);
@@ -562,7 +564,7 @@
                        throw new FSParseException(e1);
                }
                if(nominalPeer.isEmpty()) {
-                       Logger.normal(this, "No IP addresses found for identity 
'" + Base64.encode(identity) + "', possibly at location '" + 
Double.toString(currentLocation) + ": " + userToString());
+                       Logger.normal(this, "No IP addresses found for identity 
'" + identityAsBase64String + "', possibly at location '" + 
Double.toString(currentLocation) + ": " + userToString());
                        detectedPeer = null;
                } else {
                        detectedPeer = nominalPeer.firstElement();
@@ -870,9 +872,9 @@
                FreenetInetAddress localhost = node.fLocalhostAddress;
                Peer[] nodePeers = outgoingMangler.getPrimaryIPAddress();
 
-               Vector<Peer> peers = null;
+               Vector<Peer> localPeers = null;
                synchronized(this) {
-                       peers = new Vector<Peer>(nominalPeer);
+                       localPeers = new Vector<Peer>(nominalPeer);
                }
 
                boolean addedLocalhost = false;
@@ -898,16 +900,16 @@
                                FreenetInetAddress myAddr = 
nodePeers[j].getFreenetAddress();
                                if(myAddr.equals(addr)) {
                                        if(!addedLocalhost)
-                                               peers.add(new Peer(localhost, 
p.getPort()));
+                                               localPeers.add(new 
Peer(localhost, p.getPort()));
                                        addedLocalhost = true;
                                }
                        }
-                       if(peers.contains(p))
+                       if(localPeers.contains(p))
                                continue;
-                       peers.add(p);
+                       localPeers.add(p);
                }
 
-               localHandshakeIPs = peers.toArray(new Peer[peers.size()]);
+               localHandshakeIPs = localPeers.toArray(new 
Peer[localPeers.size()]);
                localHandshakeIPs = updateHandshakeIPs(localHandshakeIPs, 
ignoreHostnames);
                synchronized(this) {
                        handshakeIPs = localHandshakeIPs;
@@ -1315,7 +1317,7 @@
                long now = System.currentTimeMillis();
                boolean tempShouldSendHandshake = false;
                synchronized(this) {
-                       tempShouldSendHandshake = ((isRekeying || 
!isConnected()) && (handshakeIPs != null) && (now > sendHandshakeTime));
+                       tempShouldSendHandshake = ((now > sendHandshakeTime) && 
(handshakeIPs != null) && (isRekeying || !isConnected()));
                }
                if(tempShouldSendHandshake && (hasLiveHandshake(now)))
                        tempShouldSendHandshake = false;
@@ -1662,16 +1664,19 @@
                // Only clear lastAttemptedHandshakeIPUpdateTime if we have a 
new IP.
                // Also, we need to call .equals() to propagate any DNS lookups 
that have been done if the two have the same domain.
                synchronized(this) {
-                       if((newPeer != null) && ((detectedPeer == null) || 
!detectedPeer.equals(newPeer))) {
+                       Peer oldPeer = detectedPeer;
+                       if((newPeer != null) && ((oldPeer == null) || 
!oldPeer.equals(newPeer))) {
                                this.detectedPeer = newPeer;
                                updateShortToString();
                                this.lastAttemptedHandshakeIPUpdateTime = 0;
                                if(!isConnected)
                                        return;
                                // Prevent leak by clearing, *but keep the 
current handshake*
-                               byte[] o = jfkNoncesSent.get(newPeer);
+                               byte[] newPeerHandshake = 
jfkNoncesSent.get(newPeer);
+                               byte[] oldPeerHandshake = 
jfkNoncesSent.get(oldPeer);
                                jfkNoncesSent.clear();
-                               jfkNoncesSent.put(newPeer, o);
+                               jfkNoncesSent.put(newPeer, newPeerHandshake);
+                               jfkNoncesSent.put(newPeer, oldPeerHandshake);
                        } else
                                return;
                }
@@ -1840,9 +1845,10 @@
                        Logger.normal(this, "Not routing traffic to " + this + 
" - invalid version " + getVersion());
                        older = true;
                        routable = false;
-               } else if(Math.abs(clockDelta) > MAX_CLOCK_DELTA)
+               } else if(Math.abs(clockDelta) > MAX_CLOCK_DELTA) {
+                       Logger.normal(this, "Not routing traffic to " + this + 
" - clock problems");
                        routable = false;
-               else
+               } else
                        older = false;
                KeyTracker newTracker = new KeyTracker(this, encCipher, encKey);
                if(logMINOR) Logger.minor(this, "New key tracker in 
completedHandshake: "+newTracker+" for "+shortToString());
@@ -2509,7 +2515,7 @@
        }
 
        public String getFreevizOutput() {
-               return getStatus(true).toString() + '|' + 
Base64.encode(identity);
+               return getStatus(true).toString() + '|' + 
identityAsBase64String;
        }
 
        public synchronized String getVersion() {
@@ -2944,7 +2950,7 @@
 
                messageSpecName = m.getSpec().getName();
                // Synchronize to make increments atomic.
-               synchronized(this) {
+               synchronized(localNodeSentMessageTypes) {
                        count = localNodeSentMessageTypes.get(messageSpecName);
                        if(count == null)
                                count = 1L;
@@ -2970,8 +2976,11 @@
                }
        }
 
-       public synchronized Hashtable<String,Long> 
getLocalNodeSentMessagesToStatistic() {
-               return new Hashtable<String,Long>(localNodeSentMessageTypes);
+       public Hashtable<String,Long> getLocalNodeSentMessagesToStatistic() {
+               // Must be synchronized *during the copy*
+               synchronized (localNodeSentMessageTypes) {
+                       return new 
Hashtable<String,Long>(localNodeSentMessageTypes);
+               }
        }
 
        public Hashtable<String,Long> 
getLocalNodeReceivedMessagesFromStatistic() {
@@ -3130,10 +3139,10 @@
        }
 
        public int setPeerNodeStatus(long now, boolean noLog) {
-               long routingBackedOffUntil = getRoutingBackedOffUntil();
+               long localRoutingBackedOffUntil = getRoutingBackedOffUntil();
                synchronized(this) {
                        int oldPeerNodeStatus = peerNodeStatus;
-                       peerNodeStatus = getPeerNodeStatus(now, 
routingBackedOffUntil);
+                       peerNodeStatus = getPeerNodeStatus(now, 
localRoutingBackedOffUntil);
 
                        if(peerNodeStatus != oldPeerNodeStatus && 
recordStatus()) {
                                peers.removePeerNodeStatus(oldPeerNodeStatus, 
this, noLog);
@@ -3173,7 +3182,7 @@
        }
 
        public String getIdentityString() {
-               return Base64.encode(identity);
+               return identityAsBase64String;
        }
 
        public boolean isFetchingARK() {
@@ -3770,17 +3779,17 @@
         * (FIXME!)
         */
        public Peer getHandshakeIP() {
-               Peer[] handshakeIPs;
+               Peer[] localHandshakeIPs;
                if(!shouldSendHandshake()) {
                        if(logMINOR) Logger.minor(this, "Not sending handshake 
to "+getPeer()+" because pn.shouldSendHandshake() returned false");
                        return null;
                }
                long firstTime = System.currentTimeMillis();
-               handshakeIPs = getHandshakeIPs();
+               localHandshakeIPs = getHandshakeIPs();
                long secondTime = System.currentTimeMillis();
                if((secondTime - firstTime) > 1000)
                        Logger.error(this, "getHandshakeIPs() took more than a 
second to execute ("+(secondTime - firstTime)+") working on "+userToString());
-               if(handshakeIPs.length == 0) {
+               if(localHandshakeIPs.length == 0) {
                        long thirdTime = System.currentTimeMillis();
                        if((thirdTime - secondTime) > 1000)
                                Logger.error(this, "couldNotSendHandshake() 
(after getHandshakeIPs()) took more than a second to execute ("+(thirdTime - 
secondTime)+") working on "+userToString());
@@ -3788,19 +3797,19 @@
                }
                long loopTime1 = System.currentTimeMillis();
                Vector<Peer> validIPs = new Vector<Peer>();
-               for(int i=0;i<handshakeIPs.length;i++){
-                       Peer peer = handshakeIPs[i];
+               for(int i=0;i<localHandshakeIPs.length;i++){
+                       Peer peer = localHandshakeIPs[i];
                        FreenetInetAddress addr = peer.getFreenetAddress();
                        if(!outgoingMangler.allowConnection(this, addr)) {
                                if(logMINOR)
                                        Logger.minor(this, "Not sending 
handshake packet to "+peer+" for "+this);
                        }
                        if(peer.getAddress(false) == null) {
-                               if(logMINOR) Logger.minor(this, "Not sending 
handshake to "+handshakeIPs[i]+" for "+getPeer()+" because the DNS lookup 
failed or it's a currently unsupported IPv6 address");
+                               if(logMINOR) Logger.minor(this, "Not sending 
handshake to "+localHandshakeIPs[i]+" for "+getPeer()+" because the DNS lookup 
failed or it's a currently unsupported IPv6 address");
                                continue;
                        }
                        if(!peer.isRealInternetAddress(false, false, 
allowLocalAddresses())) {
-                               if(logMINOR) Logger.minor(this, "Not sending 
handshake to "+handshakeIPs[i]+" for "+getPeer()+" because it's not a real 
Internet address and metadata.allowLocalAddresses is not true");
+                               if(logMINOR) Logger.minor(this, "Not sending 
handshake to "+localHandshakeIPs[i]+" for "+getPeer()+" because it's not a real 
Internet address and metadata.allowLocalAddresses is not true");
                                continue;
                        }
                        validIPs.add(peer);
@@ -3811,12 +3820,8 @@
                } else if(validIPs.size() == 1) {
                        ret = validIPs.get(0);
                } else {
-                       synchronized(this) {
-                               if(handshakeIPAlternator >= validIPs.size())
-                                       handshakeIPAlternator = 0;
-                               ret = validIPs.get(handshakeIPAlternator);
-                               handshakeIPAlternator++;
-                       }
+                       ret = validIPs.get(handshakeIPAlternator);
+                       handshakeIPAlternator = ++handshakeIPAlternator % 
validIPs.size();
                }
                long loopTime2 = System.currentTimeMillis();
                if((loopTime2 - loopTime1) > 1000)
@@ -3999,13 +4004,13 @@
         * @return The rate at which this peer has been selected since it 
connected.
         */
        public synchronized double selectionRate() {
-               long uptime = System.currentTimeMillis() - this.connectedTime;
+               long timeSinceConnected = System.currentTimeMillis() - 
this.connectedTime;
                // Avoid bias due to short uptime.
-               if(uptime < 10*1000) return 0.0;
-               return countSelectionsSinceConnected / (double) uptime;
+               if(timeSinceConnected < 10*1000) return 0.0;
+               return countSelectionsSinceConnected / (double) 
timeSinceConnected;
        }
 
-       private long offeredMainJarVersion;
+       private volatile long offeredMainJarVersion;
        
        public void setMainJarOfferedVersion(long mainJarVersion) {
                offeredMainJarVersion = mainJarVersion;
@@ -4046,15 +4051,14 @@
                        else if(j == 1)
                                kt = getPreviousKeyTracker();
                        else
-                               break; // impossible
+                               throw new NullPointerException("WTF?");
                        if(kt == null)
                                continue;
                        int[] tmp = kt.grabResendPackets(rpiTemp, rpiIntTemp);
                        if(tmp == null)
                                continue;
                        rpiIntTemp = tmp;
-                       for(int k = 0; k < rpiTemp.size(); k++) {
-                               ResendPacketItem item = rpiTemp.get(k);
+                       for(ResendPacketItem item : rpiTemp) {
                                if(item == null)
                                        continue;
                                try {

_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs

Reply via email to