Author: toad
Date: 2006-05-29 15:29:45 +0000 (Mon, 29 May 2006)
New Revision: 8918
Modified:
trunk/freenet/src/freenet/node/PacketSender.java
trunk/freenet/src/freenet/node/Version.java
Log:
744: PacketSender watchdog. Will automatically restart the node if PacketSender
stalls for more than 3 minutes.
Modified: trunk/freenet/src/freenet/node/PacketSender.java
===================================================================
--- trunk/freenet/src/freenet/node/PacketSender.java 2006-05-29 14:08:49 UTC
(rev 8917)
+++ trunk/freenet/src/freenet/node/PacketSender.java 2006-05-29 15:29:45 UTC
(rev 8918)
@@ -4,6 +4,8 @@
import java.util.TreeMap;
import java.util.Vector;
+import org.tanukisoftware.wrapper.WrapperManager;
+
import freenet.io.comm.DMT;
import freenet.io.comm.Message;
import freenet.io.comm.NotConnectedException;
@@ -27,6 +29,8 @@
long lastClearedOldSwapChains;
long lastReportedNoPackets;
long lastReceivedPacketFromAnyNode;
+ /** For watchdog. 32-bit to avoid locking. */
+ int lastTimeInSeconds;
PacketSender(Node node) {
resendPackets = new LinkedList();
@@ -34,8 +38,41 @@
this.node = node;
myThread = new Thread(this, "PacketSender thread for
"+node.portNumber);
myThread.setDaemon(true);
+ lastTimeInSeconds = (int) (System.currentTimeMillis() / 1000);
+ // Necessary because of sun JVM bugs when NPTL is enabled. Write once,
debug everywhere!
+ Thread t1 = new Thread(new Watchdog(), "PacketSender watchdog");
+ t1.setDaemon(true);
+ t1.start();
}
+ private class Watchdog implements Runnable {
+
+ public void run() {
+ while(true) {
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ // Ignore
+ }
+ long now = System.currentTimeMillis();
+ long recordedTime = ((long)lastTimeInSeconds) *
1000;
+ long diff = now - recordedTime;
+ Logger.minor(this, "PacketSender last updated
time "+diff+"ms ago");
+ if(diff > 3*60*1000) {
+ System.err.println("Restarting node:
PacketSender froze for 3 minutes! ("+diff+")");
+ Logger.error(this, "Restarting node:
PacketSender froze for 3 minutes! ("+diff+")");
+ try {
+
WrapperManager.requestThreadDump();
+ } catch (Throwable t) {
+ // Ignore
+ }
+ WrapperManager.restart();
+ }
+
+ }
+ }
+ }
+
void start() {
myThread.start();
}
@@ -66,6 +103,7 @@
private void realRun() {
long now = System.currentTimeMillis();
+ lastTimeInSeconds = (int) (now / 1000);
PeerManager pm = node.peers;
PeerNode[] nodes = pm.myPeers;
// Run the time sensitive status updater separately
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-05-29 14:08:49 UTC (rev
8917)
+++ trunk/freenet/src/freenet/node/Version.java 2006-05-29 15:29:45 UTC (rev
8918)
@@ -18,7 +18,7 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- private static final int buildNumber = 743;
+ private static final int buildNumber = 744;
/** Oldest build of Fred we will talk to */
private static final int lastGoodBuild = 732;