Author: toad
Date: 2007-09-22 20:05:52 +0000 (Sat, 22 Sep 2007)
New Revision: 15277

Modified:
   trunk/freenet/src/freenet/node/OpennetManager.java
   trunk/freenet/src/freenet/node/PacketSender.java
   trunk/freenet/src/freenet/node/PeerManager.java
Log:
Attempt to connect to old-opennet-peers if we need more connections, under 
certain heuristic connections:
- Opennet is enabled (duh)
- Less than 5 connected peers
- Uptime is at least the minimum for opennet to dump peers
- Every 10 seconds if no peers, or 60 seconds if there are 1-4 peers, send one 
handshake attempt to a randomly selected old-opennet-peer. 50% chance of doing 
an ARK lookup on it too.

Modified: trunk/freenet/src/freenet/node/OpennetManager.java
===================================================================
--- trunk/freenet/src/freenet/node/OpennetManager.java  2007-09-22 18:45:24 UTC 
(rev 15276)
+++ trunk/freenet/src/freenet/node/OpennetManager.java  2007-09-22 20:05:52 UTC 
(rev 15277)
@@ -422,4 +422,14 @@
                return new File(node.nodeDir, 
"openpeers-old-"+crypto.portNumber).toString();
        }

+       synchronized int countOldOpennetPeers() {
+               return oldPeers.size();
+       }
+
+       PeerNode randomOldOpennetNode() {
+               PeerNode[] nodes = getOldPeers();
+               if(nodes.length == 0) return null;
+               return nodes[node.random.nextInt(nodes.length)];
+       }
+
 }

Modified: trunk/freenet/src/freenet/node/PacketSender.java
===================================================================
--- trunk/freenet/src/freenet/node/PacketSender.java    2007-09-22 18:45:24 UTC 
(rev 15276)
+++ trunk/freenet/src/freenet/node/PacketSender.java    2007-09-22 20:05:52 UTC 
(rev 15277)
@@ -28,8 +28,22 @@

        private static boolean logMINOR;

+       /** Maximum time we will queue a message for in millseconds */
        static final int MAX_COALESCING_DELAY = 200;

+       /** If opennet is enabled, and there are fewer than this many 
connections,
+        * we MAY attempt to contact old opennet peers (opennet peers we have 
+        * dropped from the routing table but kept around in case we can't 
connect). */
+       static final int MIN_CONNECTIONS_TRY_OLD_OPENNET_PEERS = 5;
+       
+       /** We send connect attempts to old-opennet-peers no more than once 
every
+        * this many milliseconds. */
+       static final int MIN_OLD_OPENNET_CONNECT_DELAY_NO_CONNS = 10*1000;
+       
+       /** We send connect attempts to old-opennet-peers no more than once 
every
+        * this many milliseconds. */
+       static final int MIN_OLD_OPENNET_CONNECT_DELAY = 60*1000;
+       
     final LinkedList resendPackets;
     /** ~= Ticker :) */
     private final TreeMap timedJobsByTime;
@@ -41,6 +55,7 @@
     long lastReceivedPacketFromAnyNode;
     /** For watchdog. 32-bit to avoid locking. */
     volatile int lastTimeInSeconds;
+    private long timeLastSentOldOpennetConnectAttempt;

     private Vector rpiTemp;
     private int[] rpiIntTemp;
@@ -306,6 +321,26 @@
                        Logger.error(this, "tempNow is more than 5 seconds past 
oldTempNow ("+(tempNow - oldTempNow)+") in PacketSender working with 
"+pn.userToString());
                oldTempNow = tempNow;
        }
+        
+        // Consider sending connect requests to our opennet old-peers.
+        // No point if they are NATed, of course... but we don't know whether 
they are.
+        OpennetManager om = node.getOpennet();
+        if(om != null) {
+               int connCount = node.peers.quickCountConnectedPeers();
+               int minDelay = connCount == 0 ? 
MIN_OLD_OPENNET_CONNECT_DELAY_NO_CONNS : MIN_OLD_OPENNET_CONNECT_DELAY;
+               if(now - timeLastSentOldOpennetConnectAttempt > minDelay &&
+                               connCount <= 
MIN_CONNECTIONS_TRY_OLD_OPENNET_PEERS &&
+                               om.countOldOpennetPeers() > 0 &&
+                               now - node.startupTime > 
OpennetManager.DROP_STARTUP_DELAY) {
+               PeerNode pn = om.randomOldOpennetNode();
+               if(pn != null) {
+                       pn.getOutgoingMangler().sendHandshake(pn);
+                       timeLastSentOldOpennetConnectAttempt = now;
+                       if(pn.noContactDetails() && node.getPeerNodes().length 
> 0 && connCount > 0 && node.random.nextBoolean())
+                               pn.startARKFetcher();
+               }
+               }
+        }

         if(now - lastClearedOldSwapChains > 10000) {
             node.lm.clearOldSwapChains();

Modified: trunk/freenet/src/freenet/node/PeerManager.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerManager.java     2007-09-22 18:45:24 UTC 
(rev 15276)
+++ trunk/freenet/src/freenet/node/PeerManager.java     2007-09-22 20:05:52 UTC 
(rev 15277)
@@ -1356,4 +1356,10 @@

                return null;
        }
+
+       public int quickCountConnectedPeers() {
+               PeerNode[] conns = connectedPeers;
+               if(conns == null) return 0;
+               return connectedPeers.length;
+       }
 }


Reply via email to