// PerformanceConcurrency_p.java
// -----------------------
// part of YaCy
// (C) by Michael Peter Christen; mc@yacy.net
// first published on http:// www.yacy.net
// Frankfurt, Germany, 19.12.2008
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
import java.util.Iterator;
import net.yacy.cora.protocol.RequestHeader;
import net.yacy.kelondro.workflow.WorkflowProcessor;
import net.yacy.server.serverObjects;
import net.yacy.server.serverSwitch;
public class PerformanceConcurrency_p {
public static serverObjects respond(@SuppressWarnings("unused") final RequestHeader header, @SuppressWarnings("unused") final serverObjects post, @SuppressWarnings("unused") final serverSwitch sb) {
// return variable that accumulates replacements
final serverObjects prop = new serverObjects();
// calculate totals
long blocktime_total = 0, exectime_total = 0, passontime_total = 0;
Iterator<WorkflowProcessor<?>> threads = WorkflowProcessor.processes();
WorkflowProcessor<?> p;
while (threads.hasNext()) {
p = threads.next();
blocktime_total += p.getBlockTime();
exectime_total += p.getExecTime();
passontime_total += p.getPassOnTime();
}
if (blocktime_total == 0) blocktime_total = 1;
if (exectime_total == 0) exectime_total = 1;
if (passontime_total == 0) passontime_total = 1;
// set templates for latest news from the threads
long blocktime, exectime, passontime;
threads = WorkflowProcessor.processes();
int c = 0;
long cycles;
while (threads.hasNext()) {
p = threads.next();
cycles = p.getExecCount();
if (cycles == 0) cycles = 1; // avoid division by zero
// set values to templates
prop.put("table_" + c + "_threadname", p.getName());
prop.putHTML("table_" + c + "_longdescr", p.getDescription());
prop.put("table_" + c + "_queuesize", p.getQueueSize());
prop.put("table_" + c + "_queuesizemax", p.getMaxQueueSize());
prop.put("table_" + c + "_concurrency", p.getMaxConcurrency());
prop.put("table_" + c + "_executors", p.getExecutors());
prop.putHTML("table_" + c + "_childs", p.getChilds());
blocktime = p.getBlockTime();
exectime = p.getExecTime();
passontime = p.getPassOnTime();
prop.putNum("table_" + c + "_blockreadtime", blocktime / cycles);
prop.putNum("table_" + c + "_blockreadpercent", 100 * blocktime / blocktime_total);
prop.putNum("table_" + c + "_exectime", exectime / cycles);
prop.putNum("table_" + c + "_execpercent", 100 * exectime / exectime_total);
prop.putNum("table_" + c + "_blockwritetime", passontime / cycles);
prop.putNum("table_" + c + "_blockwritepercent", 100 * passontime / passontime_total);
prop.putNum("table_" + c + "_totalcycles", p.getExecCount());
// set a color for the line to show problems
boolean problem = false;
boolean warning = false;
if (p.getQueueSize() == p.getMaxQueueSize()) problem = true;
if (p.getQueueSize() > p.getMaxQueueSize() * 8 / 10) warning = true;
if (100 * blocktime / blocktime_total > 80) warning = true;
if (100 * exectime / exectime_total > 80) warning = true;
if (100 * passontime / passontime_total > 80) warning = true;
prop.put("table_" + c + "_class", (!warning && !problem) ? 0 : (!problem) ? 1 : 2);
c++;
}
prop.put("table", c);
// return rewrite values for templates
return prop;
}
}