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/03/19 17:00:01 UTC
svn commit: r1458366 - in
/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main:
java/org/apache/uima/ducc/ws/server/ webapp/root/
Author: degenaro
Date: Tue Mar 19 16:00:00 2013
New Revision: 1458366
URL: http://svn.apache.org/r1458366
Log:
UIMA-2732 DUCC support for monitoring of Managed Reservations, WS enhancements
Added:
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitorJob.java
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitorManagedReservation.java
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/DuccHandlerJsonFormat.java
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerLegacy.java
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerProxy.java
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitor.java
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/reservations.jsp
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=1458366&r1=1458365&r2=1458366&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 Mar 19 16:00:00 2013
@@ -896,10 +896,10 @@ public abstract class DuccAbstractHandle
return retVal;
}
- protected String getMonitor(DuccId duccId, boolean multi) {
+ protected String getMonitor(DuccId duccId, DuccType type, boolean multi) {
StringBuffer sb = new StringBuffer();
DuccWebMonitor duccWebMonitor = DuccWebMonitor.getInstance();
- Long expiry = duccWebMonitor.getExpiry(DuccType.Job, duccId);
+ Long expiry = duccWebMonitor.getExpiry(type, duccId);
if(!duccWebMonitor.isAutoCancelEnabled()) {
if(expiry != null) {
String text = "webserver not primary";
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=1458366&r1=1458365&r2=1458366&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 Mar 19 16:00:00 2013
@@ -58,7 +58,9 @@ import org.apache.uima.ducc.transport.ev
import org.apache.uima.ducc.transport.event.common.IDuccReservation;
import org.apache.uima.ducc.transport.event.common.IDuccReservationMap;
import org.apache.uima.ducc.transport.event.common.IDuccState.ReservationState;
+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.IDuccProcess;
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.IRationale;
@@ -110,6 +112,74 @@ public class DuccHandlerJsonFormat exten
return dir_home+File.separator+dir_resources+File.separator+getDuccWebServer().getClassDefinitionFile();
}
+ private StringBuffer getReason(IDuccWorkJob job, DuccType type) {
+ StringBuffer sb = new StringBuffer();
+ if(job != null) {
+ DuccId duccId = job.getDuccId();
+ sb = new StringBuffer();
+ if(job.isOperational()) {
+ boolean multi = false;
+ sb.append("<span>");
+ ArrayList<String> swappingMachines = getSwappingMachines(job);
+ if(!swappingMachines.isEmpty()) {
+ StringBuffer mb = new StringBuffer();
+ for(String machine : swappingMachines) {
+ mb.append(machine);
+ mb.append(" ");
+ }
+ String ml = mb.toString().trim();
+ if(multi) {
+ sb.append(" ");
+ }
+ multi = true;
+ sb.append("<span class=\"health_red\" title=\""+ml+"\">");
+ sb.append("Swapping");
+ sb.append("</span>");
+ }
+ sb.append("</span>");
+ //
+ String monitor = getMonitor(duccId, type, multi);
+ if(monitor.length() > 0) {
+ multi = true;
+ sb.append(monitor);
+ }
+ }
+ else if(job.isCompleted()) {
+ JobCompletionType jobCompletionType = job.getCompletionType();
+ switch(jobCompletionType) {
+ case EndOfJob:
+ try {
+ int total = job.getSchedulingInfo().getIntWorkItemsTotal();
+ int done = job.getSchedulingInfo().getIntWorkItemsCompleted();
+ int error = job.getSchedulingInfo().getIntWorkItemsError();
+ if(total != (done+error)) {
+ jobCompletionType = JobCompletionType.Premature;
+ }
+ }
+ catch(Exception e) {
+ }
+ sb.append("<span>");
+ break;
+ case Undefined:
+ sb.append("<span>");
+ break;
+ default:
+ IRationale rationale = job.getCompletionRationale();
+ if(rationale != null) {
+ sb.append("<span title=\""+rationale+"\">");
+ }
+ else {
+ sb.append("<span>");
+ }
+ break;
+ }
+ sb.append(jobCompletionType);
+ sb.append("</span>");
+ }
+ }
+ return sb;
+ }
+
private JsonArray buildJobRow(HttpServletRequest request, IDuccWorkJob job, DuccData duccData, ServicesRegistry servicesRegistry) {
String type="Job";
JsonArray row = new JsonArray();
@@ -179,66 +249,7 @@ public class DuccHandlerJsonFormat exten
sb.append("</span>");
row.add(new JsonPrimitive(sb.toString()));
// Reason
- sb = new StringBuffer();
- if(job.isOperational()) {
- boolean multi = false;
- sb.append("<span>");
- ArrayList<String> swappingMachines = getSwappingMachines(job);
- if(!swappingMachines.isEmpty()) {
- StringBuffer mb = new StringBuffer();
- for(String machine : swappingMachines) {
- mb.append(machine);
- mb.append(" ");
- }
- String ml = mb.toString().trim();
- if(multi) {
- sb.append(" ");
- }
- multi = true;
- sb.append("<span class=\"health_red\" title=\""+ml+"\">");
- sb.append("Swapping");
- sb.append("</span>");
- }
- sb.append("</span>");
- //
- String monitor = getMonitor(duccId, multi);
- if(monitor.length() > 0) {
- multi = true;
- sb.append(monitor);
- }
- }
- else if(job.isCompleted()) {
- JobCompletionType jobCompletionType = job.getCompletionType();
- switch(jobCompletionType) {
- case EndOfJob:
- try {
- int total = job.getSchedulingInfo().getIntWorkItemsTotal();
- int done = job.getSchedulingInfo().getIntWorkItemsCompleted();
- int error = job.getSchedulingInfo().getIntWorkItemsError();
- if(total != (done+error)) {
- jobCompletionType = JobCompletionType.Premature;
- }
- }
- catch(Exception e) {
- }
- sb.append("<span>");
- break;
- case Undefined:
- sb.append("<span>");
- break;
- default:
- IRationale rationale = job.getCompletionRationale();
- if(rationale != null) {
- sb.append("<span title=\""+rationale+"\">");
- }
- else {
- sb.append("<span>");
- }
- break;
- }
- sb.append(jobCompletionType);
- sb.append("</span>");
- }
+ sb = getReason(job,DuccType.Job);
row.add(new JsonPrimitive(sb.toString()));
// Services
sb = new StringBuffer();
@@ -667,56 +678,9 @@ public class DuccHandlerJsonFormat exten
}
}
else if(duccwork instanceof DuccWorkJob) {
+ // Reason
DuccWorkJob job = (DuccWorkJob) duccwork;
- switch(job.getCompletionType()) {
- case Undefined:
- break;
- case CanceledByUser:
- case CanceledByAdministrator:
- try {
- String cancelUser = duccwork.getStandardInfo().getCancelUser();
- if(cancelUser != null) {
- sb.append("<span title=\"canceled by "+cancelUser+"\">");
- sb.append(duccwork.getCompletionTypeObject().toString());
- sb.append("</span>");
- }
- else {
- IRationale rationale = job.getCompletionRationale();
- if(rationale != null) {
- sb.append("<span title=\""+rationale+"\">");
- sb.append(duccwork.getCompletionTypeObject().toString());
- sb.append("</span>");
- }
- else {
- sb.append(duccwork.getCompletionTypeObject().toString());
- }
-
- }
- }
- catch(Exception e) {
- IRationale rationale = job.getCompletionRationale();
- if(rationale != null) {
- sb.append("<span title=\""+rationale+"\">");
- sb.append(duccwork.getCompletionTypeObject().toString());
- sb.append("</span>");
- }
- else {
- sb.append(duccwork.getCompletionTypeObject().toString());
- }
- }
- break;
- default:
- IRationale rationale = job.getCompletionRationale();
- if(rationale != null) {
- sb.append("<span title=\""+rationale+"\">");
- sb.append(duccwork.getCompletionTypeObject().toString());
- sb.append("</span>");
- }
- else {
- sb.append(duccwork.getCompletionTypeObject().toString());
- }
- break;
- }
+ sb = getReason(job,DuccType.Reservation);
}
row.add(new JsonPrimitive(sb.toString()));
// Allocation
@@ -787,6 +751,13 @@ public class DuccHandlerJsonFormat exten
else {
sb.append("0");
}
+ Iterator<DuccId> iterator = job.getProcessMap().keySet().iterator();
+ while(iterator.hasNext()) {
+ DuccId processId = iterator.next();
+ IDuccProcess process = job.getProcessMap().get(processId);
+ String node = process.getNodeIdentity().getName();
+ nodeMap.put(node, 1);
+ }
}
row.add(new JsonPrimitive(sb.toString()));
// Size
@@ -801,13 +772,30 @@ public class DuccHandlerJsonFormat exten
sb = new StringBuffer();
sb.append("<span>");
if(!nodeMap.isEmpty()) {
- sb.append("<select>");
+ boolean useList = false;
+ if(nodeMap.size() > 1) {
+ useList = true;
+ }
+ if(useList) {
+ sb.append("<select>");
+ }
for (String node: nodeMap.keySet()) {
+ String option = node;
Integer count = nodeMap.get(node);
- String option = node+" "+"["+count+"]";
- sb.append("<option>"+option+"</option>");
+ if(count > 1) {
+ option += " "+"["+count+"]";
+ }
+ if(useList) {
+ sb.append("<option>");
+ }
+ sb.append(option);
+ if(useList) {
+ sb.append("</option>");
+ }
+ }
+ if(useList) {
+ sb.append("</select>");
}
- sb.append("</select>");
}
sb.append("</span>");
row.add(new JsonPrimitive(sb.toString()));
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerLegacy.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerLegacy.java?rev=1458366&r1=1458365&r2=1458366&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerLegacy.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerLegacy.java Tue Mar 19 16:00:00 2013
@@ -49,7 +49,9 @@ import org.apache.uima.ducc.transport.ev
import org.apache.uima.ducc.transport.event.common.IDuccCompletionType.JobCompletionType;
import org.apache.uima.ducc.transport.event.common.IDuccReservation;
import org.apache.uima.ducc.transport.event.common.IDuccReservationMap;
+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.IDuccProcess;
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.IRationale;
@@ -95,6 +97,73 @@ public class DuccHandlerLegacy extends D
return dir_home+File.separator+dir_resources+File.separator+getDuccWebServer().getClassDefinitionFile();
}
+ private String getReason(IDuccWorkJob job, DuccType type) {
+ StringBuffer sb = new StringBuffer();
+ if(job != null) {
+ DuccId duccId = job.getDuccId();
+ if(job.isOperational()) {
+ boolean multi = false;
+ sb.append("<td valign=\"bottom\">");
+ ArrayList<String> swappingMachines = getSwappingMachines(job);
+ if(!swappingMachines.isEmpty()) {
+ StringBuffer mb = new StringBuffer();
+ for(String machine : swappingMachines) {
+ mb.append(machine);
+ mb.append(" ");
+ }
+ String ml = mb.toString().trim();
+ if(multi) {
+ sb.append(" ");
+ }
+ multi = true;
+ sb.append("<span class=\"health_red\" title=\""+ml+"\">");
+ sb.append("Swapping");
+ sb.append("</span>");
+ }
+ //
+ String monitor = getMonitor(duccId, type, multi);
+ if(monitor.length() > 0) {
+ multi = true;
+ sb.append(monitor);
+ }
+ sb.append("</td>");
+ }
+ else if(job.isCompleted()) {
+ JobCompletionType jobCompletionType = job.getCompletionType();
+ switch(jobCompletionType) {
+ case EndOfJob:
+ try {
+ int total = job.getSchedulingInfo().getIntWorkItemsTotal();
+ int done = job.getSchedulingInfo().getIntWorkItemsCompleted();
+ int error = job.getSchedulingInfo().getIntWorkItemsError();
+ if(total != (done+error)) {
+ jobCompletionType = JobCompletionType.Premature;
+ }
+ }
+ catch(Exception e) {
+ }
+ sb.append("<td valign=\"bottom\">");
+ break;
+ case Undefined:
+ sb.append("<td valign=\"bottom\">");
+ break;
+ default:
+ IRationale rationale = job.getCompletionRationale();
+ if(rationale != null) {
+ sb.append("<td valign=\"bottom\" title=\""+rationale+"\">");
+ }
+ else {
+ sb.append("<td valign=\"bottom\">");
+ }
+ break;
+ }
+ sb.append(jobCompletionType);
+ sb.append("</td>");
+ }
+ }
+ return sb.toString();
+ }
+
private void buildJobsListEntry(HttpServletRequest request, StringBuffer sb, DuccId duccId, IDuccWorkJob job, DuccData duccData, ServicesRegistry servicesRegistry) {
String type="Job";
String id = normalize(duccId);
@@ -159,65 +228,8 @@ public class DuccHandlerLegacy extends D
}
sb.append("</td>");
// Reason
- if(job.isOperational()) {
- boolean multi = false;
- sb.append("<td valign=\"bottom\">");
- ArrayList<String> swappingMachines = getSwappingMachines(job);
- if(!swappingMachines.isEmpty()) {
- StringBuffer mb = new StringBuffer();
- for(String machine : swappingMachines) {
- mb.append(machine);
- mb.append(" ");
- }
- String ml = mb.toString().trim();
- if(multi) {
- sb.append(" ");
- }
- multi = true;
- sb.append("<span class=\"health_red\" title=\""+ml+"\">");
- sb.append("Swapping");
- sb.append("</span>");
- }
- //
- String monitor = getMonitor(duccId, multi);
- if(monitor.length() > 0) {
- multi = true;
- sb.append(monitor);
- }
- sb.append("</td>");
- }
- else if(job.isCompleted()) {
- JobCompletionType jobCompletionType = job.getCompletionType();
- switch(jobCompletionType) {
- case EndOfJob:
- try {
- int total = job.getSchedulingInfo().getIntWorkItemsTotal();
- int done = job.getSchedulingInfo().getIntWorkItemsCompleted();
- int error = job.getSchedulingInfo().getIntWorkItemsError();
- if(total != (done+error)) {
- jobCompletionType = JobCompletionType.Premature;
- }
- }
- catch(Exception e) {
- }
- sb.append("<td valign=\"bottom\">");
- break;
- case Undefined:
- sb.append("<td valign=\"bottom\">");
- break;
- default:
- IRationale rationale = job.getCompletionRationale();
- if(rationale != null) {
- sb.append("<td valign=\"bottom\" title=\""+rationale+"\">");
- }
- else {
- sb.append("<td valign=\"bottom\">");
- }
- break;
- }
- sb.append(jobCompletionType);
- sb.append("</td>");
- }
+ String reason = getReason(job, DuccType.Job);
+ sb.append(reason);
// Services
sb.append("<td valign=\"bottom\" align=\"right\">");
sb.append(evaluateServices(job,servicesRegistry));
@@ -521,8 +533,8 @@ public class DuccHandlerLegacy extends D
}
sb.append("</td>");
// Reason
- sb.append("<td>");
if(duccwork instanceof DuccWorkReservation) {
+ sb.append("<td>");
DuccWorkReservation reservation = (DuccWorkReservation) duccwork;
switch(reservation.getCompletionType()) {
case Undefined:
@@ -573,60 +585,13 @@ public class DuccHandlerLegacy extends D
}
break;
}
+ sb.append("</td>");
}
else if(duccwork instanceof DuccWorkJob) {
DuccWorkJob job = (DuccWorkJob) duccwork;
- switch(job.getCompletionType()) {
- case Undefined:
- break;
- case CanceledByUser:
- case CanceledByAdministrator:
- try {
- String cancelUser = duccwork.getStandardInfo().getCancelUser();
- if(cancelUser != null) {
- sb.append("<span title=\"canceled by "+cancelUser+"\">");
- sb.append(duccwork.getCompletionTypeObject().toString());
- sb.append("</span>");
- }
- else {
- IRationale rationale = job.getCompletionRationale();
- if(rationale != null) {
- sb.append("<span title=\""+rationale+"\">");
- sb.append(duccwork.getCompletionTypeObject().toString());
- sb.append("</span>");
- }
- else {
- sb.append(duccwork.getCompletionTypeObject().toString());
- }
-
- }
- }
- catch(Exception e) {
- IRationale rationale = job.getCompletionRationale();
- if(rationale != null) {
- sb.append("<span title=\""+rationale+"\">");
- sb.append(duccwork.getCompletionTypeObject().toString());
- sb.append("</span>");
- }
- else {
- sb.append(duccwork.getCompletionTypeObject().toString());
- }
- }
- break;
- default:
- IRationale rationale = job.getCompletionRationale();
- if(rationale != null) {
- sb.append("<span title=\""+rationale+"\">");
- sb.append(duccwork.getCompletionTypeObject().toString());
- sb.append("</span>");
- }
- else {
- sb.append(duccwork.getCompletionTypeObject().toString());
- }
- break;
- }
+ String reason = getReason(job, DuccType.Reservation);
+ sb.append(reason);
}
- sb.append("</td>");
// Allocation
sb.append("<td align=\"right\">");
sb.append(duccwork.getSchedulingInfo().getInstancesCount());
@@ -693,6 +658,13 @@ public class DuccHandlerLegacy extends D
else {
sb.append("0");
}
+ Iterator<DuccId> iterator = job.getProcessMap().keySet().iterator();
+ while(iterator.hasNext()) {
+ DuccId processId = iterator.next();
+ IDuccProcess process = job.getProcessMap().get(processId);
+ String node = process.getNodeIdentity().getName();
+ nodeMap.put(node, 1);
+ }
}
sb.append("</td>");
// Size
@@ -701,22 +673,34 @@ public class DuccHandlerLegacy extends D
MemoryUnits units = duccwork.getSchedulingInfo().getShareMemoryUnits();
sb.append(getProcessMemorySize(duccId,type,size,units));
sb.append("</td>");
- // List
+ // Host Names
sb.append("<td>");
- if(duccwork instanceof DuccWorkReservation) {
- if(!nodeMap.isEmpty()) {
+ if(!nodeMap.isEmpty()) {
+ boolean useList = false;
+ if(nodeMap.size() > 1) {
+ useList = true;
+ }
+ if(useList) {
sb.append("<select>");
- for (String node: nodeMap.keySet()) {
- Integer count = nodeMap.get(node);
- String option = node+" "+"["+count+"]";
- sb.append("<option>"+option+"</option>");
+ }
+ for (String node: nodeMap.keySet()) {
+ String option = node;
+ Integer count = nodeMap.get(node);
+ if(count > 1) {
+ option += " "+"["+count+"]";
+ }
+ if(useList) {
+ sb.append("<option>");
+ }
+ sb.append(option);
+ if(useList) {
+ sb.append("</option>");
}
+ }
+ if(useList) {
sb.append("</select>");
}
}
- else {
- //TODO
- }
sb.append("</td>");
// Description
sb.append("<td>");
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerProxy.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerProxy.java?rev=1458366&r1=1458365&r2=1458366&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerProxy.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerProxy.java Tue Mar 19 16:00:00 2013
@@ -42,21 +42,24 @@ public class DuccHandlerProxy extends Du
public final String proxyJobStatus = duccContextProxy+"-job-status";
public final String proxyJobMonitorReport = duccContextProxy+"-job-monitor-report";
+ public final String proxyManagedReservationStatus = duccContextProxy+"-managed-reservation-status";
+ public final String proxyManagedReservationMonitorReport = duccContextProxy+"-managed-reservation-monitor-report";
+
DuccWebMonitor duccWebMonitor = DuccWebMonitor.getInstance();
- private boolean isJobIdMissing(String jobId) {
+ private boolean isIdMissing(String id) {
boolean retVal = false;
- if(jobId.length() == 0) {
+ if(id.length() == 0) {
retVal = true;
}
return retVal;
}
- private boolean isJobIdInvalid(String jobId) {
+ private boolean isIdInvalid(String id) {
boolean retVal = false;
try {
- int id = Integer.parseInt(jobId);
- if(id < 0) {
+ int value = Integer.parseInt(id);
+ if(value < 0) {
retVal = true;
}
}
@@ -82,13 +85,13 @@ public class DuccHandlerProxy extends Du
jobId = "";
}
- if(isJobIdMissing(jobId)) {
- String message = "Job id missing";
+ if(isIdMissing(jobId)) {
+ String message = "id missing";
duccLogger.info(location, jobid, message);
response.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
}
- else if(isJobIdInvalid(jobId)) {
- String message = "Job id invalid";
+ else if(isIdInvalid(jobId)) {
+ String message = "id invalid";
duccLogger.info(location, jobid, message);
response.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
}
@@ -121,6 +124,61 @@ public class DuccHandlerProxy extends Du
duccLogger.trace(location, jobid, "exit");
}
+ private void handleServletManagedReservationStatus(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
+ throws IOException, ServletException
+ {
+ String location = "handleServletManagedReservationStatus";
+ duccLogger.trace(location, jobid, "enter");
+ duccLogger.info(location, jobid, request.toString());
+
+ String id = request.getParameter("id");
+
+ if(id != null) {
+ id = id.trim();
+ }
+ else {
+ id = "";
+ }
+
+ if(isIdMissing(id)) {
+ String message = "id missing";
+ duccLogger.info(location, jobid, message);
+ response.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ }
+ else if(isIdInvalid(id)) {
+ String message = "id invalid";
+ duccLogger.info(location, jobid, message);
+ response.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ }
+ else {
+ MonitorInfo monitorInfo = duccWebMonitor.renew(DuccType.Reservation, id);
+ Gson gson = new Gson();
+ String jSon = gson.toJson(monitorInfo);
+ duccLogger.debug(location, jobid, jSon);
+ response.getWriter().println(jSon);
+ response.setContentType("application/json");
+ }
+
+ duccLogger.trace(location, jobid, "exit");
+ }
+
+ private void handleServletManagedReservationMonitorReport(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
+ throws IOException, ServletException
+ {
+ String location = "handleServletManagedReservationMonitorReport";
+ duccLogger.trace(location, jobid, "enter");
+ duccLogger.info(location, jobid, request.toString());
+
+ ConcurrentHashMap<DuccId,Long> eMap = duccWebMonitor.getExpiryMap(DuccType.Reservation);
+
+ Gson gson = new Gson();
+ String jSon = gson.toJson(eMap);
+ duccLogger.debug(location, jobid, jSon);
+ response.getWriter().println(jSon);
+ response.setContentType("application/json");
+ duccLogger.trace(location, jobid, "exit");
+ }
+
private void handleServletUnknown(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
@@ -144,6 +202,12 @@ public class DuccHandlerProxy extends Du
else if(reqURI.startsWith(proxyJobMonitorReport)) {
handleServletJobMonitorReport(target, baseRequest, request, response);
}
+ else if(reqURI.startsWith(proxyManagedReservationStatus)) {
+ handleServletManagedReservationStatus(target, baseRequest, request, response);
+ }
+ else if(reqURI.startsWith(proxyManagedReservationMonitorReport)) {
+ handleServletManagedReservationMonitorReport(target, baseRequest, request, response);
+ }
else {
handleServletUnknown(target, baseRequest, request, response);
}
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitor.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitor.java?rev=1458366&r1=1458365&r2=1458366&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitor.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitor.java Tue Mar 19 16:00:00 2013
@@ -18,28 +18,18 @@
*/
package org.apache.uima.ducc.ws.server;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Iterator;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.uima.ducc.cli.DuccUiConstants;
import org.apache.uima.ducc.common.json.MonitorInfo;
import org.apache.uima.ducc.common.utils.DuccLogger;
import org.apache.uima.ducc.common.utils.DuccLoggerComponents;
import org.apache.uima.ducc.common.utils.id.DuccId;
import org.apache.uima.ducc.orchestrator.authentication.DuccWebAdministrators;
import org.apache.uima.ducc.transport.event.OrchestratorStateDuccEvent;
-import org.apache.uima.ducc.transport.event.cli.JobRequestProperties;
-import org.apache.uima.ducc.transport.event.cli.SpecificationProperties;
-import org.apache.uima.ducc.transport.event.common.DuccWorkMap;
-import org.apache.uima.ducc.transport.event.common.IDuccSchedulingInfo;
-import org.apache.uima.ducc.transport.event.common.IDuccState.JobState;
import org.apache.uima.ducc.transport.event.common.IDuccTypes.DuccType;
-import org.apache.uima.ducc.transport.event.common.IDuccWorkJob;
import org.apache.uima.ducc.ws.IListenerOrchestrator;
public class DuccWebMonitor implements IListenerOrchestrator, IWebMonitor {
@@ -56,12 +46,8 @@ public class DuccWebMonitor implements I
private Properties properties = new Properties();
- private long millisPerMinute = 60*1000;
- private long timeoutMinutes = 10;
- private long timeoutMillis = timeoutMinutes*millisPerMinute;
-
- private AtomicBoolean operational = new AtomicBoolean(true);
private AtomicInteger updateCounter = new AtomicInteger(0);
+ private AtomicBoolean operational = new AtomicBoolean(true);
private AtomicBoolean statusMessageIssued = new AtomicBoolean(false);
private String monitor_host = null;
@@ -70,10 +56,13 @@ public class DuccWebMonitor implements I
private String actual_host = null;
private String actual_port = null;
- private ConcurrentHashMap<DuccId,MonitorInfo> jmMap = new ConcurrentHashMap<DuccId,MonitorInfo>();
- private ConcurrentHashMap<DuccId,TrackingInfo> jtMap = new ConcurrentHashMap<DuccId,TrackingInfo>();
- private ConcurrentHashMap<DuccId,Long> jcMap = new ConcurrentHashMap<DuccId,Long>();
+ private long millisPerMinute = 60*1000;
+ private long timeoutMinutes = 10;
+ private long timeoutMillis = timeoutMinutes*millisPerMinute;
+ private DuccWebMonitorJob duccWebMonitorJob = null;
+ private DuccWebMonitorManagedReservation duccWebMonitorManagedReservation = null;
+
public static DuccWebMonitor getInstance() {
return instance;
}
@@ -113,6 +102,9 @@ public class DuccWebMonitor implements I
monitor_host = properties.getProperty(key_head);
}
monitor_port = properties.getProperty(key_port);
+ //
+ duccWebMonitorJob = new DuccWebMonitorJob(timeoutMillis);
+ duccWebMonitorManagedReservation = new DuccWebMonitorManagedReservation(timeoutMillis);
}
@Override
@@ -133,196 +125,15 @@ public class DuccWebMonitor implements I
duccLogger.trace(location, jobid, "exit");
}
- private void monitorJobs(OrchestratorStateDuccEvent duccEvent) {
- String location = "monitorJobs";
- duccLogger.trace(location, jobid, "enter");
-
- DuccWorkMap dwm = duccEvent.getWorkMap();
- int size = dwm.getJobKeySet().size();
- duccLogger.debug(location, jobid, "jobs: "+size);
-
- Iterator<DuccId> iterator;
- ArrayList<DuccId> gone = new ArrayList<DuccId>();
-
- iterator = jmMap.keySet().iterator();
- while( iterator.hasNext() ) {
- DuccId duccId = iterator.next();
- gone.add(duccId);
- }
-
- long expiryMillis = System.currentTimeMillis()+timeoutMillis+1;
-
- iterator = dwm.getJobKeySet().iterator();
- while( iterator.hasNext() ) {
- DuccId duccId = iterator.next();
- IDuccWorkJob dwj = (IDuccWorkJob)dwm.findDuccWork(duccId);
- gone.remove(duccId);
- if(!jmMap.containsKey(duccId)) {
- MonitorInfo monitorInfo = new MonitorInfo();
- jmMap.put(duccId, monitorInfo);
- duccLogger.info(location, duccId, "Job monitor start");
- if(!jtMap.containsKey(duccId)) {
- try {
- Properties properties = DuccFile.getJobProperties(dwj);
- if(properties.containsKey(DuccUiConstants.name_monitor_cancel_job_on_interrupt)) {
- TrackingInfo ti = new TrackingInfo();
- ti.time = expiryMillis;
- ti.user = dwj.getStandardInfo().getUser();
- jtMap.put(duccId,ti);
- duccLogger.info(location, duccId, "Job auto-cancel on");
- }
- else {
- duccLogger.info(location, duccId, "Job auto-cancel off");
- }
- }
- catch(Exception e) {
- duccLogger.info(location, duccId, e);
- }
- }
- }
- MonitorInfo monitorInfo = jmMap.get(duccId);
- IDuccSchedulingInfo si = dwj.getSchedulingInfo();
- monitorInfo.total = si.getWorkItemsTotal();
- monitorInfo.done = si.getWorkItemsCompleted();
- monitorInfo.error = si.getWorkItemsError();
- monitorInfo.retry = si.getWorkItemsRetry();
- monitorInfo.procs = ""+dwj.getProcessMap().getAliveProcessCount();
-
- ArrayList<String> stateSequence = monitorInfo.stateSequence;
- String state = dwj.getJobState().toString();
- if(!stateSequence.contains(state)) {
- duccLogger.info(location, duccId, "state: "+state);
- stateSequence.add(state);
- }
- }
-
- iterator = gone.iterator();
- while( iterator.hasNext() ) {
- DuccId duccId = iterator.next();
- jmMap.remove(duccId);
- jtMap.remove(duccId);
- duccLogger.info(location, duccId, "Job monitor stop");
- }
-
- duccLogger.trace(location, jobid, "exit");
- }
-
- private void monitorManagedReservations(OrchestratorStateDuccEvent duccEvent) {
- String location = "monitorManagedReservations";
- duccLogger.trace(location, jobid, "enter");
-
- // TODO
-
- duccLogger.trace(location, jobid, "exit");
- }
-
- private void cancelJobs(long nowMillis) {
- String location = "cancelJobs";
- duccLogger.trace(location, jobid, "enter");
-
- Enumeration<DuccId> keys = jtMap.keys();
- while(keys.hasMoreElements()) {
- DuccId duccId = keys.nextElement();
- TrackingInfo ti = jtMap.get(duccId);
- long expiryMillis = ti.time;
- if(nowMillis > expiryMillis) {
- if(isCancelableJob(duccId)) {
- cancelJob(duccId);
- }
- else {
- duccLogger.debug(location, duccId, "not cancelable");
- }
- }
- }
-
- duccLogger.trace(location, jobid, "exit");
- }
-
- private boolean isCanceledJob(DuccId duccId) {
- return jcMap.containsKey(duccId);
- }
-
- private boolean isCancelableJob(DuccId duccId) {
- String location = "isCancelableJob";
- duccLogger.trace(location, duccId, "enter");
- boolean retVal = false;
- if(!jcMap.containsKey(duccId)) {
- MonitorInfo monitorInfo = jmMap.get(duccId);
- if(monitorInfo != null) {
- ArrayList<String> stateSequence = monitorInfo.stateSequence;
- if(stateSequence != null) {
- if(stateSequence.contains(JobState.Completing.toString())) {
- duccLogger.debug(location, duccId, "state: <uncancelable> "+stateSequence);
- }
- else if(stateSequence.contains(JobState.Completed.toString())) {
- duccLogger.debug(location, duccId, "state: <uncancelable> "+stateSequence);
- }
- else {
- duccLogger.debug(location, duccId, "state: <cancelable> "+stateSequence);
- retVal = true;
- }
- }
- else {
- duccLogger.warn(location, duccId, "stateSequence: <null>");
- }
- }
- else {
- duccLogger.warn(location, duccId, "monitorInfo: <null>");
- }
- }
- else {
- duccLogger.debug(location, duccId, "already canceled");
- }
- duccLogger.trace(location, duccId, "exit");
- return retVal;
- }
-
- private void cancelJob(DuccId duccId) {
- String location = "cancelJob";
- duccLogger.trace(location, jobid, "enter");
-
- String userId = System.getProperty("user.name");
-
- duccLogger.info(location, duccId, userId);
-
- String java = "/bin/java";
- String jhome = System.getProperty("java.home");
- String cp = System.getProperty("java.class.path");
- String jclass = "org.apache.uima.ducc.cli.DuccJobCancel";
- String arg1 = "--"+JobRequestProperties.key_id;
- String arg2 = ""+duccId;
- String arg3 = "--"+SpecificationProperties.key_reason;
- String arg4 = "\"submitter terminated, therefore job canceled automatically\"";
- String arg5 = "--"+SpecificationProperties.key_role_administrator;
-
- String[] arglistUser = { "-u", userId, "--", jhome+java, "-cp", cp, jclass, arg1, arg2, arg3, arg4, arg5 };
- String result = DuccAsUser.duckling(userId, arglistUser);
- duccLogger.warn(location, duccId, result);
-
- jcMap.put(duccId, new Long(System.currentTimeMillis()));
- jtMap.remove(duccId);
-
- duccLogger.trace(location, jobid, "exit");
- }
-
- private void cancelManagedReservations(long nowMillis) {
- String location = "cancelManagedReservations";
- duccLogger.trace(location, jobid, "enter");
-
- // TODO
-
- duccLogger.trace(location, jobid, "exit");
- }
-
private void monitor(OrchestratorStateDuccEvent duccEvent) {
String location = "monitor";
duccLogger.trace(location, jobid, "enter");
- monitorJobs(duccEvent);
- monitorManagedReservations(duccEvent);
+ duccWebMonitorJob.monitor(duccEvent);
+ duccWebMonitorManagedReservation.monitor(duccEvent);
if(isAutoCancelEnabled()) {
long nowMillis = System.currentTimeMillis();
- cancelJobs(nowMillis);
- cancelManagedReservations(nowMillis);
+ duccWebMonitorJob.canceler(nowMillis);
+ duccWebMonitorManagedReservation.canceler(nowMillis);
}
else {
duccLogger.debug(location, jobid, "auto-cancel monitor disabled");
@@ -370,81 +181,6 @@ public class DuccWebMonitor implements I
return true;
}
- private DuccId getKey(String jobId) {
- DuccId retVal = null;
- Enumeration<DuccId> keys = jmMap.keys();
- while(keys.hasMoreElements()) {
- DuccId duccId = keys.nextElement();
- String mapId = ""+duccId.getFriendly();
- if(mapId.equals(jobId)) {
- retVal = duccId;
- break;
- }
- }
- return retVal;
- }
-
- public MonitorInfo renewJob(String jobId) {
- String location = "renewJob";
- duccLogger.trace(location, jobid, "enter");
-
- MonitorInfo monitorInfo = new MonitorInfo();
-
- int countAtArrival = updateCounter.get();
- int countAtPresent = countAtArrival;
- int sleepSecondsMax = 3*60;
-
- DuccId duccId = getKey(jobId);
-
- if(duccId == null) {
- int sleepSeconds = 0;
- duccLogger.info(location, duccId, "Waiting for update...");
- while(duccId == null) {
- try {
- duccLogger.debug(location, duccId, "Waiting continues...");
- Thread.sleep(1000);
- sleepSeconds += 1;
- if(sleepSeconds > sleepSecondsMax) {
- break;
- }
- countAtPresent = updateCounter.get();
- if((countAtPresent-countAtArrival) > 2) {
- break;
- }
- duccId = getKey(jobId);
- }
- catch(Exception e) {
- }
- }
- duccLogger.info(location, duccId, "Waiting complete.");
- duccId = getKey(jobId);
- }
-
- if(duccId != null) {
- monitorInfo = jmMap.get(duccId);
- if(jtMap.containsKey(duccId)) {
- long expiryMillis = System.currentTimeMillis()+timeoutMillis+1;
- TrackingInfo ti = jtMap.get(duccId);
- ti.time = expiryMillis;
- duccLogger.info(location, duccId, "Job auto-cancel expiry extended");
- }
- }
- else {
- try {
- int iJobId = Integer.parseInt(jobId);
- duccId = new DuccId(iJobId);
- duccLogger.info(location, duccId, "Job not found");
- }
- catch(Exception e) {
- duccLogger.error(location, jobid, e);
- }
- }
-
- duccLogger.trace(location, jobid, "exit");
-
- return monitorInfo;
- }
-
@Override
public MonitorInfo renew(DuccType duccType, String id) {
MonitorInfo monitorInfo = new MonitorInfo();
@@ -452,9 +188,10 @@ public class DuccWebMonitor implements I
if(id != null) {
switch(duccType) {
case Job:
- monitorInfo = renewJob(id);
+ monitorInfo = duccWebMonitorJob.renew(id, updateCounter);
break;
case Reservation:
+ monitorInfo = duccWebMonitorManagedReservation.renew(id, updateCounter);
break;
case Service:
break;
@@ -465,23 +202,7 @@ public class DuccWebMonitor implements I
}
return monitorInfo;
}
-
- private Long getExpiryJob(DuccId duccId) {
- String location = "getExpiryJob";
- duccLogger.trace(location, duccId, "enter");
- Long retVal = null;
- if(!isCanceledJob(duccId)) {
- if(isCancelableJob(duccId)) {
- ConcurrentHashMap<DuccId,Long> eMap = getExpiryMapJobs();
- if(eMap.containsKey(duccId)) {
- retVal = eMap.get(duccId);
- }
- }
- }
- duccLogger.trace(location, duccId, "exit");
- return retVal;
- }
-
+
@Override
public Long getExpiry(DuccType duccType, DuccId duccId) {
Long expiry = null;
@@ -489,9 +210,10 @@ public class DuccWebMonitor implements I
if(duccId != null) {
switch(duccType) {
case Job:
- expiry = getExpiryJob(duccId);
+ expiry = duccWebMonitorJob.getExpiry(duccId);
break;
case Reservation:
+ expiry = duccWebMonitorManagedReservation.getExpiry(duccId);
break;
case Service:
break;
@@ -510,9 +232,10 @@ public class DuccWebMonitor implements I
if(duccId != null) {
switch(duccType) {
case Job:
- flag = isCanceledJob(duccId);
+ flag = duccWebMonitorJob.isCanceled(duccId);
break;
case Reservation:
+ flag = duccWebMonitorManagedReservation.isCanceled(duccId);
break;
case Service:
break;
@@ -524,40 +247,16 @@ public class DuccWebMonitor implements I
return flag;
}
- public ConcurrentHashMap<DuccId,Long> getExpiryMapJobs() {
- String location = "getExpiryMapJobs";
- duccLogger.trace(location, jobid, "enter");
-
- ConcurrentHashMap<DuccId,Long> eMap = new ConcurrentHashMap<DuccId,Long>();
-
- long nowMillis = System.currentTimeMillis();
-
- Enumeration<DuccId> keys = jtMap.keys();
- while(keys.hasMoreElements()) {
- long minutesLeft = 0;
- DuccId duccId = keys.nextElement();
- TrackingInfo ti = jtMap.get(duccId);
- long expiryMillis = ti.time;
- if(nowMillis < expiryMillis) {
- minutesLeft = (expiryMillis - nowMillis) / millisPerMinute;
- }
- eMap.put(duccId, minutesLeft);
- }
-
- duccLogger.trace(location, jobid, "exit");
-
- return eMap;
- }
-
@Override
public ConcurrentHashMap<DuccId,Long> getExpiryMap(DuccType duccType) {
ConcurrentHashMap<DuccId,Long> eMap = new ConcurrentHashMap<DuccId,Long>();
if(duccType != null) {
switch(duccType) {
case Job:
- eMap = getExpiryMapJobs();
+ eMap = duccWebMonitorJob.getExpiryMap();
break;
case Reservation:
+ eMap = duccWebMonitorManagedReservation.getExpiryMap();
break;
case Service:
break;
Added: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitorJob.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitorJob.java?rev=1458366&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitorJob.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitorJob.java Tue Mar 19 16:00:00 2013
@@ -0,0 +1,330 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+*/
+package org.apache.uima.ducc.ws.server;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.uima.ducc.common.json.MonitorInfo;
+import org.apache.uima.ducc.common.utils.DuccLogger;
+import org.apache.uima.ducc.common.utils.DuccLoggerComponents;
+import org.apache.uima.ducc.common.utils.id.DuccId;
+import org.apache.uima.ducc.transport.event.OrchestratorStateDuccEvent;
+import org.apache.uima.ducc.transport.event.cli.JobRequestProperties;
+import org.apache.uima.ducc.transport.event.cli.SpecificationProperties;
+import org.apache.uima.ducc.transport.event.common.DuccWorkJob;
+import org.apache.uima.ducc.transport.event.common.DuccWorkMap;
+import org.apache.uima.ducc.transport.event.common.IDuccSchedulingInfo;
+import org.apache.uima.ducc.transport.event.common.IDuccState.JobState;
+import org.apache.uima.ducc.transport.event.common.IDuccWork;
+
+public class DuccWebMonitorJob {
+
+ private static DuccLogger duccLogger = DuccLoggerComponents.getWsLogger(DuccWebMonitorJob.class.getName());
+ private static DuccId jobid = null;
+
+ private ConcurrentHashMap<DuccId,MonitorInfo> mMap = new ConcurrentHashMap<DuccId,MonitorInfo>();
+ private ConcurrentHashMap<DuccId,TrackingInfo> tMap = new ConcurrentHashMap<DuccId,TrackingInfo>();
+ private ConcurrentHashMap<DuccId,Long> cMap = new ConcurrentHashMap<DuccId,Long>();
+
+ private long millisPerMinute = 60*1000;
+ private long timeoutMillis;
+
+ protected DuccWebMonitorJob(long timeoutMillis) {
+ this.timeoutMillis = timeoutMillis;
+ }
+
+ protected void monitor(OrchestratorStateDuccEvent duccEvent) {
+ String location = "monitor";
+ duccLogger.trace(location, jobid, "enter");
+
+ DuccWorkMap dwm = duccEvent.getWorkMap();
+ int size = dwm.getJobKeySet().size();
+ duccLogger.debug(location, jobid, "jobs: "+size);
+
+ Iterator<DuccId> iterator;
+ ArrayList<DuccId> gone = new ArrayList<DuccId>();
+
+ iterator = mMap.keySet().iterator();
+ while( iterator.hasNext() ) {
+ DuccId duccId = iterator.next();
+ gone.add(duccId);
+ }
+
+ long expiryMillis = System.currentTimeMillis()+timeoutMillis+1;
+
+ iterator = dwm.getJobKeySet().iterator();
+ while( iterator.hasNext() ) {
+ DuccId duccId = iterator.next();
+ IDuccWork dw = (IDuccWork)dwm.findDuccWork(duccId);
+ gone.remove(duccId);
+ if(!mMap.containsKey(duccId)) {
+ MonitorInfo monitorInfo = new MonitorInfo();
+ mMap.put(duccId, monitorInfo);
+ duccLogger.info(location, duccId, "monitor start");
+ if(!tMap.containsKey(duccId)) {
+ if(dw.isCancelOnInterrupt()) {
+ TrackingInfo ti = new TrackingInfo();
+ ti.time = expiryMillis;
+ ti.user = dw.getStandardInfo().getUser();
+ tMap.put(duccId,ti);
+ duccLogger.info(location, duccId, "auto-cancel on");
+ }
+ else {
+ duccLogger.info(location, duccId, "auto-cancel off");
+ }
+ }
+ }
+ DuccWorkJob dwj = (DuccWorkJob) dw;
+ MonitorInfo monitorInfo = mMap.get(duccId);
+ IDuccSchedulingInfo si = dw.getSchedulingInfo();
+ monitorInfo.total = si.getWorkItemsTotal();
+ monitorInfo.done = si.getWorkItemsCompleted();
+ monitorInfo.error = si.getWorkItemsError();
+ monitorInfo.retry = si.getWorkItemsRetry();
+ monitorInfo.procs = ""+dwj.getProcessMap().getAliveProcessCount();
+
+ ArrayList<String> stateSequence = monitorInfo.stateSequence;
+ String state = dwj.getJobState().toString();
+ if(!stateSequence.contains(state)) {
+ duccLogger.info(location, duccId, "state: "+state);
+ stateSequence.add(state);
+ }
+ }
+
+ iterator = gone.iterator();
+ while( iterator.hasNext() ) {
+ DuccId duccId = iterator.next();
+ mMap.remove(duccId);
+ tMap.remove(duccId);
+ duccLogger.info(location, duccId, "monitor stop");
+ }
+
+ duccLogger.trace(location, jobid, "exit");
+ }
+
+ protected DuccId getKey(String jobId) {
+ DuccId retVal = null;
+ Enumeration<DuccId> keys = mMap.keys();
+ while(keys.hasMoreElements()) {
+ DuccId duccId = keys.nextElement();
+ String mapId = ""+duccId.getFriendly();
+ if(mapId.equals(jobId)) {
+ retVal = duccId;
+ break;
+ }
+ }
+ return retVal;
+ }
+
+ public MonitorInfo renew(String jobId, AtomicInteger updateCounter) {
+ String location = "renew";
+ duccLogger.trace(location, jobid, "enter");
+
+ MonitorInfo monitorInfo = new MonitorInfo();
+
+ int countAtArrival = updateCounter.get();
+ int countAtPresent = countAtArrival;
+ int sleepSecondsMax = 3*60;
+
+ DuccId duccId = getKey(jobId);
+
+ if(duccId == null) {
+ int sleepSeconds = 0;
+ duccLogger.info(location, duccId, "Waiting for update...");
+ while(duccId == null) {
+ try {
+ duccLogger.debug(location, duccId, "Waiting continues...");
+ Thread.sleep(1000);
+ sleepSeconds += 1;
+ if(sleepSeconds > sleepSecondsMax) {
+ break;
+ }
+ countAtPresent = updateCounter.get();
+ if((countAtPresent-countAtArrival) > 2) {
+ break;
+ }
+ duccId = getKey(jobId);
+ }
+ catch(Exception e) {
+ }
+ }
+ duccLogger.info(location, duccId, "Waiting complete.");
+ duccId = getKey(jobId);
+ }
+
+ if(duccId != null) {
+ monitorInfo = mMap.get(duccId);
+ if(tMap.containsKey(duccId)) {
+ long expiryMillis = System.currentTimeMillis()+timeoutMillis+1;
+ TrackingInfo ti = tMap.get(duccId);
+ ti.time = expiryMillis;
+ duccLogger.info(location, duccId, "auto-cancel expiry extended");
+ }
+ }
+ else {
+ try {
+ int iJobId = Integer.parseInt(jobId);
+ duccId = new DuccId(iJobId);
+ duccLogger.info(location, duccId, "not found");
+ }
+ catch(Exception e) {
+ duccLogger.error(location, jobid, e);
+ }
+ }
+
+ duccLogger.trace(location, jobid, "exit");
+
+ return monitorInfo;
+ }
+
+ protected Long getExpiry(DuccId duccId) {
+ String location = "getExpiry";
+ duccLogger.trace(location, duccId, "enter");
+ Long retVal = null;
+ if(!isCanceled(duccId)) {
+ if(isCancelable(duccId)) {
+ ConcurrentHashMap<DuccId,Long> eMap = getExpiryMap();
+ if(eMap.containsKey(duccId)) {
+ retVal = eMap.get(duccId);
+ }
+ }
+ }
+ duccLogger.trace(location, duccId, "exit");
+ return retVal;
+ }
+
+ public ConcurrentHashMap<DuccId,Long> getExpiryMap() {
+ String location = "getExpiryMap";
+ duccLogger.trace(location, jobid, "enter");
+
+ ConcurrentHashMap<DuccId,Long> eMap = new ConcurrentHashMap<DuccId,Long>();
+
+ long nowMillis = System.currentTimeMillis();
+
+ Enumeration<DuccId> keys = tMap.keys();
+ while(keys.hasMoreElements()) {
+ long minutesLeft = 0;
+ DuccId duccId = keys.nextElement();
+ TrackingInfo ti = tMap.get(duccId);
+ long expiryMillis = ti.time;
+ if(nowMillis < expiryMillis) {
+ minutesLeft = (expiryMillis - nowMillis) / millisPerMinute;
+ }
+ eMap.put(duccId, minutesLeft);
+ }
+
+ duccLogger.trace(location, jobid, "exit");
+
+ return eMap;
+ }
+
+ protected boolean isCanceled(DuccId duccId) {
+ return cMap.containsKey(duccId);
+ }
+
+ private boolean isCancelable(DuccId duccId) {
+ String location = "isCancelable";
+ duccLogger.trace(location, duccId, "enter");
+ boolean retVal = false;
+ if(!cMap.containsKey(duccId)) {
+ MonitorInfo monitorInfo = mMap.get(duccId);
+ if(monitorInfo != null) {
+ ArrayList<String> stateSequence = monitorInfo.stateSequence;
+ if(stateSequence != null) {
+ if(stateSequence.contains(JobState.Completing.toString())) {
+ duccLogger.debug(location, duccId, "state: <uncancelable> "+stateSequence);
+ }
+ else if(stateSequence.contains(JobState.Completed.toString())) {
+ duccLogger.debug(location, duccId, "state: <uncancelable> "+stateSequence);
+ }
+ else {
+ duccLogger.debug(location, duccId, "state: <cancelable> "+stateSequence);
+ retVal = true;
+ }
+ }
+ else {
+ duccLogger.warn(location, duccId, "stateSequence: <null>");
+ }
+ }
+ else {
+ duccLogger.warn(location, duccId, "monitorInfo: <null>");
+ }
+ }
+ else {
+ duccLogger.debug(location, duccId, "already canceled");
+ }
+ duccLogger.trace(location, duccId, "exit");
+ return retVal;
+ }
+
+ protected void cancel(DuccId duccId) {
+ String location = "cancel";
+ duccLogger.trace(location, jobid, "enter");
+
+ String userId = System.getProperty("user.name");
+
+ duccLogger.info(location, duccId, userId);
+
+ String java = "/bin/java";
+ String jhome = System.getProperty("java.home");
+ String cp = System.getProperty("java.class.path");
+ String jclass = "org.apache.uima.ducc.cli.DuccJobCancel";
+ String arg1 = "--"+JobRequestProperties.key_id;
+ String arg2 = ""+duccId;
+ String arg3 = "--"+SpecificationProperties.key_reason;
+ String arg4 = "\"submitter terminated, therefore canceled automatically\"";
+ String arg5 = "--"+SpecificationProperties.key_role_administrator;
+
+ String[] arglistUser = { "-u", userId, "--", jhome+java, "-cp", cp, jclass, arg1, arg2, arg3, arg4, arg5 };
+ String result = DuccAsUser.duckling(userId, arglistUser);
+ duccLogger.warn(location, duccId, result);
+
+ cMap.put(duccId, new Long(System.currentTimeMillis()));
+ tMap.remove(duccId);
+
+ duccLogger.trace(location, jobid, "exit");
+ }
+
+ protected void canceler(long nowMillis) {
+ String location = "canceler";
+ duccLogger.trace(location, jobid, "enter");
+
+ Enumeration<DuccId> keys = tMap.keys();
+ while(keys.hasMoreElements()) {
+ DuccId duccId = keys.nextElement();
+ TrackingInfo ti = tMap.get(duccId);
+ long expiryMillis = ti.time;
+ if(nowMillis > expiryMillis) {
+ if(isCancelable(duccId)) {
+ cancel(duccId);
+ }
+ else {
+ duccLogger.debug(location, duccId, "not cancelable");
+ }
+ }
+ }
+
+ duccLogger.trace(location, jobid, "exit");
+ }
+
+}
Added: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitorManagedReservation.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitorManagedReservation.java?rev=1458366&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitorManagedReservation.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitorManagedReservation.java Tue Mar 19 16:00:00 2013
@@ -0,0 +1,330 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+*/
+package org.apache.uima.ducc.ws.server;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.uima.ducc.common.json.MonitorInfo;
+import org.apache.uima.ducc.common.utils.DuccLogger;
+import org.apache.uima.ducc.common.utils.DuccLoggerComponents;
+import org.apache.uima.ducc.common.utils.id.DuccId;
+import org.apache.uima.ducc.transport.event.OrchestratorStateDuccEvent;
+import org.apache.uima.ducc.transport.event.cli.JobRequestProperties;
+import org.apache.uima.ducc.transport.event.cli.SpecificationProperties;
+import org.apache.uima.ducc.transport.event.common.DuccWorkJob;
+import org.apache.uima.ducc.transport.event.common.DuccWorkMap;
+import org.apache.uima.ducc.transport.event.common.IDuccSchedulingInfo;
+import org.apache.uima.ducc.transport.event.common.IDuccState.JobState;
+import org.apache.uima.ducc.transport.event.common.IDuccWork;
+
+public class DuccWebMonitorManagedReservation {
+
+ private static DuccLogger duccLogger = DuccLoggerComponents.getWsLogger(DuccWebMonitorManagedReservation.class.getName());
+ private static DuccId jobid = null;
+
+ private ConcurrentHashMap<DuccId,MonitorInfo> mMap = new ConcurrentHashMap<DuccId,MonitorInfo>();
+ private ConcurrentHashMap<DuccId,TrackingInfo> tMap = new ConcurrentHashMap<DuccId,TrackingInfo>();
+ private ConcurrentHashMap<DuccId,Long> cMap = new ConcurrentHashMap<DuccId,Long>();
+
+ private long millisPerMinute = 60*1000;
+ private long timeoutMillis;
+
+ protected DuccWebMonitorManagedReservation(long timeoutMillis) {
+ this.timeoutMillis = timeoutMillis;
+ }
+
+ protected void monitor(OrchestratorStateDuccEvent duccEvent) {
+ String location = "monitor";
+ duccLogger.trace(location, jobid, "enter");
+
+ DuccWorkMap dwm = duccEvent.getWorkMap();
+ int size = dwm.getManagedReservationKeySet().size();
+ duccLogger.debug(location, jobid, "managed reservations: "+size);
+
+ Iterator<DuccId> iterator;
+ ArrayList<DuccId> gone = new ArrayList<DuccId>();
+
+ iterator = mMap.keySet().iterator();
+ while( iterator.hasNext() ) {
+ DuccId duccId = iterator.next();
+ gone.add(duccId);
+ }
+
+ long expiryMillis = System.currentTimeMillis()+timeoutMillis+1;
+
+ iterator = dwm.getManagedReservationKeySet().iterator();
+ while( iterator.hasNext() ) {
+ DuccId duccId = iterator.next();
+ IDuccWork dw = (IDuccWork)dwm.findDuccWork(duccId);
+ gone.remove(duccId);
+ if(!mMap.containsKey(duccId)) {
+ MonitorInfo monitorInfo = new MonitorInfo();
+ mMap.put(duccId, monitorInfo);
+ duccLogger.info(location, duccId, "monitor start");
+ if(!tMap.containsKey(duccId)) {
+ if(dw.isCancelOnInterrupt()) {
+ TrackingInfo ti = new TrackingInfo();
+ ti.time = expiryMillis;
+ ti.user = dw.getStandardInfo().getUser();
+ tMap.put(duccId,ti);
+ duccLogger.info(location, duccId, "auto-cancel on");
+ }
+ else {
+ duccLogger.info(location, duccId, "auto-cancel off");
+ }
+ }
+ }
+ DuccWorkJob dwr = (DuccWorkJob) dw;
+ MonitorInfo monitorInfo = mMap.get(duccId);
+ IDuccSchedulingInfo si = dwr.getSchedulingInfo();
+ monitorInfo.total = si.getWorkItemsTotal();
+ monitorInfo.done = si.getWorkItemsCompleted();
+ monitorInfo.error = si.getWorkItemsError();
+ monitorInfo.retry = si.getWorkItemsRetry();
+ monitorInfo.procs = ""+dwr.getProcessMap().getAliveProcessCount();
+
+ ArrayList<String> stateSequence = monitorInfo.stateSequence;
+ String state = dwr.getJobState().toString();
+ if(!stateSequence.contains(state)) {
+ duccLogger.info(location, duccId, "state: "+state);
+ stateSequence.add(state);
+ }
+ }
+
+ iterator = gone.iterator();
+ while( iterator.hasNext() ) {
+ DuccId duccId = iterator.next();
+ mMap.remove(duccId);
+ tMap.remove(duccId);
+ duccLogger.info(location, duccId, "monitor stop");
+ }
+
+ duccLogger.trace(location, jobid, "exit");
+ }
+
+ protected DuccId getKey(String jobId) {
+ DuccId retVal = null;
+ Enumeration<DuccId> keys = mMap.keys();
+ while(keys.hasMoreElements()) {
+ DuccId duccId = keys.nextElement();
+ String mapId = ""+duccId.getFriendly();
+ if(mapId.equals(jobId)) {
+ retVal = duccId;
+ break;
+ }
+ }
+ return retVal;
+ }
+
+ public MonitorInfo renew(String jobId, AtomicInteger updateCounter) {
+ String location = "renew";
+ duccLogger.trace(location, jobid, "enter");
+
+ MonitorInfo monitorInfo = new MonitorInfo();
+
+ int countAtArrival = updateCounter.get();
+ int countAtPresent = countAtArrival;
+ int sleepSecondsMax = 3*60;
+
+ DuccId duccId = getKey(jobId);
+
+ if(duccId == null) {
+ int sleepSeconds = 0;
+ duccLogger.info(location, duccId, "Waiting for update...");
+ while(duccId == null) {
+ try {
+ duccLogger.debug(location, duccId, "Waiting continues...");
+ Thread.sleep(1000);
+ sleepSeconds += 1;
+ if(sleepSeconds > sleepSecondsMax) {
+ break;
+ }
+ countAtPresent = updateCounter.get();
+ if((countAtPresent-countAtArrival) > 2) {
+ break;
+ }
+ duccId = getKey(jobId);
+ }
+ catch(Exception e) {
+ }
+ }
+ duccLogger.info(location, duccId, "Waiting complete.");
+ duccId = getKey(jobId);
+ }
+
+ if(duccId != null) {
+ monitorInfo = mMap.get(duccId);
+ if(tMap.containsKey(duccId)) {
+ long expiryMillis = System.currentTimeMillis()+timeoutMillis+1;
+ TrackingInfo ti = tMap.get(duccId);
+ ti.time = expiryMillis;
+ duccLogger.info(location, duccId, "auto-cancel expiry extended");
+ }
+ }
+ else {
+ try {
+ int iJobId = Integer.parseInt(jobId);
+ duccId = new DuccId(iJobId);
+ duccLogger.info(location, duccId, "not found");
+ }
+ catch(Exception e) {
+ duccLogger.error(location, jobid, e);
+ }
+ }
+
+ duccLogger.trace(location, jobid, "exit");
+
+ return monitorInfo;
+ }
+
+ protected Long getExpiry(DuccId duccId) {
+ String location = "getExpiry";
+ duccLogger.trace(location, duccId, "enter");
+ Long retVal = null;
+ if(!isCanceled(duccId)) {
+ if(isCancelable(duccId)) {
+ ConcurrentHashMap<DuccId,Long> eMap = getExpiryMap();
+ if(eMap.containsKey(duccId)) {
+ retVal = eMap.get(duccId);
+ }
+ }
+ }
+ duccLogger.trace(location, duccId, "exit");
+ return retVal;
+ }
+
+ public ConcurrentHashMap<DuccId,Long> getExpiryMap() {
+ String location = "getExpiryMap";
+ duccLogger.trace(location, jobid, "enter");
+
+ ConcurrentHashMap<DuccId,Long> eMap = new ConcurrentHashMap<DuccId,Long>();
+
+ long nowMillis = System.currentTimeMillis();
+
+ Enumeration<DuccId> keys = tMap.keys();
+ while(keys.hasMoreElements()) {
+ long minutesLeft = 0;
+ DuccId duccId = keys.nextElement();
+ TrackingInfo ti = tMap.get(duccId);
+ long expiryMillis = ti.time;
+ if(nowMillis < expiryMillis) {
+ minutesLeft = (expiryMillis - nowMillis) / millisPerMinute;
+ }
+ eMap.put(duccId, minutesLeft);
+ }
+
+ duccLogger.trace(location, jobid, "exit");
+
+ return eMap;
+ }
+
+ protected boolean isCanceled(DuccId duccId) {
+ return cMap.containsKey(duccId);
+ }
+
+ private boolean isCancelable(DuccId duccId) {
+ String location = "isCancelable";
+ duccLogger.trace(location, duccId, "enter");
+ boolean retVal = false;
+ if(!cMap.containsKey(duccId)) {
+ MonitorInfo monitorInfo = mMap.get(duccId);
+ if(monitorInfo != null) {
+ ArrayList<String> stateSequence = monitorInfo.stateSequence;
+ if(stateSequence != null) {
+ if(stateSequence.contains(JobState.Completing.toString())) {
+ duccLogger.debug(location, duccId, "state: <uncancelable> "+stateSequence);
+ }
+ else if(stateSequence.contains(JobState.Completed.toString())) {
+ duccLogger.debug(location, duccId, "state: <uncancelable> "+stateSequence);
+ }
+ else {
+ duccLogger.debug(location, duccId, "state: <cancelable> "+stateSequence);
+ retVal = true;
+ }
+ }
+ else {
+ duccLogger.warn(location, duccId, "stateSequence: <null>");
+ }
+ }
+ else {
+ duccLogger.warn(location, duccId, "monitorInfo: <null>");
+ }
+ }
+ else {
+ duccLogger.debug(location, duccId, "already canceled");
+ }
+ duccLogger.trace(location, duccId, "exit");
+ return retVal;
+ }
+
+ protected void cancel(DuccId duccId) {
+ String location = "cancel";
+ duccLogger.trace(location, jobid, "enter");
+
+ String userId = System.getProperty("user.name");
+
+ duccLogger.info(location, duccId, userId);
+
+ String java = "/bin/java";
+ String jhome = System.getProperty("java.home");
+ String cp = System.getProperty("java.class.path");
+ String jclass = "org.apache.uima.ducc.cli.DuccManagedReservationCancel";
+ String arg1 = "--"+JobRequestProperties.key_id;
+ String arg2 = ""+duccId;
+ String arg3 = "--"+SpecificationProperties.key_reason;
+ String arg4 = "\"submitter terminated, therefore canceled automatically\"";
+ String arg5 = "--"+SpecificationProperties.key_role_administrator;
+
+ String[] arglistUser = { "-u", userId, "--", jhome+java, "-cp", cp, jclass, arg1, arg2, arg3, arg4, arg5 };
+ String result = DuccAsUser.duckling(userId, arglistUser);
+ duccLogger.warn(location, duccId, result);
+
+ cMap.put(duccId, new Long(System.currentTimeMillis()));
+ tMap.remove(duccId);
+
+ duccLogger.trace(location, jobid, "exit");
+ }
+
+ protected void canceler(long nowMillis) {
+ String location = "canceler";
+ duccLogger.trace(location, jobid, "enter");
+
+ Enumeration<DuccId> keys = tMap.keys();
+ while(keys.hasMoreElements()) {
+ DuccId duccId = keys.nextElement();
+ TrackingInfo ti = tMap.get(duccId);
+ long expiryMillis = ti.time;
+ if(nowMillis > expiryMillis) {
+ if(isCancelable(duccId)) {
+ cancel(duccId);
+ }
+ else {
+ duccLogger.debug(location, duccId, "not cancelable");
+ }
+ }
+ }
+
+ duccLogger.trace(location, jobid, "exit");
+ }
+
+}
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/reservations.jsp
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/reservations.jsp?rev=1458366&r1=1458365&r2=1458366&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/reservations.jsp (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/reservations.jsp Tue Mar 19 16:00:00 2013
@@ -113,7 +113,7 @@ if (table_style.equals("scroll")) {
<th title="The number of resources (machines or shares, depending on class) assigned to this reservation">Allocation</th>
<th title="The combined number of PIDs on the assigned resource(s) for user">User<br>Processes</th>
<th title="The memory allocation per resource for this reservation, in GB">Size</th>
- <th title="The list of of machines assigned to this reservation">List</th>
+ <th title="The machine(s) assigned to this reservation">Host<br>Names</th>
<th title="The user specified description of this reservation">Description</th>
</tr>
</thead>
@@ -145,7 +145,7 @@ if (table_style.equals("classic")) {
<th title="The number of resources (machines or shares, depending on class) assigned to this reservation">Allocation</th>
<th title="The combined number of PIDs on the assigned resource(s) for user">User<br>Processes</th>
<th title="The memory allocation per resource for this reservation, in GB">Size</th>
- <th title="The list of of machines assigned to this reservation">List</th>
+ <th title="The machine(s) assigned to this reservation">Host<br>Names</th>
<th title="The user specified description of this reservation">Description</th>
</tr>
</thead>