Author: toad
Date: 2007-11-27 14:18:20 +0000 (Tue, 27 Nov 2007)
New Revision: 15964
Modified:
trunk/freenet/src/freenet/io/AddressTracker.java
trunk/freenet/src/freenet/io/AddressTrackerItem.java
trunk/freenet/src/freenet/io/InetAddressAddressTrackerItem.java
trunk/freenet/src/freenet/io/PeerAddressTrackerItem.java
trunk/freenet/src/freenet/io/comm/UdpSocketHandler.java
trunk/freenet/src/freenet/node/PacketSender.java
Log:
Save address tracker table to disk
Modified: trunk/freenet/src/freenet/io/AddressTracker.java
===================================================================
--- trunk/freenet/src/freenet/io/AddressTracker.java 2007-11-27 13:54:55 UTC
(rev 15963)
+++ trunk/freenet/src/freenet/io/AddressTracker.java 2007-11-27 14:18:20 UTC
(rev 15964)
@@ -15,10 +15,18 @@
*/
package freenet.io;
+import java.io.BufferedOutputStream;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.util.HashMap;
import freenet.io.comm.Peer;
+import freenet.support.Logger;
+import freenet.support.SimpleFieldSet;
/**
* Track packet traffic to/from specific peers and IP addresses, in order to
@@ -151,4 +159,46 @@
return "Error";
}
}
+
+ /** Persist the table to disk */
+ public void storeData(long bootID, File nodeDir, int port) {
+ File data = new File(nodeDir, "packets-"+port+".dat");
+ File dataBak = new File(nodeDir, "packets-"+port+".bak");
+ data.delete();
+ dataBak.delete();
+ try {
+ FileOutputStream fos = new FileOutputStream(dataBak);
+ BufferedOutputStream bos = new
BufferedOutputStream(fos);
+ OutputStreamWriter osw = new OutputStreamWriter(bos,
"UTF-8");
+ BufferedWriter bw = new BufferedWriter(osw);
+ SimpleFieldSet fs = getFieldset(bootID);
+ fs.writeTo(bw);
+ bw.close();
+ dataBak.renameTo(data);
+ } catch (IOException e) {
+ Logger.error(this, "Cannot store packet tracker to
disk");
+ return;
+ }
+ }
+
+ private SimpleFieldSet getFieldset(long bootID) {
+ SimpleFieldSet sfs = new SimpleFieldSet(true);
+ sfs.put("Version", 1);
+ sfs.put("BootID", bootID);
+ sfs.put("timeDefinitelyNoPacketsReceived",
timeDefinitelyNoPacketsReceived);
+ sfs.put("timeDefinitelyNoPacketsSent",
timeDefinitelyNoPacketsSent);
+ PeerAddressTrackerItem[] peerItems =
getPeerAddressTrackerItems();
+ SimpleFieldSet items = new SimpleFieldSet(true);
+ sfs.put("peers", items);
+ for(int i=0;i<peerItems.length;i++) {
+ items.put(Integer.toString(i),
peerItems[i].toFieldSet());
+ }
+ InetAddressAddressTrackerItem[] inetItems =
getInetAddressTrackerItems();
+ items = new SimpleFieldSet(true);
+ sfs.put("IPs", items);
+ for(int i=0;i<inetItems.length;i++) {
+ items.put(Integer.toString(i),
inetItems[i].toFieldSet());
+ }
+ return sfs;
+ }
}
Modified: trunk/freenet/src/freenet/io/AddressTrackerItem.java
===================================================================
--- trunk/freenet/src/freenet/io/AddressTrackerItem.java 2007-11-27
13:54:55 UTC (rev 15963)
+++ trunk/freenet/src/freenet/io/AddressTrackerItem.java 2007-11-27
14:18:20 UTC (rev 15964)
@@ -15,6 +15,8 @@
*/
package freenet.io;
+import freenet.support.SimpleFieldSet;
+
/**
* Tracks communication to/from a specific address. That address can be a
specific IP:port, a specific IP,
* or some completely different type of address, so we don't store it in this
class; subclasses will do.
@@ -165,4 +167,25 @@
return timeFirstReceivedPacket -
timeDefinitelyNoPacketsReceived;
}
+ public SimpleFieldSet toFieldSet() {
+ SimpleFieldSet fs = new SimpleFieldSet(true);
+ fs.put("timeFirstReceivedPacket", timeFirstReceivedPacket);
+ fs.put("timeFirstSentPacket", timeFirstSentPacket);
+ fs.put("timeDefinitelyNoPacketsSent",
timeDefinitelyNoPacketsSent);
+ fs.put("timeDefinitelyNoPacketsReceived",
timeDefinitelyNoPacketsReceived);
+ fs.put("timeLastReceivedPacket", timeLastReceivedPacket);
+ fs.put("timeLastSentPacket", timeLastSentPacket);
+ fs.put("packetsSent", packetsSent);
+ fs.put("packetsReceived", packetsReceived);
+ SimpleFieldSet gaps = new SimpleFieldSet(true);
+ fs.put("gaps", gaps);
+ for(int i=0;i<TRACK_GAPS;i++) {
+ SimpleFieldSet gap = new SimpleFieldSet(true);
+ gaps.put(Integer.toString(i), gap);
+ gap.put("length", gapLengths[i]);
+ gap.put("received", gapLengthRecvTimes[i]);
+ }
+ return fs;
+ }
+
}
Modified: trunk/freenet/src/freenet/io/InetAddressAddressTrackerItem.java
===================================================================
--- trunk/freenet/src/freenet/io/InetAddressAddressTrackerItem.java
2007-11-27 13:54:55 UTC (rev 15963)
+++ trunk/freenet/src/freenet/io/InetAddressAddressTrackerItem.java
2007-11-27 14:18:20 UTC (rev 15964)
@@ -17,6 +17,8 @@
import java.net.InetAddress;
+import freenet.support.SimpleFieldSet;
+
public class InetAddressAddressTrackerItem extends AddressTrackerItem {
public InetAddressAddressTrackerItem(long
timeDefinitelyNoPacketsReceived,
@@ -27,4 +29,9 @@
public final InetAddress addr;
+ public SimpleFieldSet toFieldSet() {
+ SimpleFieldSet fs = super.toFieldSet();
+ fs.putOverwrite("address", addr.getHostAddress());
+ return fs;
+ }
}
Modified: trunk/freenet/src/freenet/io/PeerAddressTrackerItem.java
===================================================================
--- trunk/freenet/src/freenet/io/PeerAddressTrackerItem.java 2007-11-27
13:54:55 UTC (rev 15963)
+++ trunk/freenet/src/freenet/io/PeerAddressTrackerItem.java 2007-11-27
14:18:20 UTC (rev 15964)
@@ -16,6 +16,7 @@
package freenet.io;
import freenet.io.comm.Peer;
+import freenet.support.SimpleFieldSet;
public class PeerAddressTrackerItem extends AddressTrackerItem {
@@ -26,5 +27,11 @@
super(timeDefinitelyNoPacketsReceived,
timeDefinitelyNoPacketsSent);
this.peer = peer;
}
+
+ public SimpleFieldSet toFieldSet() {
+ SimpleFieldSet fs = super.toFieldSet();
+ fs.putOverwrite("address", peer.toStringPrefNumeric());
+ return fs;
+ }
}
Modified: trunk/freenet/src/freenet/io/comm/UdpSocketHandler.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/UdpSocketHandler.java 2007-11-27
13:54:55 UTC (rev 15963)
+++ trunk/freenet/src/freenet/io/comm/UdpSocketHandler.java 2007-11-27
14:18:20 UTC (rev 15964)
@@ -38,6 +38,7 @@
private volatile int lastTimeInSeconds;
private boolean _isDone;
private boolean _active = true;
+ private final int listenPort;
public UdpSocketHandler(int listenPort, InetAddress bindto, Node node,
long startupTime) throws SocketException {
super("UdpSocketHandler packet receiver thread on port " +
listenPort);
@@ -48,6 +49,7 @@
// if (Updater.hasResource()) {
// _sock = (DatagramSocket) Updater.getResource();
// } else {
+ this.listenPort = listenPort;
_sock = new DatagramSocket(listenPort, bindto);
int sz = _sock.getReceiveBufferSize();
if(sz < 32768)
@@ -203,6 +205,8 @@
assert(blockToSend != null);
if(!_active) {
Logger.error(this, "Trying to send packet but no longer
active");
+ // It is essential that for recording accurate AddressTracker
data that we don't send any more
+ // packets after shutdown.
return;
}
// there should be no DNS needed here, but go ahead if we can,
but complain doing it
@@ -366,6 +370,7 @@
Logger.fatal(this, 10, "Not implemented: close(false)");
//Updater.saveResource(_sock);
}
+ tracker.storeData(node.bootID, node.getNodeDir(), listenPort);
}
public int getDropProbability() {
Modified: trunk/freenet/src/freenet/node/PacketSender.java
===================================================================
--- trunk/freenet/src/freenet/node/PacketSender.java 2007-11-27 13:54:55 UTC
(rev 15963)
+++ trunk/freenet/src/freenet/node/PacketSender.java 2007-11-27 14:18:20 UTC
(rev 15964)
@@ -45,6 +45,9 @@
/** 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;
+ /** Time after which we can send handshakes. Before this we will only
reply
+ * to them. This is to make detecting port forwards easier. */
+ private static final long SEND_HANDSHAKES_AFTER = 31*1000;
final LinkedList resendPackets;
/** ~= Ticker :) */
@@ -58,6 +61,7 @@
/** For watchdog. 32-bit to avoid locking. */
volatile int lastTimeInSeconds;
private long timeLastSentOldOpennetConnectAttempt;
+ private long startupTime;
private Vector rpiTemp;
private int[] rpiIntTemp;
@@ -88,6 +92,7 @@
private class Watchdog implements Runnable {
public void run() {
+ startupTime = System.currentTimeMillis();
freenet.support.Logger.OSThread.logPID(this);
// Do not lock anything, or we may be caught up with a
lost-lock deadlock.
while(true) {
@@ -312,7 +317,7 @@
// Not connected
// Send handshake if necessary
long beforeHandshakeTime = System.currentTimeMillis();
- if(pn.shouldSendHandshake())
+ if(now - startupTime > SEND_HANDSHAKES_AFTER &&
pn.shouldSendHandshake())
pn.getOutgoingMangler().sendHandshake(pn);
if(pn.noContactDetails())
pn.startARKFetcher();