From f16927f316a990e79dcb3362caef7ade8b3aca59 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Tue, 28 Apr 2015 21:57:13 +0000 Subject: [PATCH] JobQueueRunner: Don't call System.exit() on OOM, let the shutdown progress normally; Make it an I2PThread instead of a Runner so we can call fireOOM() for consistent logging (ticket #1549) Router: Don't add OOM listener on Android so we don't hang onto the context --- router/java/src/net/i2p/router/JobQueue.java | 5 ++- .../src/net/i2p/router/JobQueueRunner.java | 32 ++++++++----------- router/java/src/net/i2p/router/Router.java | 3 +- 3 files changed, 17 insertions(+), 23 deletions(-) diff --git a/router/java/src/net/i2p/router/JobQueue.java b/router/java/src/net/i2p/router/JobQueue.java index 0b0f84fd27..bebd9c6e12 100644 --- a/router/java/src/net/i2p/router/JobQueue.java +++ b/router/java/src/net/i2p/router/JobQueue.java @@ -493,9 +493,8 @@ public class JobQueue { for (int i = _queueRunners.size(); i < numThreads; i++) { JobQueueRunner runner = new JobQueueRunner(_context, i); _queueRunners.put(Integer.valueOf(i), runner); - Thread t = new I2PThread(runner, "JobQueue " + _runnerId.incrementAndGet() + '/' + numThreads, false); - //t.setPriority(I2PThread.MAX_PRIORITY-1); - t.start(); + runner.setName("JobQueue " + _runnerId.incrementAndGet() + '/' + numThreads); + runner.start(); } } else if (_queueRunners.size() == numThreads) { for (JobQueueRunner runner : _queueRunners.values()) { diff --git a/router/java/src/net/i2p/router/JobQueueRunner.java b/router/java/src/net/i2p/router/JobQueueRunner.java index 4fa3307620..a3ed2da14c 100644 --- a/router/java/src/net/i2p/router/JobQueueRunner.java +++ b/router/java/src/net/i2p/router/JobQueueRunner.java @@ -1,9 +1,11 @@ package net.i2p.router; +import net.i2p.util.I2PThread; import net.i2p.util.Log; +import net.i2p.util.SystemVersion; /** a do run run run a do run run */ -class JobQueueRunner implements Runnable { +class JobQueueRunner extends I2PThread { private final Log _log; private final RouterContext _context; private volatile boolean _keepRunning; @@ -12,7 +14,7 @@ class JobQueueRunner implements Runnable { private volatile Job _lastJob; private volatile long _lastBegin; private volatile long _lastEnd; - private volatile int _state; + //private volatile int _state; public JobQueueRunner(RouterContext context, int id) { _context = context; @@ -23,7 +25,7 @@ class JobQueueRunner implements Runnable { //_state = 1; } - final int getState() { return _state; } + //final int getState() { return _state; } public Job getCurrentJob() { return _currentJob; } public Job getLastJob() { return _lastJob; } @@ -115,14 +117,12 @@ class JobQueueRunner implements Runnable { //if ( (jobNum % 10) == 0) // System.gc(); } catch (Throwable t) { - if (_log.shouldLog(Log.CRIT)) - _log.log(Log.CRIT, "WTF, error running?", t); + _log.log(Log.CRIT, "WTF, error running?", t); } } //_state = 16; if (_context.router().isAlive()) - if (_log.shouldLog(Log.CRIT)) - _log.log(Log.CRIT, "Queue runner " + _id + " exiting"); + _log.log(Log.CRIT, "Queue runner " + _id + " exiting"); _context.jobQueue().removeRunner(_id); //_state = 17; } @@ -134,21 +134,15 @@ class JobQueueRunner implements Runnable { _currentJob.runJob(); //_state = 19; } catch (OutOfMemoryError oom) { - //_state = 20; try { - if (_log.shouldLog(Log.CRIT)) - _log.log(Log.CRIT, "Router ran out of memory, shutting down", oom); - _log.log(Log.CRIT, _currentJob.getClass().getName()); - _context.router().shutdown(Router.EXIT_OOM); - } catch (Throwable t) { - System.err.println("***Router ran out of memory, shutting down hard"); - } - try { Thread.sleep(1000); } catch (InterruptedException ie) {} - System.exit(-1); + if (SystemVersion.isAndroid()) + _context.router().shutdown(Router.EXIT_OOM); + else + fireOOM(oom); + } catch (Throwable t) {} } catch (Throwable t) { //_state = 21; - if (_log.shouldLog(Log.CRIT)) - _log.log(Log.CRIT, "Error processing job [" + _currentJob.getName() + _log.log(Log.CRIT, "Error processing job [" + _currentJob.getName() + "] on thread " + _id + ": " + t.getMessage(), t); //if (_log.shouldLog(Log.ERROR)) // _log.error("The above job was enqueued by: ", _currentJob.getAddedBy()); diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java index 1462c6ac67..a3951dd2b6 100644 --- a/router/java/src/net/i2p/router/Router.java +++ b/router/java/src/net/i2p/router/Router.java @@ -559,7 +559,8 @@ public class Router implements RouterClock.ClockShiftListener { try { Runtime.getRuntime().addShutdownHook(_shutdownHook); } catch (IllegalStateException ise) {} - I2PThread.addOOMEventListener(_oomListener); + if (!SystemVersion.isAndroid()) + I2PThread.addOOMEventListener(_oomListener); _context.keyManager().startup(); -- GitLab