Author: toad
Date: 2007-12-05 20:36:20 +0000 (Wed, 05 Dec 2007)
New Revision: 16341
Modified:
trunk/freenet/src/freenet/node/Announcer.java
Log:
Don't re-announce to the same IP
Modified: trunk/freenet/src/freenet/node/Announcer.java
===================================================================
--- trunk/freenet/src/freenet/node/Announcer.java 2007-12-05 20:26:38 UTC
(rev 16340)
+++ trunk/freenet/src/freenet/node/Announcer.java 2007-12-05 20:36:20 UTC
(rev 16341)
@@ -10,6 +10,7 @@
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
+import java.net.InetAddress;
import java.util.HashSet;
import java.util.Vector;
@@ -47,7 +48,7 @@
/** Identities of nodes we have announced to */
private final HashSet announcedToIdentities;
/** IPs of nodes we have announced to. Maybe this should be
first-two-bytes, but I'm not sure how to do that with IPv6. */
- private final Vector announcedToIPs;
+ private final HashSet announcedToIPs;
/** How many nodes to connect to at once? */
static final int CONNECT_AT_ONCE = 10;
/** Do not announce if there are more than this many opennet peers
connected */
@@ -63,7 +64,7 @@
this.om = om;
this.node = om.node;
announcedToIdentities = new HashSet();
- announcedToIPs = new Vector();
+ announcedToIPs = new HashSet();
connectedToIdentities = new HashSet();
}
@@ -195,9 +196,12 @@
}
// Now find a node to announce to
Vector seeds =
node.peers.getSeedServerPeersVector(announcedToIdentities);
- for(int i=sentAnnouncements;i<WANT_ANNOUNCEMENTS;i++) {
+ while(sentAnnouncements < WANT_ANNOUNCEMENTS) {
if(seeds.isEmpty()) break;
final SeedServerPeerNode seed =
(SeedServerPeerNode) seeds.remove(node.random.nextInt(seeds.size()));
+ InetAddress[] addrs = seed.getInetAddresses();
+ if(!newAnnouncedIPs(addrs)) continue;
+ addAnnouncedIPs(addrs);
sentAnnouncements++;
runningAnnouncements++;
timeSentAnnouncement = now;
@@ -224,6 +228,19 @@
connectSomeSeednodes();
}
+ private synchronized void addAnnouncedIPs(InetAddress[] addrs) {
+ for(int i=0;i<addrs.length;i++)
+ announcedToIPs.add(addrs[i]);
+ }
+
+ private synchronized boolean newAnnouncedIPs(InetAddress[] addrs) {
+ for(int i=0;i<addrs.length;i++) {
+ if(!announcedToIPs.contains(addrs[i]))
+ return true;
+ }
+ return false;
+ }
+
public void sendAnnouncement(final SeedServerPeerNode seed) {
AnnounceSender sender = new AnnounceSender(node.getLocation(),
om, node, new AnnouncementCallback() {
private int totalAdded;