Changeset bdd7c35a


Ignore:
Timestamp:
Oct 8, 2018 7:31:54 PM (2 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
19b1b3c
Parents:
184b617
Message:

Console: Remove static StatSummarizer? ref, hang off ClientAppManager?

Location:
apps/routerconsole
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java

    r184b617 rbdd7c35a  
    834834        }
    835835
    836         Thread t = new I2PAppThread(new StatSummarizer(), "StatSummarizer", true);
     836        Thread t = new I2PAppThread(new StatSummarizer(_context), "StatSummarizer", true);
    837837        t.setPriority(Thread.NORM_PRIORITY - 1);
    838838        t.start();
  • apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java

    r184b617 rbdd7c35a  
    1212import java.util.concurrent.Semaphore;
    1313
     14import net.i2p.I2PAppContext;
     15import net.i2p.app.ClientApp;
     16import net.i2p.app.ClientAppState;
    1417import net.i2p.data.DataHelper;
    1518import net.i2p.router.RouterContext;
     
    3336 *  @since 0.6.1.13
    3437 */
    35 public class StatSummarizer implements Runnable {
     38public class StatSummarizer implements Runnable, ClientApp {
    3639    private final RouterContext _context;
    3740    private final Log _log;
    3841    /** list of SummaryListener instances */
    3942    private final List<SummaryListener> _listeners;
    40     // TODO remove static instance
    41     private static StatSummarizer _instance;
    4243    private static final int MAX_CONCURRENT_PNG = SystemVersion.isARM() ? 2 : 3;
    4344    private final Semaphore _sem;
    44     private volatile boolean _isRunning = true;
    45     private boolean _isDisabled;
    46     private Thread _thread;
    47    
    48     public StatSummarizer() {
    49         _context = RouterContext.listContexts().get(0); // only summarize one per jvm
     45    private volatile boolean _isRunning;
     46    private volatile Thread _thread;
     47    private static final String NAME = "StatSummarizer";
     48   
     49    public StatSummarizer(RouterContext ctx) {
     50        _context = ctx;
    5051        _log = _context.logManager().getLog(getClass());
    5152        _listeners = new CopyOnWriteArrayList<SummaryListener>();
    52         _instance = this;
    5353        _sem = new Semaphore(MAX_CONCURRENT_PNG, true);
    5454        _context.addShutdownTask(new Shutdown());
    5555    }
    5656   
    57     public static StatSummarizer instance() { return _instance; }
     57    /**
     58     * @return null if disabled
     59     */
     60    public static StatSummarizer instance() {
     61        return instance(I2PAppContext.getGlobalContext());
     62    }
     63
     64    /**
     65     * @return null if disabled
     66     * @since 0.0.38
     67     */
     68    public static StatSummarizer instance(I2PAppContext ctx) {
     69        ClientApp app = ctx.clientAppManager().getRegisteredApp(NAME);
     70        return (app != null) ? (StatSummarizer) app : null;
     71    }
    5872   
    5973    public void run() {
     
    6680                                     System.getProperty("java.runtime.name") + ' ' +
    6781                                     System.getProperty("java.runtime.version") + ')');
    68             _isDisabled = true;
    69             _isRunning = false;
    7082            return;
    7183        }
     84        _isRunning = true;
    7285        boolean isPersistent = _context.getBooleanPropertyDefaultTrue(SummaryListener.PROP_PERSISTENT);
    7386        if (!isPersistent)
    7487            deleteOldRRDs();
    7588        _thread = Thread.currentThread();
     89        _context.clientAppManager().register(this);
    7690        String specs = "";
    77         while (_isRunning && _context.router().isAlive()) {
    78             specs = adjustDatabases(specs);
    79             try { Thread.sleep(60*1000); } catch (InterruptedException ie) {}
    80         }
    81     }
    82    
    83     /** @since 0.8.7, public since 0.9.33, was package private */
    84     public static boolean isDisabled() {
    85         return _instance == null || _instance._isDisabled;
     91        try {
     92            while (_isRunning && _context.router().isAlive()) {
     93                specs = adjustDatabases(specs);
     94                try { Thread.sleep(60*1000); } catch (InterruptedException ie) {}
     95            }
     96        } finally {
     97            _isRunning = false;
     98            _context.clientAppManager().unregister(this);
     99        }
     100    }
     101   
     102    /** @since 0.0.38 */
     103    public static boolean isDisabled(I2PAppContext ctx) {
     104        return ctx.clientAppManager().getRegisteredApp(NAME) == null;
    86105    }
    87106   
     
    91110     * @since 0.9.6
    92111     */
    93     static void setDisabled() {
    94         if (_instance != null) {
    95             _instance._isDisabled = true;
    96             _instance._isRunning = false;
    97         }
    98     }
     112    static void setDisabled(I2PAppContext ctx) {
     113        StatSummarizer ss = instance(ctx);
     114        if (ss != null)
     115            ss.setDisabled();
     116    }
     117
     118    /**
     119     * Disable graph generation until restart
     120     * See SummaryRenderer.render()
     121     * @since 0.9.38
     122     */
     123    synchronized void setDisabled() {
     124        if (_isRunning) {
     125            _isRunning = false;
     126            Thread t = _thread;
     127            if (t != null)
     128                t.interrupt();
     129        }
     130    }
     131
     132    /////// ClientApp methods
     133
     134    /**
     135     * Does nothing, we aren't tracked
     136     * @since 0.9.38
     137     */
     138    public void startup() {}
     139
     140    /**
     141     * Does nothing, we aren't tracked
     142     * @since 0.9.38
     143     */
     144    public void shutdown(String[] args) {}
     145
     146    /** @since 0.9.38 */
     147    public ClientAppState getState() {
     148        return ClientAppState.RUNNING;
     149    }
     150
     151    /** @since 0.9.38 */
     152    public String getName() {
     153        return NAME;
     154    }
     155
     156    /** @since 0.9.38 */
     157    public String getDisplayName() {
     158        return "Console stats summarizer";
     159    }
     160
     161    /////// End ClientApp methods
    99162
    100163    /**
     
    207270                //  at java.lang.Class.forName(Class.java:270)
    208271                //  at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:82)
    209                 _isDisabled = true;
    210                 _isRunning = false;
     272                setDisabled();
    211273                String s = "Error rendering - disabling graph generation. Install ttf-dejavu font package?";
    212274                _log.logAlways(Log.WARN, s);
     
    297359                //  at java.lang.Class.forName(Class.java:270)
    298360                //  at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:82)
    299                 _isDisabled = true;
    300                 _isRunning = false;
     361                setDisabled();
    301362                String s = "Error rendering - disabling graph generation. Install ttf-dejavu font package?";
    302363                _log.logAlways(Log.WARN, s);
     
    317378        SummaryListener txLsnr = null;
    318379        SummaryListener rxLsnr = null;
    319         for (SummaryListener lsnr : StatSummarizer.instance().getListeners()) {
     380        for (SummaryListener lsnr : getListeners()) {
    320381            String title = lsnr.getRate().getRateStat().getName();
    321382            if (title.equals("bw.sendRate"))
     
    397458    private class Shutdown implements Runnable {
    398459        public void run() {
    399             _isRunning = false;
    400             if (_thread != null)
    401                 _thread.interrupt();
     460            setDisabled();
    402461            for (SummaryListener lsnr : _listeners) {
    403462                // FIXME could cause exceptions if rendering?
  • apps/routerconsole/java/src/net/i2p/router/web/SummaryRenderer.java

    r184b617 rbdd7c35a  
    290290            } catch (NullPointerException npe) {
    291291                _log.error("Error rendering", npe);
    292                 StatSummarizer.setDisabled();
     292                StatSummarizer.setDisabled(_context);
    293293                throw new IOException("Error rendering - disabling graph generation. Missing font? See http://trac.i2p2.i2p/ticket/915");
    294294            }
  • apps/routerconsole/java/src/net/i2p/router/web/helpers/GraphHelper.java

    r184b617 rbdd7c35a  
    148148
    149149    public String getImages() {
    150         if (StatSummarizer.isDisabled())
     150        StatSummarizer ss = StatSummarizer.instance(_context);
     151        if (ss == null)
    151152            return "";
    152153        try {
    153             List<SummaryListener> listeners = StatSummarizer.instance().getListeners();
     154            List<SummaryListener> listeners = ss.getListeners();
    154155            TreeSet<SummaryListener> ordered = new TreeSet<SummaryListener>(new AlphaComparator());
    155156            ordered.addAll(listeners);
     
    236237     */
    237238    public String getSingleStat() {
    238         try {
    239             if (StatSummarizer.isDisabled())
    240                 return "";
     239        StatSummarizer ss = StatSummarizer.instance(_context);
     240        if (ss == null)
     241            return "";
     242        try {
    241243            if (_stat == null) {
    242244                _out.write("No stat specified");
     
    250252                displayName = _t("Bandwidth usage");
    251253            } else {
    252                 Set<Rate> rates = StatSummarizer.instance().parseSpecs(_stat);
     254                Set<Rate> rates = ss.parseSpecs(_stat);
    253255                if (rates.size() != 1) {
    254256                    _out.write("Graphs not enabled for " + _stat);
     
    377379
    378380    public String getForm() {
    379         if (StatSummarizer.isDisabled())
     381        StatSummarizer ss = StatSummarizer.instance(_context);
     382        if (ss == null)
    380383            return "";
    381384        // too hard to use the standard formhandler.jsi / FormHandler.java session nonces
     
    441444    @Override
    442445    public String getAllMessages() {
    443         if (StatSummarizer.isDisabled()) {
     446        if (StatSummarizer.isDisabled(_context)) {
    444447            addFormError("Graphing not supported with this JVM: " +
    445448                         System.getProperty("java.vendor") + ' ' +
  • apps/routerconsole/java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java

    r184b617 rbdd7c35a  
    278278        }
    279279
    280         if (!StatSummarizer.isDisabled()) {
     280        if (!StatSummarizer.isDisabled(_context)) {
    281281            buf.append("<a href=\"/graphs\" target=\"_top\" title=\"")
    282282               .append(_t("Graph router performance"))
     
    823823        if (_helper == null) return "";
    824824        StringBuilder buf = new StringBuilder(512);
    825         if (!StatSummarizer.isDisabled())
     825        if (!StatSummarizer.isDisabled(_context)) {
    826826            buf.append("<div id=\"sb_graphcontainer\"><a href=\"/graphs\"><table id=\"sb_bandwidthgraph\">" +
    827827                       "<tr title=\"")
     
    830830               .append(_helper.getSecondKBps())
    831831               .append("Bps</span></td></tr></table></a></div>\n");
     832        }
    832833        buf.append("<script src=\"/js/refreshGraph.js\" type=\"text/javascript\" id=\"refreshGraph\" async></script>");
    833834        return buf.toString();
  • apps/routerconsole/jsp/viewstat.jsp

    r184b617 rbdd7c35a  
    77 * Do not tag this file for translation.
    88 */
    9 
     9net.i2p.I2PAppContext ctx = net.i2p.I2PAppContext.getGlobalContext();
     10net.i2p.router.web.StatSummarizer ss = net.i2p.router.web.StatSummarizer.instance(ctx);
     11if (ss == null) {
     12    response.sendError(403, "Stats disabled");
     13    return;
     14}
    1015boolean rendered = false;
    1116/****  unused
     
    1419  java.io.OutputStream cout = response.getOutputStream();
    1520  response.setContentType("image/png");
    16   rendered = net.i2p.router.web.StatSummarizer.instance().renderPng(cout, templateFile);
     21  rendered = ss.renderPng(cout, templateFile);
    1722}
    1823****/
     
    2328net.i2p.stat.RateStat rs = null;
    2429if (stat != null)
    25     rs = net.i2p.I2PAppContext.getGlobalContext().statManager().getRate(stat);
     30    rs = ctx.statManager().getRate(stat);
    2631if ( !rendered && ((rs != null) || fakeBw) ) {
    2732  long per = -1;
     
    4045        if (!fakeBw) {
    4146          response.setContentType("text/xml");
    42           rendered = net.i2p.router.web.StatSummarizer.instance().getXML(rate, cout);
     47          rendered = ss.getXML(rate, cout);
    4348        }
    4449      } else {
    4550        response.setContentType("image/png");
    4651        // very brief 45 sec expire
    47         response.setDateHeader("Expires", net.i2p.I2PAppContext.getGlobalContext().clock().now() + (45*1000));
     52        response.setDateHeader("Expires", ctx.clock().now() + (45*1000));
    4853        response.setHeader("Accept-Ranges", "none");
    4954        // http://jira.codehaus.org/browse/JETTY-1346
     
    7176          showCredit = Boolean.parseBoolean(request.getParameter("showCredit"));
    7277        if (fakeBw)
    73             rendered = net.i2p.router.web.StatSummarizer.instance().renderRatePng(cout, width, height, hideLegend, hideGrid, hideTitle, showEvents, periodCount, end, showCredit);
     78            rendered = ss.renderRatePng(cout, width, height, hideLegend, hideGrid, hideTitle, showEvents, periodCount, end, showCredit);
    7479        else
    75             rendered = net.i2p.router.web.StatSummarizer.instance().renderPng(rate, cout, width, height, hideLegend, hideGrid, hideTitle, showEvents, periodCount, end, showCredit);
     80            rendered = ss.renderPng(rate, cout, width, height, hideLegend, hideGrid, hideTitle, showEvents, periodCount, end, showCredit);
    7681      }
    7782      if (rendered)
Note: See TracChangeset for help on using the changeset viewer.