From 6ddaa72a867bbc62c8abd705943197cdf7f3613e Mon Sep 17 00:00:00 2001 From: zzz Date: Tue, 23 Aug 2022 13:01:32 -0400 Subject: [PATCH] Add deadlocks to event log --- .../java/src/net/i2p/router/web/DeadlockDetector.java | 11 +++++++---- .../net/i2p/router/web/helpers/EventLogHelper.java | 1 + router/java/src/net/i2p/router/util/EventLog.java | 1 + 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/DeadlockDetector.java b/apps/routerconsole/java/src/net/i2p/router/web/DeadlockDetector.java index c32678b86..b2655a86c 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/DeadlockDetector.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/DeadlockDetector.java @@ -4,7 +4,8 @@ import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; -import net.i2p.I2PAppContext; +import net.i2p.router.RouterContext; +import net.i2p.router.util.EventLog; import net.i2p.util.Log; import net.i2p.util.SimpleTimer2; @@ -19,12 +20,12 @@ import net.i2p.util.SimpleTimer2; */ class DeadlockDetector extends SimpleTimer2.TimedEvent { - private final I2PAppContext _context; + private final RouterContext _context; private final Log _log; private static final String PROP_INTERVAL = "router.deadlockDetectIntervalHours"; private static final long DEFAULT_INTERVAL = 24; - public DeadlockDetector(I2PAppContext ctx) { + public DeadlockDetector(RouterContext ctx) { super(ctx.simpleTimer2()); _context = ctx; _log = _context.logManager().getLog(DeadlockDetector.class); @@ -41,6 +42,7 @@ class DeadlockDetector extends SimpleTimer2.TimedEvent { public void timeReached() { long start = System.currentTimeMillis(); boolean detected = detect(); + // only reschedule if not detected if (!detected) { long time = System.currentTimeMillis() - start; if (_log.shouldDebug()) @@ -55,7 +57,7 @@ class DeadlockDetector extends SimpleTimer2.TimedEvent { return detect(_context); } - public static boolean detect(I2PAppContext ctx) { + public static boolean detect(RouterContext ctx) { try { ThreadMXBean mxb = ManagementFactory.getThreadMXBean(); long[] ids = mxb.findDeadlockedThreads(); @@ -89,6 +91,7 @@ class DeadlockDetector extends SimpleTimer2.TimedEvent { buf.append("\nAfter reporting, please restart your router!\n"); Log log = ctx.logManager().getLog(DeadlockDetector.class); log.log(Log.CRIT, buf.toString()); + ctx.router().eventLog().addEvent(EventLog.DEADLOCK, infos.length + " threads"); } catch (Throwable t) { // class not found, unsupportedoperation, ... Log log = ctx.logManager().getLog(DeadlockDetector.class); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/EventLogHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/EventLogHelper.java index 7602432ee..21bc26b8f 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/EventLogHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/EventLogHelper.java @@ -36,6 +36,7 @@ public class EventLogHelper extends FormHandler { EventLog.CLOCK_SHIFT, _x("Clock shifted"), EventLog.CRASHED, _x("Crashed"), EventLog.CRITICAL, _x("Critical error"), + EventLog.DEADLOCK, _x("Deadlock detected"), EventLog.INSTALLED, _x("Installed new version"), EventLog.INSTALL_FAILED, _x("Install failed"), EventLog.NETWORK, _x("Network error"), diff --git a/router/java/src/net/i2p/router/util/EventLog.java b/router/java/src/net/i2p/router/util/EventLog.java index 255f4c120..93a962204 100644 --- a/router/java/src/net/i2p/router/util/EventLog.java +++ b/router/java/src/net/i2p/router/util/EventLog.java @@ -40,6 +40,7 @@ public class EventLog { public static final String CLOCK_SHIFT = "clockShift"; public static final String CRASHED = "crashed"; public static final String CRITICAL = "critical"; + public static final String DEADLOCK = "deadlock"; public static final String INSTALLED = "installed"; public static final String INSTALL_FAILED = "installFailed"; public static final String NETWORK = "network";