Author: toad
Date: 2008-04-08 14:38:48 +0000 (Tue, 08 Apr 2008)
New Revision: 19075

Modified:
   trunk/freenet/src/freenet/node/Announcer.java
   trunk/freenet/src/freenet/node/PacketSender.java
   trunk/freenet/src/freenet/node/PeerNode.java
   trunk/freenet/src/freenet/node/SeedServerPeerNode.java
Log:
Disconnect from seednode connections once we have had enough opennet peers for 
at least 5 minutes.
Hopefully this will reduce the load on the seednodes; my seednode had 140 seed 
client connections on Saturday!

Modified: trunk/freenet/src/freenet/node/Announcer.java
===================================================================
--- trunk/freenet/src/freenet/node/Announcer.java       2008-04-08 14:27:58 UTC 
(rev 19074)
+++ trunk/freenet/src/freenet/node/Announcer.java       2008-04-08 14:38:48 UTC 
(rev 19075)
@@ -240,6 +240,8 @@
                // Do nothing at present
        }

+       private long timeGotEnoughPeers = -1;
+       
        /** @return True if we have enough peers that we don't need to 
announce. */
        boolean enoughPeers() {
                // Do we want to send an announcement to the node?
@@ -249,10 +251,25 @@
                if(opennetCount >= target) {
                        if(logMINOR)
                                Logger.minor(this, "We have enough opennet 
peers: "+opennetCount+" > "+target);
+                       synchronized(this) {
+                               if(timeGotEnoughPeers <= 0)
+                                       timeGotEnoughPeers = 
System.currentTimeMillis();
+                       }
                        return true;
                }
+               synchronized(this) {
+                       timeGotEnoughPeers = -1;
+               }
                return false;
        }
+       
+       /**
+        * Get the earliest time at which we had enough opennet peers. This is 
reset when we drop
+        * below the threshold.
+        */
+       synchronized long timeGotEnoughPeers() {
+               return timeGotEnoughPeers;
+       }

        private boolean ignoreIPUndetected;
        static final int FORCE_ANNOUNCEMENT_NO_IP = 120*1000;

Modified: trunk/freenet/src/freenet/node/PacketSender.java
===================================================================
--- trunk/freenet/src/freenet/node/PacketSender.java    2008-04-08 14:27:58 UTC 
(rev 19074)
+++ trunk/freenet/src/freenet/node/PacketSender.java    2008-04-08 14:38:48 UTC 
(rev 19075)
@@ -227,6 +227,10 @@
                                        Logger.normal(this, 
"shouldDisconnectNow has returned true : marking the peer as incompatible");
                                        continue;
                                }
+                               
+                               if(pn.shouldDisconnectAndRemoveNow() && 
!pn.isDisconnecting()) {
+                                       node.peers.disconnect(pn, true, false);
+                               }

                                boolean mustSend = false;


Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2008-04-08 14:27:58 UTC 
(rev 19074)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2008-04-08 14:38:48 UTC 
(rev 19075)
@@ -3883,4 +3883,11 @@
                Logger.error(this, "Peer constantly changes its IP address!!: 
"+shortToString());
                forceDisconnect(true);
        }
+
+       /**
+        * Should this peer be disconnected and removed immediately?
+        */
+       public boolean shouldDisconnectAndRemoveNow() {
+               return false;
+       }
 }

Modified: trunk/freenet/src/freenet/node/SeedServerPeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/SeedServerPeerNode.java      2008-04-08 
14:27:58 UTC (rev 19074)
+++ trunk/freenet/src/freenet/node/SeedServerPeerNode.java      2008-04-08 
14:38:48 UTC (rev 19075)
@@ -98,4 +98,13 @@
        protected boolean generateIdentityFromPubkey() {
                return false;
        }
+       
+       public boolean shouldDisconnectAndRemoveNow() {
+               OpennetManager om = node.getOpennet();
+               if(om == null) return true;
+               if(om.announcer.enoughPeers()) return false;
+               // We have enough peers, but we might fluctuate a bit.
+               // Drop the connection once we have consistently had enough 
opennet peers for 5 minutes.
+               return System.currentTimeMillis() - 
om.announcer.timeGotEnoughPeers() > 5*60*1000;
+       }
 }


Reply via email to