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();


Reply via email to