in uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java [125:482]
private void buildJobsListEntry(HttpServletRequest request, StringBuffer sb, DuccId duccId, IDuccWorkJob job, DuccData duccData, long now, ServicesRegistry servicesRegistry) {
EffectiveUser eu = EffectiveUser.create(request);
String id = normalize(duccId);
// Terminate
sb.append("<td valign=\"bottom\" class=\"ducc-col-terminate\">");
if(terminateEnabled) {
if(!job.isFinished()) {
sb.append("<input type=\"button\" onclick=\"ducc_confirm_terminate_job("+id+")\" value=\"Terminate\" "+getDisabledWithHover(request,job)+"/>");
}
}
sb.append("</td>");
// Id
sb.append("<td valign=\"bottom\">");
sb.append("<a href=\"job.details.html?id="+id+"\">"+id+"</a>");
sb.append("</td>");
// Start
sb.append("<td valign=\"bottom\">");
sb.append("<span title=\""+DuccConstants.hintPreferencesDateStyle+"\">");
sb.append(getTimeStamp(request,job.getDuccId(), job.getStandardInfo().getDateOfSubmission()));
sb.append("</span>");
sb.append("</td>");
// Duration
sb.append("<td valign=\"bottom\" align=\"right\">");
if(job.isCompleted()) {
String duration = getDuration(request,job, Precision.Whole);
String decoratedDuration = decorateDuration(request,job,duration,Precision.Whole);
sb.append("<span>");
sb.append(decoratedDuration);
sb.append("</span>");
}
else {
String duration = getDuration(request,job,now,Precision.Whole);
String decoratedDuration = decorateDuration(request,job,duration,Precision.Whole);
sb.append("<span class=\"health_green\""+">");
sb.append(decoratedDuration);
sb.append("</span>");
String projection = getProjection(request,job,Precision.Whole);
sb.append(projection);
}
sb.append("</td>");
// User
String title = "";
String submitter = job.getStandardInfo().getSubmitter();
if(submitter != null) {
title = "title=\"submitter PID@host: "+submitter+"\" ";
}
sb.append("<td "+title+"valign=\"bottom\">");
sb.append(job.getStandardInfo().getUser());
sb.append("</td>");
// Class
sb.append("<td valign=\"bottom\">");
String schedulingClass = stringNormalize(job.getSchedulingInfo().getSchedulingClass(),messages.fetch("default"));
long debugPortDriver = job.getDebugPortDriver();
long debugPortProcess = job.getDebugPortProcess();
title = "debug ports:";
if(debugPortDriver >= 0) {
title = title + " driver="+debugPortDriver;
}
if(debugPortProcess >= 0) {
title = title + " process="+debugPortProcess;
}
switch(DuccCookies.getDisplayStyle(request)) {
case Textual:
default:
sb.append(schedulingClass);
if((debugPortDriver >= 0) || (debugPortProcess >= 0)) {
sb.append("<br>");
if(job.isCompleted()) {
sb.append("<span class=\"health_red\""+">");
}
else {
sb.append("<span class=\"health_green\""+">");
}
sb.append("<div title=\""+title+"\">DEBUG</div>");
sb.append("</span>");
}
break;
case Visual:
// Below
String key = "bug";
String bugFile = DuccWebServerHelper.getImageFileName(key);
sb.append(schedulingClass);
if((debugPortDriver >= 0) || (debugPortProcess >= 0)) {
sb.append("<br>");
if(job.isCompleted()) {
sb.append("<span class=\"health_red\""+">");
}
else {
sb.append("<span class=\"health_green\""+">");
}
if(bugFile != null) {
sb.append("<div title=\""+title+"\"><img src=\""+bugFile+"\"></div>");
}
sb.append("</span>");
}
break;
}
sb.append("</td>");
// State
sb.append("<td valign=\"bottom\">");
if(duccData.isLive(duccId)) {
if(job.isOperational()) {
sb.append("<span class=\"active_state\">");
}
else {
sb.append("<span class=\"completed_state\">");
}
}
else {
sb.append("<span class=\"historic_state\">");
}
sb.append(job.getStateObject().toString());
if(duccData.isLive(duccId)) {
sb.append("</span>");
}
sb.append("</td>");
// Reason
String reason = getReason(job, MonitorType.Job).toString();
sb.append("<td valign=\"bottom\" align=\"right\">");
sb.append(reason);
sb.append("</td>");
// Services
sb.append("<td valign=\"bottom\" align=\"right\">");
sb.append(evaluateServices(job,servicesRegistry));
sb.append("</td>");
// Processes
sb.append("<td valign=\"bottom\" align=\"right\">");
if(duccData.isLive(duccId)) {
sb.append(job.getProcessMap().getAliveProcessCount());
}
else {
sb.append("0");
}
sb.append("</td>");
// Initialize Failures
sb.append("<td valign=\"bottom\" align=\"right\">");
long initFails = job.getProcessInitFailureCount();
if(initFails > 0) {
if(job.getSchedulingInfo().getLongProcessesMax() < 0) {
DisplayStyle style = DuccCookies.getDisplayStyle(request);
String key = "cap.small";
String capFile = DuccWebServerHelper.getImageFileName(key);
switch(style) {
case Visual:
if(capFile == null) {
style = DisplayStyle.Textual;
}
break;
default:
break;
}
switch(style) {
case Textual:
default:
sb.append(buildInitializeFailuresLink(job));
sb.append("<span title=\"capped at current number of running processes due to excessive initialization failures\">");
sb.append("<sup>");
sb.append("<small>");
sb.append("capped");
sb.append("</small>");
sb.append("<sup>");
sb.append("</span>");
sb.append("<br>");
break;
case Visual:
sb.append("<span title=\"capped at current number of running processes due to excessive initialization failures\">");
sb.append("<img src=\""+capFile+"\">");
sb.append("</span>");
sb.append("<br>");
sb.append(buildInitializeFailuresLink(job));
break;
}
}
else {
sb.append(buildInitializeFailuresLink(job));
}
}
else {
sb.append(""+initFails);
}
sb.append("</td>");
// Runtime Failures
sb.append("<td valign=\"bottom\" align=\"right\">");
sb.append(buildRuntimeFailuresLink(job));
sb.append("</td>");
// Pgin
sb.append("<td valign=\"bottom\" align=\"right\">");
long faults = 0;
try {
faults = job.getPgInCount();
}
catch(Exception e) {
}
int ifaults = (int)faults;
switch(ifaults) {
case -3: // (some do and some don't have cgroups) but retVal would have been > 0
sb.append("<span title=\"incomplete\" class=\"health_red\""+">");
sb.append(inc);
break;
case -2: // (some do and some don't have cgroups) but retVal would have been == 0
sb.append("<span title=\"incomplete\" class=\"health_black\""+">");
sb.append(inc);
break;
case -1: // (none have cgroups)
sb.append("<span title=\"not available\" class=\"health_black\""+">");
sb.append(notAvailable);
break;
default: // (all have cgroups)
double swapping = job.getSwapUsageGbMax();
if((swapping * faults) > 0) {
sb.append("<span class=\"health_red\""+">");
}
else {
sb.append("<span class=\"health_black\""+">");
}
sb.append(faults);
break;
}
sb.append("</span>");
sb.append("</td>");
// Swap
sb.append("<td valign=\"bottom\" align=\"right\">");
String swapSizeDisplay = "";
String swapSizeHover = "";
title = "";
double swap = 0;
if(job.isCompleted()) {
swap = job.getSwapUsageGbMax();
}
else {
swap = job.getSwapUsageGb();
}
int iswap = (int)swap;
switch(iswap) {
case -3: // (some do and some don't have cgroups) but retVal would have been > 0
sb.append("<span title=\"incomplete\" class=\"health_red\""+">");
sb.append(inc);
break;
case -2: // (some do and some don't have cgroups) but retVal would have been == 0
sb.append("<span title=\"incomplete\" class=\"health_black\""+">");
sb.append(inc);
break;
case -1: // (none have cgroups)
sb.append("<span title=\"not available\" class=\"health_black\""+">");
sb.append(notAvailable);
break;
default: // (all have cgroups)
double swapBytes = swap*DuccHandlerUtils.GB;
swapSizeDisplay = DuccHandlerUtils.getSwapSizeDisplay(swapBytes);
swapSizeHover = DuccHandlerUtils.getSwapSizeHover(swapBytes);
title = "title="+"\""+swapSizeHover+"\"";
if(swapBytes > 0) {
sb.append("<span "+title+" "+"class=\"health_red\""+">");
}
else {
sb.append("<span "+title+" "+"class=\"health_black\""+">");
}
sb.append(swapSizeDisplay);
break;
}
sb.append("</span>");
sb.append("</td>");
// Memory
IDuccSchedulingInfo si;
SizeBytes sizeBytes;
String requested;
String actual;
si = job.getSchedulingInfo();
sizeBytes = new SizeBytes(SizeBytes.Type.Bytes, si.getMemorySizeAllocatedInBytes());
actual = getProcessMemorySize(duccId,sizeBytes);
sizeBytes = new SizeBytes(si.getMemoryUnits().name(), Long.parseLong(si.getMemorySizeRequested()));
requested = getProcessMemorySize(duccId,sizeBytes);
sb.append("<td valign=\"bottom\" align=\"right\">");
sb.append("<span title=\""+"requested: "+requested+"\">");
sb.append(actual);
sb.append("</span>");
sb.append("</td>");
// Total
sb.append("<td valign=\"bottom\" align=\"right\">");
sb.append(job.getSchedulingInfo().getWorkItemsTotal());
sb.append("</td>");
// Done
sb.append("<td valign=\"bottom\" align=\"right\">");
IDuccPerWorkItemStatistics perWorkItemStatistics = job.getSchedulingInfo().getPerWorkItemStatistics();
String done = job.getSchedulingInfo().getWorkItemsCompleted();
if (perWorkItemStatistics != null) {
double max = Math.round(perWorkItemStatistics.getMax()/100.0)/10.0;
double min = Math.round(perWorkItemStatistics.getMin()/100.0)/10.0;
double avg = Math.round(perWorkItemStatistics.getMean()/100.0)/10.0;
double dev = Math.round(perWorkItemStatistics.getStandardDeviation()/100.0)/10.0;
done = "<span title=\""+"seconds-per-work-item "+"Max:"+max+" "+"Min:"+min+" "+"Avg:"+avg+" "+"StdDev:"+dev+"\""+">"+done+"</span>";
}
sb.append(done);
sb.append("</td>");
// Error
sb.append("<td valign=\"bottom\" align=\"right\">");
sb.append(buildErrorLink(eu,job));
sb.append("</td>");
// Dispatch
sb.append("<td valign=\"bottom\" align=\"right\">");
String d0 = "<span>";
String d1 = "0";
String d2 = "</span>";
if(duccData.isLive(duccId)) {
int dispatch = 0;
int unassigned = job.getSchedulingInfo().getCasQueuedMap().size();
try {
dispatch = Integer.parseInt(job.getSchedulingInfo().getWorkItemsDispatched())-unassigned;
}
catch(Exception e) {
}
if(dispatch < 0) {
d0 = "<span class=\"health_red\""+" title=\"unassigned location count: "+(0-dispatch)+"\">";
//d1 = "0";
}
else {
d1 = ""+dispatch;
}
}
sb.append(d0);
sb.append(d1);
sb.append(d2);
sb.append("</td>");
// Retry
sb.append("<td valign=\"bottom\" align=\"right\">");
sb.append(job.getSchedulingInfo().getWorkItemsRetry());
sb.append("</td>");
// Preempt
sb.append("<td valign=\"bottom\" align=\"right\">");
sb.append(job.getSchedulingInfo().getWorkItemsPreempt());
sb.append("</td>");
// Description
sb.append("<td valign=\"bottom\">");
String description = stringNormalize(job.getStandardInfo().getDescription(),messages.fetch("none"));
switch(DuccCookies.getDescriptionStyle(request)) {
case Long:
default:
sb.append("<span title=\""+DuccConstants.hintPreferencesDescriptionStyleShort+"\">");
sb.append(description);
sb.append("</span>");
break;
case Short:
String shortDescription = getShortDescription(description);
if(shortDescription == null) {
sb.append("<span>");
sb.append(description);
sb.append("</span>");
}
else {
sb.append("<span title=\""+description+"\">");
sb.append(shortDescription);
sb.append("</span>");
}
break;
}
sb.append("</td>");
sb.append("</tr>");
}