Changeset 640782a


Ignore:
Timestamp:
Sep 6, 2011 3:02:28 PM (8 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
29ef116
Parents:
3882e49
Message:
  • Console: Move configservice.jsp rendering code from the router to the console
Files:
4 edited

Legend:

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

    r3882e49 r640782a  
    44import java.io.IOException;
    55import java.io.OutputStreamWriter;
     6import java.io.Writer;
     7import java.util.ArrayList;
     8import java.util.Collections;
     9import java.util.Comparator;
     10import java.util.List;
     11import java.util.Map;
     12import java.util.TreeMap;
    613
     14import net.i2p.data.DataHelper;
     15import net.i2p.router.Job;
     16import net.i2p.router.JobStats;
    717
    818public class JobQueueHelper extends HelperBase {
    9     public JobQueueHelper() {}
    1019   
    1120    public String getJobQueueSummary() {
    1221        try {
    1322            if (_out != null) {
    14                 _context.jobQueue().renderStatusHTML(_out);
     23                renderStatusHTML(_out);
    1524                return "";
    1625            } else {
    1726                ByteArrayOutputStream baos = new ByteArrayOutputStream(32*1024);
    18                 _context.jobQueue().renderStatusHTML(new OutputStreamWriter(baos));
     27                renderStatusHTML(new OutputStreamWriter(baos));
    1928                return new String(baos.toByteArray());
    2029            }
     
    2433        }
    2534    }
     35
     36    /**
     37     *  Moved from JobQueue
     38     *  @since 0.8.9
     39     */
     40    private void renderStatusHTML(Writer out) throws IOException {
     41        List<Job> readyJobs = new ArrayList(8);
     42        List<Job> timedJobs = new ArrayList(128);
     43        List<Job> activeJobs = new ArrayList(8);
     44        List<Job> justFinishedJobs = new ArrayList(8);
     45       
     46        int numRunners = _context.jobQueue().getJobs(readyJobs, timedJobs, activeJobs, justFinishedJobs);
     47       
     48        StringBuilder buf = new StringBuilder(32*1024);
     49        buf.append("<b><div class=\"joblog\"><h3>I2P Job Queue</h3><div class=\"wideload\">Job runners: ").append(numRunners);
     50        buf.append("</b><br>\n");
     51
     52        long now = _context.clock().now();
     53
     54        buf.append("<hr><b>Active jobs: ").append(activeJobs.size()).append("</b><ol>\n");
     55        for (int i = 0; i < activeJobs.size(); i++) {
     56            Job j = activeJobs.get(i);
     57            buf.append("<li>[started ").append(DataHelper.formatDuration(now-j.getTiming().getStartAfter())).append(" ago]: ");
     58            buf.append(j.toString()).append("</li>\n");
     59        }
     60        buf.append("</ol>\n");
     61        buf.append("<hr><b>Just finished jobs: ").append(justFinishedJobs.size()).append("</b><ol>\n");
     62        for (int i = 0; i < justFinishedJobs.size(); i++) {
     63            Job j = justFinishedJobs.get(i);
     64            buf.append("<li>[finished ").append(DataHelper.formatDuration(now-j.getTiming().getActualEnd())).append(" ago]: ");
     65            buf.append(j.toString()).append("</li>\n");
     66        }
     67        buf.append("</ol>\n");
     68        buf.append("<hr><b>Ready/waiting jobs: ").append(readyJobs.size()).append("</b><ol>\n");
     69        for (int i = 0; i < readyJobs.size(); i++) {
     70            Job j = readyJobs.get(i);
     71            buf.append("<li>[waiting ");
     72            buf.append(DataHelper.formatDuration(now-j.getTiming().getStartAfter()));
     73            buf.append("]: ");
     74            buf.append(j.toString()).append("</li>\n");
     75        }
     76        buf.append("</ol>\n");
     77        out.flush();
     78
     79        buf.append("<hr><b>Scheduled jobs: ").append(timedJobs.size()).append("</b><ol>\n");
     80        TreeMap<Long, Job> ordered = new TreeMap();
     81        for (int i = 0; i < timedJobs.size(); i++) {
     82            Job j = timedJobs.get(i);
     83            ordered.put(Long.valueOf(j.getTiming().getStartAfter()), j);
     84        }
     85        for (Job j : ordered.values()) {
     86            long time = j.getTiming().getStartAfter() - now;
     87            buf.append("<li>").append(j.getName()).append(" in ");
     88            buf.append(DataHelper.formatDuration(time)).append("</li>\n");
     89        }
     90        buf.append("</ol></div>\n");
     91       
     92        out.flush();
     93       
     94        getJobStats(buf);
     95       
     96        out.flush();
     97       
     98        out.write(buf.toString());
     99    }
     100   
     101    /**
     102     *  Render the HTML for the job stats.
     103     *  Moved from JobQueue
     104     *  @since 0.8.9
     105     */
     106    private void getJobStats(StringBuilder buf) {
     107        buf.append("<table>\n" +
     108                   "<tr><th>Job</th><th>Runs</th>" +
     109                   "<th>Time</th><th><i>Avg</i></th><th><i>Max</i></th><th><i>Min</i></th>" +
     110                   "<th>Pending</th><th><i>Avg</i></th><th><i>Max</i></th><th><i>Min</i></th></tr>\n");
     111        long totRuns = 0;
     112        long totExecTime = 0;
     113        long avgExecTime = 0;
     114        long maxExecTime = -1;
     115        long minExecTime = -1;
     116        long totPendingTime = 0;
     117        long avgPendingTime = 0;
     118        long maxPendingTime = -1;
     119        long minPendingTime = -1;
     120
     121        List<JobStats> tstats = new ArrayList(_context.jobQueue().getJobStats());
     122        Collections.sort(tstats, new JobStatsComparator());
     123       
     124        for (JobStats stats : tstats) {
     125            buf.append("<tr>");
     126            buf.append("<td><b>").append(stats.getName()).append("</b></td>");
     127            buf.append("<td align=\"right\">").append(stats.getRuns()).append("</td>");
     128            buf.append("<td align=\"right\">").append(stats.getTotalTime()).append("</td>");
     129            buf.append("<td align=\"right\">").append(stats.getAvgTime()).append("</td>");
     130            buf.append("<td align=\"right\">").append(stats.getMaxTime()).append("</td>");
     131            buf.append("<td align=\"right\">").append(stats.getMinTime()).append("</td>");
     132            buf.append("<td align=\"right\">").append(stats.getTotalPendingTime()).append("</td>");
     133            buf.append("<td align=\"right\">").append(stats.getAvgPendingTime()).append("</td>");
     134            buf.append("<td align=\"right\">").append(stats.getMaxPendingTime()).append("</td>");
     135            buf.append("<td align=\"right\">").append(stats.getMinPendingTime()).append("</td>");
     136            buf.append("</tr>\n");
     137            totRuns += stats.getRuns();
     138            totExecTime += stats.getTotalTime();
     139            if (stats.getMaxTime() > maxExecTime)
     140                maxExecTime = stats.getMaxTime();
     141            if ( (minExecTime < 0) || (minExecTime > stats.getMinTime()) )
     142                minExecTime = stats.getMinTime();
     143            totPendingTime += stats.getTotalPendingTime();
     144            if (stats.getMaxPendingTime() > maxPendingTime)
     145                maxPendingTime = stats.getMaxPendingTime();
     146            if ( (minPendingTime < 0) || (minPendingTime > stats.getMinPendingTime()) )
     147                minPendingTime = stats.getMinPendingTime();
     148        }
     149
     150        if (totRuns != 0) {
     151            if (totExecTime != 0)
     152                avgExecTime = totExecTime / totRuns;
     153            if (totPendingTime != 0)
     154                avgPendingTime = totPendingTime / totRuns;
     155        }
     156
     157        buf.append("<tr class=\"tablefooter\">");
     158        buf.append("<td><b>").append("SUMMARY").append("</b></td>");
     159        buf.append("<td align=\"right\">").append(totRuns).append("</td>");
     160        buf.append("<td align=\"right\">").append(totExecTime).append("</td>");
     161        buf.append("<td align=\"right\">").append(avgExecTime).append("</td>");
     162        buf.append("<td align=\"right\">").append(maxExecTime).append("</td>");
     163        buf.append("<td align=\"right\">").append(minExecTime).append("</td>");
     164        buf.append("<td align=\"right\">").append(totPendingTime).append("</td>");
     165        buf.append("<td align=\"right\">").append(avgPendingTime).append("</td>");
     166        buf.append("<td align=\"right\">").append(maxPendingTime).append("</td>");
     167        buf.append("<td align=\"right\">").append(minPendingTime).append("</td>");
     168        buf.append("</tr></table></div>\n");
     169    }
     170
     171    /** @since 0.8.9 */
     172    private static class JobStatsComparator implements Comparator<JobStats> {
     173         public int compare(JobStats l, JobStats r) {
     174             return l.getName().compareTo(r.getName());
     175        }
     176    }
     177
    26178}
  • history.txt

    r3882e49 r640782a  
    112011-09-06 zzz
     2  * Console: Move configservice.jsp rendering code from
     3    the router to the console
    24  * Crypto: Rework use of SHA256 for efficiency and
    35    to avoid clogging the Hash cache with one-time hashes,
  • router/java/src/net/i2p/router/JobQueue.java

    r3882e49 r640782a  
    610610    }
    611611
    612     ////
    613     // the remainder are utility methods for dumping status info
    614     ////
    615    
     612    /**
     613     *  Dump the current state.
     614     *  For the router console jobs status page.
     615     *
     616     *  @param readyJobs out parameter
     617     *  @param timedJobs out parameter
     618     *  @param activeJobs out parameter
     619     *  @param justFinishedJobs out parameter
     620     *  @return number of job runners
     621     *  @since 0.8.9
     622     */
     623    public int getJobs(Collection<Job> readyJobs, Collection<Job> timedJobs,
     624                        Collection<Job> activeJobs, Collection<Job> justFinishedJobs) {
     625        for (JobQueueRunner runner :_queueRunners.values()) {
     626            Job job = runner.getCurrentJob();
     627            if (job != null) {
     628                activeJobs.add(job);
     629            } else {
     630                job = runner.getLastJob();
     631                if (job != null)
     632                    justFinishedJobs.add(job);
     633            }
     634        }
     635        synchronized (_jobLock) {
     636            readyJobs.addAll(_readyJobs);
     637            timedJobs.addAll(_timedJobs);
     638        }
     639        return _queueRunners.size();
     640    }
     641
     642    /**
     643     *  Current job stats.
     644     *  For the router console jobs status page.
     645     *
     646     *  @since 0.8.9
     647     */
     648    public Collection<JobStats> getJobStats() {
     649        return Collections.unmodifiableCollection(_jobStats.values());
     650    }
     651
     652    /** @deprecated moved to router console */
    616653    public void renderStatusHTML(Writer out) throws IOException {
    617         List<Job> readyJobs = null;
    618         List<Job> timedJobs = null;
    619         List<Job> activeJobs = new ArrayList(RUNNERS);
    620         List<Job> justFinishedJobs = new ArrayList(RUNNERS);
    621         //out.write("<!-- jobQueue rendering -->\n");
    622         out.flush();
    623        
    624         //int states[] = null;
    625         int numRunners = 0;
    626 
    627         {
    628             //states = new int[_queueRunners.size()];
    629             int i = 0;
    630             for (Iterator<JobQueueRunner> iter = _queueRunners.values().iterator(); iter.hasNext(); i++) {
    631                 JobQueueRunner runner = iter.next();
    632                 //states[i] = runner.getState();
    633                 Job job = runner.getCurrentJob();
    634                 if (job != null) {
    635                     activeJobs.add(job);
    636                 } else {
    637                     job = runner.getLastJob();
    638                     if (job != null)
    639                         justFinishedJobs.add(job);
    640                 }
    641             }
    642             numRunners = _queueRunners.size();
    643         }
    644        
    645 /*******
    646         StringBuilder str = new StringBuilder(128);
    647         str.append("<!-- after queueRunner sync: states: ");
    648         for (int i = 0; states != null && i < states.length; i++)
    649             str.append(states[i]).append(" ");
    650         str.append(" -->\n");
    651         str.append("<!-- jobs: ");
    652         for (int i = 0; i < activeJobs.size(); i++)
    653             str.append(activeJobs.get(i).toString()).append(" ");
    654         str.append("-->\n");
    655         out.write(str.toString());
    656         out.flush();
    657 *******/
    658        
    659         synchronized (_jobLock) {
    660             readyJobs = new ArrayList(_readyJobs);
    661             timedJobs = new ArrayList(_timedJobs);
    662         }
    663         //out.write("<!-- jobQueue rendering: after jobLock sync -->\n");
    664         //out.flush();
    665        
    666         StringBuilder buf = new StringBuilder(32*1024);
    667         buf.append("<b><div class=\"joblog\"><h3>I2P Job Queue</h3><div class=\"wideload\">Job runners: ").append(numRunners);
    668         //buf.append(" [states=");
    669         //if (states != null)
    670         //    for (int i = 0; i < states.length; i++)
    671         //        buf.append(states[i]).append(" ");
    672         //buf.append(']');
    673         buf.append("</b><br>\n");
    674 
    675         long now = _context.clock().now();
    676 
    677         buf.append("<hr><b>Active jobs: ").append(activeJobs.size()).append("</b><ol>\n");
    678         for (int i = 0; i < activeJobs.size(); i++) {
    679             Job j = activeJobs.get(i);
    680             buf.append("<li>[started ").append(DataHelper.formatDuration(now-j.getTiming().getStartAfter())).append(" ago]: ");
    681             buf.append(j.toString()).append("</li>\n");
    682         }
    683         buf.append("</ol>\n");
    684         buf.append("<hr><b>Just finished jobs: ").append(justFinishedJobs.size()).append("</b><ol>\n");
    685         for (int i = 0; i < justFinishedJobs.size(); i++) {
    686             Job j = justFinishedJobs.get(i);
    687             buf.append("<li>[finished ").append(DataHelper.formatDuration(now-j.getTiming().getActualEnd())).append(" ago]: ");
    688             buf.append(j.toString()).append("</li>\n");
    689         }
    690         buf.append("</ol>\n");
    691         buf.append("<hr><b>Ready/waiting jobs: ").append(readyJobs.size()).append("</b><ol>\n");
    692         for (int i = 0; i < readyJobs.size(); i++) {
    693             Job j = readyJobs.get(i);
    694             buf.append("<li>[waiting ");
    695             buf.append(DataHelper.formatDuration(now-j.getTiming().getStartAfter()));
    696             buf.append("]: ");
    697             buf.append(j.toString()).append("</li>\n");
    698         }
    699         buf.append("</ol>\n");
    700         out.flush();
    701 
    702         buf.append("<hr><b>Scheduled jobs: ").append(timedJobs.size()).append("</b><ol>\n");
    703         TreeMap<Long, Job> ordered = new TreeMap();
    704         for (int i = 0; i < timedJobs.size(); i++) {
    705             Job j = timedJobs.get(i);
    706             ordered.put(Long.valueOf(j.getTiming().getStartAfter()), j);
    707         }
    708         for (Iterator<Job> iter = ordered.values().iterator(); iter.hasNext(); ) {
    709             Job j = iter.next();
    710             long time = j.getTiming().getStartAfter() - now;
    711             buf.append("<li>").append(j.getName()).append(" in ");
    712             buf.append(DataHelper.formatDuration(time)).append("</li>\n");
    713         }
    714         buf.append("</ol></div>\n");
    715        
    716         //out.write("<!-- jobQueue rendering: after main buffer, before stats -->\n");
    717         out.flush();
    718        
    719         getJobStats(buf);
    720        
    721         //out.write("<!-- jobQueue rendering: after stats -->\n");
    722         out.flush();
    723        
    724         out.write(buf.toString());
    725     }
    726    
    727     /** render the HTML for the job stats */
    728     private void getJobStats(StringBuilder buf) {
    729         buf.append("<table>\n" +
    730                    "<tr><th>Job</th><th>Runs</th>" +
    731                    "<th>Time</th><th><i>Avg</i></th><th><i>Max</i></th><th><i>Min</i></th>" +
    732                    "<th>Pending</th><th><i>Avg</i></th><th><i>Max</i></th><th><i>Min</i></th></tr>\n");
    733         long totRuns = 0;
    734         long totExecTime = 0;
    735         long avgExecTime = 0;
    736         long maxExecTime = -1;
    737         long minExecTime = -1;
    738         long totPendingTime = 0;
    739         long avgPendingTime = 0;
    740         long maxPendingTime = -1;
    741         long minPendingTime = -1;
    742 
    743         TreeMap<String, JobStats> tstats = new TreeMap(_jobStats);
    744        
    745         for (Iterator<JobStats> iter = tstats.values().iterator(); iter.hasNext(); ) {
    746             JobStats stats = iter.next();
    747             buf.append("<tr>");
    748             buf.append("<td><b>").append(stats.getName()).append("</b></td>");
    749             buf.append("<td align=\"right\">").append(stats.getRuns()).append("</td>");
    750             buf.append("<td align=\"right\">").append(stats.getTotalTime()).append("</td>");
    751             buf.append("<td align=\"right\">").append(stats.getAvgTime()).append("</td>");
    752             buf.append("<td align=\"right\">").append(stats.getMaxTime()).append("</td>");
    753             buf.append("<td align=\"right\">").append(stats.getMinTime()).append("</td>");
    754             buf.append("<td align=\"right\">").append(stats.getTotalPendingTime()).append("</td>");
    755             buf.append("<td align=\"right\">").append(stats.getAvgPendingTime()).append("</td>");
    756             buf.append("<td align=\"right\">").append(stats.getMaxPendingTime()).append("</td>");
    757             buf.append("<td align=\"right\">").append(stats.getMinPendingTime()).append("</td>");
    758             buf.append("</tr>\n");
    759             totRuns += stats.getRuns();
    760             totExecTime += stats.getTotalTime();
    761             if (stats.getMaxTime() > maxExecTime)
    762                 maxExecTime = stats.getMaxTime();
    763             if ( (minExecTime < 0) || (minExecTime > stats.getMinTime()) )
    764                 minExecTime = stats.getMinTime();
    765             totPendingTime += stats.getTotalPendingTime();
    766             if (stats.getMaxPendingTime() > maxPendingTime)
    767                 maxPendingTime = stats.getMaxPendingTime();
    768             if ( (minPendingTime < 0) || (minPendingTime > stats.getMinPendingTime()) )
    769                 minPendingTime = stats.getMinPendingTime();
    770         }
    771 
    772         if (totRuns != 0) {
    773             if (totExecTime != 0)
    774                 avgExecTime = totExecTime / totRuns;
    775             if (totPendingTime != 0)
    776                 avgPendingTime = totPendingTime / totRuns;
    777         }
    778 
    779         buf.append("<tr class=\"tablefooter\">");
    780         buf.append("<td><b>").append("SUMMARY").append("</b></td>");
    781         buf.append("<td align=\"right\">").append(totRuns).append("</td>");
    782         buf.append("<td align=\"right\">").append(totExecTime).append("</td>");
    783         buf.append("<td align=\"right\">").append(avgExecTime).append("</td>");
    784         buf.append("<td align=\"right\">").append(maxExecTime).append("</td>");
    785         buf.append("<td align=\"right\">").append(minExecTime).append("</td>");
    786         buf.append("<td align=\"right\">").append(totPendingTime).append("</td>");
    787         buf.append("<td align=\"right\">").append(avgPendingTime).append("</td>");
    788         buf.append("<td align=\"right\">").append(maxPendingTime).append("</td>");
    789         buf.append("<td align=\"right\">").append(minPendingTime).append("</td>");
    790         buf.append("</tr></table></div>\n");
    791654    }
    792655}
  • router/java/src/net/i2p/router/JobStats.java

    r3882e49 r640782a  
    33import net.i2p.data.DataHelper;
    44
    5 /** glorified struct to contain basic job stats */
    6 class JobStats {
     5/**
     6 *  Glorified struct to contain basic job stats.
     7 *  Public for router console only.
     8 */
     9public class JobStats {
    710    private final String _job;
    811    private volatile long _numRuns;
Note: See TracChangeset for help on using the changeset viewer.