You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by de...@apache.org on 2013/12/10 21:31:09 UTC
svn commit: r1549958 - in
/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server:
DuccAbstractHandler.java DuccHandlerClassic.java DuccHandlerJsonFormat.java
Author: degenaro
Date: Tue Dec 10 20:31:08 2013
New Revision: 1549958
URL: http://svn.apache.org/r1549958
Log:
UIMA-3494 DUCC better hovers for Duration column on Job page
Modified:
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java?rev=1549958&r1=1549957&r2=1549958&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java Tue Dec 10 20:31:08 2013
@@ -21,10 +21,11 @@ package org.apache.uima.ducc.ws.server;
import java.io.File;
import java.text.DecimalFormat;
import java.util.ArrayList;
-import java.util.Calendar;
import java.util.List;
import java.util.ListIterator;
+import java.util.Map.Entry;
import java.util.Properties;
+import java.util.concurrent.ConcurrentSkipListMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -35,23 +36,26 @@ import org.apache.uima.ducc.cli.ws.json.
import org.apache.uima.ducc.common.NodeIdentity;
import org.apache.uima.ducc.common.boot.DuccDaemonRuntimeProperties.DaemonName;
import org.apache.uima.ducc.common.internationalization.Messages;
+import org.apache.uima.ducc.common.jd.files.IWorkItemState;
+import org.apache.uima.ducc.common.jd.files.IWorkItemState.State;
+import org.apache.uima.ducc.common.jd.files.WorkItemStateManager;
import org.apache.uima.ducc.common.utils.DuccLogger;
import org.apache.uima.ducc.common.utils.DuccLoggerComponents;
import org.apache.uima.ducc.common.utils.TimeStamp;
import org.apache.uima.ducc.common.utils.Utils;
import org.apache.uima.ducc.common.utils.id.DuccId;
import org.apache.uima.ducc.orchestrator.authentication.DuccWebAdministrators;
+import org.apache.uima.ducc.transport.event.common.IDuccCompletionType.JobCompletionType;
import org.apache.uima.ducc.transport.event.common.IDuccPerWorkItemStatistics;
import org.apache.uima.ducc.transport.event.common.IDuccProcess;
import org.apache.uima.ducc.transport.event.common.IDuccProcessMap;
import org.apache.uima.ducc.transport.event.common.IDuccSchedulingInfo;
-import org.apache.uima.ducc.transport.event.common.IRationale;
-import org.apache.uima.ducc.transport.event.common.IDuccCompletionType.JobCompletionType;
import org.apache.uima.ducc.transport.event.common.IDuccTypes.DuccType;
import org.apache.uima.ducc.transport.event.common.IDuccUnits.MemoryUnits;
import org.apache.uima.ducc.transport.event.common.IDuccWork;
import org.apache.uima.ducc.transport.event.common.IDuccWorkJob;
import org.apache.uima.ducc.transport.event.common.IDuccWorkReservation;
+import org.apache.uima.ducc.transport.event.common.IRationale;
import org.apache.uima.ducc.ws.DuccDataHelper;
import org.apache.uima.ducc.ws.DuccMachinesData;
import org.apache.uima.ducc.ws.JobProcessInfo;
@@ -763,6 +767,52 @@ public abstract class DuccAbstractHandle
return retVal;
}
+ private double getWorkItemLeastOperatingMillis(HttpServletRequest request, IDuccWorkJob job) {
+ String methodName = "getWorkItemLeastDoneOperatingMillis";
+ double retVal = 0;
+ try {
+ String jobNo = job.getId();
+ String userId = job.getStandardInfo().getUser();
+ String jobDir = job.getLogDirectory()+jobNo;
+ WorkItemStateManager workItemStateManager = new WorkItemStateManager(jobDir);
+ workItemStateManager.importData(userId);
+ ConcurrentSkipListMap<Long,IWorkItemState> map = workItemStateManager.getMap();
+ if( (map == null) || (map.size() == 0) ) {
+ // nada
+ }
+ else {
+ double smallest = 0;
+ ConcurrentSkipListMap<IWorkItemState,IWorkItemState> sortedMap = new ConcurrentSkipListMap<IWorkItemState,IWorkItemState>();
+ for (Entry<Long, IWorkItemState> entry : map.entrySet()) {
+ IWorkItemState wis = entry.getValue();
+ State state;
+ double time;
+ state = wis.getState();
+ switch(state) {
+ case operating:
+ time = wis.getMillisProcessing();
+ if(smallest == 0) {
+ smallest = time;
+ //duccLogger.info(methodName, job.getDuccId(), wis.getWiId()+" "+time+" "+time/1000);
+ }
+ else {
+ if(time < smallest) {
+ smallest = time;
+ //duccLogger.info(methodName, job.getDuccId(), wis.getWiId()+" "+time+" "+time/1000);
+ }
+ }
+ }
+ }
+ retVal = smallest;
+
+ }
+ }
+ catch(Throwable t) {
+ duccLogger.trace(methodName, null, "no worries", t);
+ }
+ return retVal;
+ }
+
public String getProjection(HttpServletRequest request, IDuccWorkJob job) {
String methodName = "getProjection";
String retVal = "";
@@ -785,11 +835,13 @@ public abstract class DuccAbstractHandle
double remainingIterations = remainingWorkItems / totalThreads;
double avgMillis = perWorkItemStatistics.getMean();
double projectedTime = 0;
+ double leastOperatingMillis = getWorkItemLeastOperatingMillis(request, job);
if(remainingIterations > 0) {
- projectedTime = avgMillis * remainingIterations;
+ projectedTime = avgMillis * remainingIterations - leastOperatingMillis;
}
else {
- projectedTime = avgMillis - (Calendar.getInstance().getTimeInMillis() - job.getSchedulingInfo().getMostRecentWorkItemStart());
+ //projectedTime = avgMillis - (Calendar.getInstance().getTimeInMillis() - job.getSchedulingInfo().getMostRecentWorkItemStart());
+ projectedTime = avgMillis - leastOperatingMillis;
}
if(projectedTime > 0) {
long millis = Math.round(projectedTime);
@@ -806,15 +858,51 @@ public abstract class DuccAbstractHandle
}
return retVal;
}
+
+ public double getAvgMillisPerWorkItem(HttpServletRequest request, IDuccWorkJob job) {
+ double avgMillis = 0;
+ IDuccSchedulingInfo schedulingInfo = job.getSchedulingInfo();
+ IDuccPerWorkItemStatistics perWorkItemStatistics = schedulingInfo.getPerWorkItemStatistics();
+ if (perWorkItemStatistics != null) {
+ avgMillis = perWorkItemStatistics.getMean();
+ }
+ return avgMillis;
+ }
public String decorateDuration(HttpServletRequest request, IDuccWorkJob job, String duration) {
+ String location = "decorateDuration";
String retVal = duration;
- String cVal = getCompletion(request,job);
- if(cVal != null) {
- if(cVal.length() > 0) {
- String title = "title=\""+"End="+cVal+"\"";
- retVal = "<span "+title+">"+duration+"</span>";
+ DuccId duccId = job.getDuccId();
+ try {
+ StringBuffer title = new StringBuffer();
+ double avgMillisPerWorkItem = getAvgMillisPerWorkItem(request, job);
+ if(avgMillisPerWorkItem > 0) {
+ if(avgMillisPerWorkItem < 500) {
+ avgMillisPerWorkItem = 500;
+ }
}
+ int iAvgMillisPerWorkItem = (int)avgMillisPerWorkItem;
+ if(iAvgMillisPerWorkItem > 0) {
+ if(title.length() > 0) {
+ title.append("; ");
+ }
+ title.append("Time (ddd:hh:mm:ss) elapsed for job, average processing time per work item="+FormatHelper.duration(iAvgMillisPerWorkItem));
+ }
+ String cVal = getCompletion(request,job);
+ if(cVal != null) {
+ if(cVal.length() > 0) {
+ if(title.length() > 0) {
+ title.append("; ");
+ }
+ title.append("End="+cVal);
+ }
+ }
+ if(title.length() > 0) {
+ retVal = "<span "+"title=\""+title+"\""+">"+duration+"</span>";
+ }
+ }
+ catch(Exception e) {
+ duccLogger.error(location, duccId, e);
}
return retVal;
}
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java?rev=1549958&r1=1549957&r2=1549958&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java Tue Dec 10 20:31:08 2013
@@ -134,12 +134,14 @@ public class DuccHandlerClassic extends
else {
String duration = getDuration(request,job,now);
String decoratedDuration = decorateDuration(request,job, duration);
- String projection = getProjection(request,job);
sb.append("<span class=\"health_green\""+">");
sb.append(decoratedDuration);
sb.append("</span>");
+ String projection = getProjection(request,job);
if(projection.length() > 0) {
- sb.append("+"+"<span title=\"projected time to completion\"><i>"+projection+"</i></span>");
+ String health = "class=\"health_yellow\"";
+ String title = "title=\"Time (ddd:hh:mm:ss) to completion, based on average processing time per work item\"";
+ sb.append("+"+"<span "+health+" "+title+"><i>"+projection+"</i></span>");
}
}
sb.append("</td>");
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java?rev=1549958&r1=1549957&r2=1549958&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java Tue Dec 10 20:31:08 2013
@@ -155,12 +155,14 @@ public class DuccHandlerJsonFormat exten
else {
String duration = getDuration(request,job,now);
String decoratedDuration = decorateDuration(request,job, duration);
- String projection = getProjection(request,job);
sb.append("<span class=\"health_green\""+">");
sb.append(decoratedDuration);
sb.append("</span>");
+ String projection = getProjection(request,job);
if(projection.length() > 0) {
- sb.append("+"+"<span title=\"projected time to completion\"><i>"+projection+"</i></span>");
+ String health = "class=\"health_yellow\"";
+ String title = "title=\"Time (ddd:hh:mm:ss) to completion, based on average processing time per work item\"";
+ sb.append("+"+"<span "+health+" "+title+"><i>"+projection+"</i></span>");
}
}
row.add(new JsonPrimitive(sb.toString()));