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 2017/01/28 14:45:07 UTC
svn commit: r1780704 - in /uima/uima-ducc/trunk:
uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/
uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/authentication/
uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/regi...
Author: degenaro
Date: Sat Jan 28 14:45:07 2017
New Revision: 1780704
URL: http://svn.apache.org/viewvc?rev=1780704&view=rev
Log:
UIMA-5279 DUCC Web Server (WS) may show incorrect values for PgIn and Swap on mixed cgroup cluster
Modified:
uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/DuccProcessConcurrentMap.java
uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/DuccProcessMap.java
uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/DuccWorkJob.java
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/authentication/PamAuthenticate.java
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/authentication/UserAuthenticate.java
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/sort/ServicesHelper.java
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerUtils.java
Modified: uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/DuccProcessConcurrentMap.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/DuccProcessConcurrentMap.java?rev=1780704&r1=1780703&r2=1780704&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/DuccProcessConcurrentMap.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/DuccProcessConcurrentMap.java Sat Jan 28 14:45:07 2017
@@ -335,41 +335,117 @@ public class DuccProcessConcurrentMap ex
return list.size();
}
+ /*
+ * return actual count if all non-negative (all have cgroups)
+ * return -1 if all -1 (none have cgroups)
+ * return -2 if mixed (some do and some don't have cgroups) but retVal would have been == 0
+ * return -3 if mixed (some do and some don't have cgroups) but retVal would have been > 0
+ */
public long getPgInCount() {
long retVal = 0;
+ boolean flagCgroup = false;
+ boolean flagNoCgroup = false;
synchronized(this) {
Iterator<IDuccProcess> iterator = this.values().iterator();
while(iterator.hasNext()) {
IDuccProcess process = iterator.next();
- retVal += process.getMajorFaults();
+ long value = process.getMajorFaults();
+ if(value < 0) {
+ flagNoCgroup = true;
+ }
+ else {
+ flagCgroup = true;
+ retVal += value;
+ }
}
}
+ if(flagCgroup && flagNoCgroup) {
+ if(retVal > 0){
+ retVal = -3;
+ }
+ else {
+ retVal = -2;
+ }
+ }
+ else if(flagNoCgroup) {
+ retVal = -1;
+ }
return retVal;
}
+ /*
+ * return actual count if all non-negative (all have cgroups)
+ * return -1 if all -1 (none have cgroups)
+ * return -2 if mixed (some do and some don't have cgroups) but retVal would have been == 0
+ * return -3 if mixed (some do and some don't have cgroups) but retVal would have been > 0
+ */
public double getSwapUsageGb() {
double retVal = 0;
+ boolean flagCgroup = false;
+ boolean flagNoCgroup = false;
synchronized(this) {
Iterator<IDuccProcess> iterator = this.values().iterator();
while(iterator.hasNext()) {
IDuccProcess process = iterator.next();
- double swap = process.getSwapUsage();
- retVal += swap/Constants.GB;
+ double value = process.getSwapUsage();
+ if(value < 0) {
+ flagNoCgroup = true;
+ }
+ else {
+ flagCgroup = true;
+ retVal += value/Constants.GB;
+ }
+ }
+ }
+ if(flagCgroup && flagNoCgroup) {
+ if(retVal > 0){
+ retVal = -3;
}
+ else {
+ retVal = -2;
+ }
+ }
+ else if(flagNoCgroup) {
+ retVal = -1;
}
return retVal;
}
+ /*
+ * return actual count if all non-negative (all have cgroups)
+ * return -1 if all -1 (none have cgroups)
+ * return -2 if mixed (some do and some don't have cgroups) but retVal would have been == 0
+ * return -3 if mixed (some do and some don't have cgroups) but retVal would have been > 0
+ */
public double getSwapUsageGbMax() {
double retVal = 0;
+ boolean flagCgroup = false;
+ boolean flagNoCgroup = false;
synchronized(this) {
Iterator<IDuccProcess> iterator = this.values().iterator();
while(iterator.hasNext()) {
IDuccProcess process = iterator.next();
- double swap = process.getSwapUsageMax();
- retVal += swap/Constants.GB;
+ double value = process.getSwapUsageMax();
+ if(value < 0) {
+ flagNoCgroup = true;
+ }
+ else {
+ flagCgroup = true;
+ retVal += value/Constants.GB;
+ }
+ }
+ }
+ if(flagCgroup && flagNoCgroup) {
+ if(retVal > 0){
+ retVal = -3;
+ }
+ else {
+ retVal = -2;
}
}
+ else if(flagNoCgroup) {
+ retVal = -1;
+ }
return retVal;
}
Modified: uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/DuccProcessMap.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/DuccProcessMap.java?rev=1780704&r1=1780703&r2=1780704&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/DuccProcessMap.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/DuccProcessMap.java Sat Jan 28 14:45:07 2017
@@ -341,41 +341,117 @@ public class DuccProcessMap extends Tree
return list.size();
}
+ /*
+ * return actual count if all non-negative (all have cgroups)
+ * return -1 if all -1 (none have cgroups)
+ * return -2 if mixed (some do and some don't have cgroups) but retVal would have been == 0
+ * return -3 if mixed (some do and some don't have cgroups) but retVal would have been > 0
+ */
public long getPgInCount() {
long retVal = 0;
+ boolean flagCgroup = false;
+ boolean flagNoCgroup = false;
synchronized(this) {
Iterator<IDuccProcess> iterator = this.values().iterator();
while(iterator.hasNext()) {
IDuccProcess process = iterator.next();
- retVal += process.getMajorFaults();
+ long value = process.getMajorFaults();
+ if(value < 0) {
+ flagNoCgroup = true;
+ }
+ else {
+ flagCgroup = true;
+ retVal += value;
+ }
}
}
+ if(flagCgroup && flagNoCgroup) {
+ if(retVal > 0){
+ retVal = -3;
+ }
+ else {
+ retVal = -2;
+ }
+ }
+ else if(flagNoCgroup) {
+ retVal = -1;
+ }
return retVal;
}
+ /*
+ * return actual count if all non-negative (all have cgroups)
+ * return -1 if all -1 (none have cgroups)
+ * return -2 if mixed (some do and some don't have cgroups) but retVal would have been == 0
+ * return -3 if mixed (some do and some don't have cgroups) but retVal would have been > 0
+ */
public double getSwapUsageGb() {
double retVal = 0;
+ boolean flagCgroup = false;
+ boolean flagNoCgroup = false;
synchronized(this) {
Iterator<IDuccProcess> iterator = this.values().iterator();
while(iterator.hasNext()) {
IDuccProcess process = iterator.next();
- double swap = process.getSwapUsage();
- retVal += swap/Constants.GB;
+ double value = process.getSwapUsage();
+ if(value < 0) {
+ flagNoCgroup = true;
+ }
+ else {
+ flagCgroup = true;
+ retVal += value/Constants.GB;
+ }
+ }
+ }
+ if(flagCgroup && flagNoCgroup) {
+ if(retVal > 0){
+ retVal = -3;
}
+ else {
+ retVal = -2;
+ }
+ }
+ else if(flagNoCgroup) {
+ retVal = -1;
}
return retVal;
}
+ /*
+ * return actual count if all non-negative (all have cgroups)
+ * return -1 if all -1 (none have cgroups)
+ * return -2 if mixed (some do and some don't have cgroups) but retVal would have been == 0
+ * return -3 if mixed (some do and some don't have cgroups) but retVal would have been > 0
+ */
public double getSwapUsageGbMax() {
double retVal = 0;
+ boolean flagCgroup = false;
+ boolean flagNoCgroup = false;
synchronized(this) {
Iterator<IDuccProcess> iterator = this.values().iterator();
while(iterator.hasNext()) {
IDuccProcess process = iterator.next();
- double swap = process.getSwapUsageMax();
- retVal += swap/Constants.GB;
+ double value = process.getSwapUsageMax();
+ if(value < 0) {
+ flagNoCgroup = true;
+ }
+ else {
+ flagCgroup = true;
+ retVal += value/Constants.GB;
+ }
+ }
+ }
+ if(flagCgroup && flagNoCgroup) {
+ if(retVal > 0){
+ retVal = -3;
+ }
+ else {
+ retVal = -2;
}
}
+ else if(flagNoCgroup) {
+ retVal = -1;
+ }
return retVal;
}
Modified: uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/DuccWorkJob.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/DuccWorkJob.java?rev=1780704&r1=1780703&r2=1780704&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/DuccWorkJob.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/DuccWorkJob.java Sat Jan 28 14:45:07 2017
@@ -455,33 +455,81 @@ public class DuccWorkJob extends ADuccWo
return (getAliveProcessCount() > 0);
}
- public long getPgInCount() {
+ // choose the smallest negative value, else return the sum
+ private long merge(long jd, long jp) {
long retVal = 0;
+ if((jd < 0) && (jp < 0)) {
+ if(jd < jp) {
+ retVal = jd;
+ }
+ else {
+ retVal = jp;
+ }
+ }
+ else if(jd < 0) {
+ retVal = jd;
+ }
+ else if(jp < 0) {
+ retVal = jp;
+ }
+ else {
+ retVal = jd+jp;
+ }
+ return retVal;
+ }
+
+ // choose the smallest negative value, else return the sum
+ private double merge(double jd, double jp) {
+ double retVal = 0;
+ if((jd < 0) && (jp < 0)) {
+ if(jd < jp) {
+ retVal = jd;
+ }
+ else {
+ retVal = jp;
+ }
+ }
+ else if(jd < 0) {
+ retVal = jd;
+ }
+ else if(jp < 0) {
+ retVal = jp;
+ }
+ else {
+ retVal = jd+jp;
+ }
+ return retVal;
+ }
+
+ public long getPgInCount() {
+ long jp = 0;
+ long jd = 0;
IDuccProcessMap map = getProcessMap();
if(map != null) {
- retVal += map.getPgInCount();
+ jp = map.getPgInCount();
}
DuccWorkPopDriver driver = getDriver();
if(driver != null) {
map = driver.getProcessMap();
- retVal += map.getPgInCount();
+ jd = map.getPgInCount();
}
+ long retVal = merge(jd, jp);
return retVal;
}
public double getSwapUsageGb() {
- double retVal = 0;
+ double jp = 0;
+ double jd = 0;
IDuccProcessMap map = getProcessMap();
if(map != null) {
- double swap = map.getSwapUsageGb();
- retVal += swap;
+ jp = map.getSwapUsageGb();
}
DuccWorkPopDriver driver = getDriver();
if(driver != null) {
map = driver.getProcessMap();
- double swap = map.getSwapUsageGb();
- retVal += swap;
+ jp = map.getSwapUsageGb();
}
+ double retVal = merge(jd, jp);
return retVal;
}
Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/authentication/PamAuthenticate.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/authentication/PamAuthenticate.java?rev=1780704&r1=1780703&r2=1780704&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/authentication/PamAuthenticate.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/authentication/PamAuthenticate.java Sat Jan 28 14:45:07 2017
@@ -29,6 +29,9 @@ public class PamAuthenticate {
System.out.println(result.name()+" "+text);
}
+ /*
+ * See UserAuthentciate.
+ */
protected void launch(String[] args, boolean verbose) {
try {
if(args == null) {
Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/authentication/UserAuthenticate.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/authentication/UserAuthenticate.java?rev=1780704&r1=1780703&r2=1780704&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/authentication/UserAuthenticate.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/authentication/UserAuthenticate.java Sat Jan 28 14:45:07 2017
@@ -28,6 +28,11 @@ public class UserAuthenticate {
private String failure = "failure";
+ /*
+ * We employ ducc_ling to switch to the target userid.
+ * As the target userid we invoke authenticate with target userid and pw.
+ * Only the userid itself or "root" can succeed, hence the use of ducc_ling.
+ */
public String launch(String[] args) {
String methodName = "launch";
String result = null;
Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/sort/ServicesHelper.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/sort/ServicesHelper.java?rev=1780704&r1=1780703&r2=1780704&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/sort/ServicesHelper.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/sort/ServicesHelper.java Sat Jan 28 14:45:07 2017
@@ -90,48 +90,126 @@ public class ServicesHelper {
return retVal;
}
+ /*
+ * return actual count if all non-negative (all have cgroups)
+ * return -1 if all -1 (none have cgroups)
+ * return -2 if mixed (some do and some don't have cgroups) but retVal would have been == 0
+ * return -3 if mixed (some do and some don't have cgroups) but retVal would have been > 0
+ */
public long getPgIn(IServiceAdapter serviceAdapter) {
long retVal = 0;
+ boolean flagCgroup = false;
+ boolean flagNoCgroup = false;
List<DuccWorkJob> servicesList = getServicesList(serviceAdapter);
for(DuccWorkJob service : servicesList) {
IDuccProcessMap map = service.getProcessMap();
for(DuccId key : map.keySet()) {
IDuccProcess process = map.get(key);
if(process.isActive()) {
- retVal += process.getMajorFaults();
+ long value = process.getMajorFaults();
+ if(value < 0) {
+ flagNoCgroup = true;
+ }
+ else {
+ flagCgroup = true;
+ retVal += value;
+ }
}
}
}
+ if(flagCgroup && flagNoCgroup) {
+ if(retVal > 0){
+ retVal = -3;
+ }
+ else {
+ retVal = -2;
+ }
+ }
+ else if(flagNoCgroup) {
+ retVal = -1;
+ }
return retVal;
}
+ /*
+ * return actual count if all non-negative (all have cgroups)
+ * return -1 if all -1 (none have cgroups)
+ * return -2 if mixed (some do and some don't have cgroups) but retVal would have been == 0
+ * return -3 if mixed (some do and some don't have cgroups) but retVal would have been > 0
+ */
public long getSwap(IServiceAdapter serviceAdapter) {
long retVal = 0;
+ boolean flagCgroup = false;
+ boolean flagNoCgroup = false;
List<DuccWorkJob> servicesList = getServicesList(serviceAdapter);
for(DuccWorkJob service : servicesList) {
IDuccProcessMap map = service.getProcessMap();
for(DuccId key : map.keySet()) {
IDuccProcess process = map.get(key);
if(process.isActive()) {
- retVal += process.getSwapUsage();
+ long value = process.getSwapUsage();
+ if(value < 0) {
+ flagNoCgroup = true;
+ }
+ else {
+ flagCgroup = true;
+ retVal += value;
+ }
}
}
}
+ if(flagCgroup && flagNoCgroup) {
+ if(retVal > 0){
+ retVal = -3;
+ }
+ else {
+ retVal = -2;
+ }
+ }
+ else if(flagNoCgroup) {
+ retVal = -1;
+ }
return retVal;
}
+ /*
+ * return actual count if all non-negative (all have cgroups)
+ * return -1 if all -1 (none have cgroups)
+ * return -2 if mixed (some do and some don't have cgroups) but retVal would have been == 0
+ * return -3 if mixed (some do and some don't have cgroups) but retVal would have been > 0
+ */
public long getSwapMax(IServiceAdapter serviceAdapter) {
long retVal = 0;
+ boolean flagCgroup = false;
+ boolean flagNoCgroup = false;
List<DuccWorkJob> servicesList = getServicesList(serviceAdapter);
for(DuccWorkJob service : servicesList) {
IDuccProcessMap map = service.getProcessMap();
for(DuccId key : map.keySet()) {
IDuccProcess process = map.get(key);
if(process.isActive()) {
- retVal += process.getSwapUsageMax();
+ long value = process.getSwapUsageMax();
+ if(value < 0) {
+ flagNoCgroup = true;
+ }
+ else {
+ flagCgroup = true;
+ retVal += value;
+ }
}
}
}
+ if(flagCgroup && flagNoCgroup) {
+ if(retVal > 0){
+ retVal = -3;
+ }
+ else {
+ retVal = -2;
+ }
+ }
+ else if(flagNoCgroup) {
+ retVal = -1;
+ }
return retVal;
}
}
Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java?rev=1780704&r1=1780703&r2=1780704&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java Sat Jan 28 14:45:07 2017
@@ -75,6 +75,9 @@ public abstract class DuccAbstractHandle
public static DuccWebAdministrators duccWebAdministrators = DuccWebAdministrators.getInstance();
public static DuccWebSessionManager duccWebSessionManager = DuccWebSessionManager.getInstance();
+
+ public final String notAvailable = "N/A";
+ public final String inc = "INC";
public final String duccUimaInitializationReport = "uima-initialization-report.html";
Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java?rev=1780704&r1=1780703&r2=1780704&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java Sat Jan 28 14:45:07 2017
@@ -144,9 +144,7 @@ public class DuccHandler extends DuccAbs
private enum DetailsType { Job, Reservation, Service };
private enum AllocationType { JD, MR, SPC, SPU, UIMA };
private enum LogType { POP, UIMA };
-
- private String notAvailable = "N/A";
-
+
private DuccAuthenticator duccAuthenticator = DuccAuthenticator.getInstance();
private String duccVersion = duccContext+"/version";
Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java?rev=1780704&r1=1780703&r2=1780704&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java Sat Jan 28 14:45:07 2017
@@ -53,7 +53,6 @@ import org.apache.uima.ducc.common.utils
import org.apache.uima.ducc.common.utils.TimeStamp;
import org.apache.uima.ducc.common.utils.id.DuccId;
import org.apache.uima.ducc.orchestrator.jd.scheduler.JdReservation;
-import org.apache.uima.ducc.transport.Constants;
import org.apache.uima.ducc.transport.event.common.DuccWorkJob;
import org.apache.uima.ducc.transport.event.common.DuccWorkReservation;
import org.apache.uima.ducc.transport.event.common.IDuccPerWorkItemStatistics;
@@ -306,14 +305,31 @@ public class DuccHandlerClassic extends
}
catch(Exception e) {
}
- double swapping = job.getSwapUsageGbMax();
- if((swapping * faults) > 0) {
- sb.append("<span class=\"health_red\""+">");
- }
- else {
- sb.append("<span class=\"health_black\""+">");
+ 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(faults);
sb.append("</span>");
sb.append("</td>");
// Swap
@@ -321,18 +337,41 @@ public class DuccHandlerClassic extends
String swapSizeDisplay = "";
String swapSizeHover = "";
title = "";
- double swapBytes = 0;
- swapBytes = DuccHandlerUtils.getSwapSizeBytes(job);
- swapSizeDisplay = DuccHandlerUtils.getSwapSizeDisplay(swapBytes);
- swapSizeHover = DuccHandlerUtils.getSwapSizeHover(swapBytes);
- title = "title="+"\""+swapSizeHover+"\"";
- if(swapBytes > 0) {
- sb.append("<span "+title+" "+"class=\"health_red\""+">");
+ double swap = 0;
+ if(job.isCompleted()) {
+ swap = job.getSwapUsageGbMax();
}
else {
- sb.append("<span "+title+" "+"class=\"health_black\""+">");
+ 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(swapSizeDisplay);
sb.append("</span>");
sb.append("</td>");
// Memory
@@ -788,38 +827,78 @@ public class DuccHandlerClassic extends
}
catch(Exception e) {
}
- double swapping = job.getSwapUsageGbMax();
- if((swapping * faults) > 0) {
- sb.append("<span class=\"health_red\""+">");
- }
- else {
- sb.append("<span class=\"health_black\""+">");
+ 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(faults);
sb.append("</span>");
}
sb.append("</td>");
// Swap
sb.append("<td align=\"right\">");
- String swapSizeDisplay = "";
- String swapSizeHover = "";
- title = "";
- double swapBytes = 0;
if(duccwork instanceof DuccWorkJob) {
DuccWorkJob job = (DuccWorkJob) duccwork;
- swapBytes = DuccHandlerUtils.getSwapSizeBytes(job);
- 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\""+">");
+ 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(swapSizeDisplay);
- sb.append("</span>");
sb.append("</td>");
// Memory
IDuccSchedulingInfo si;
@@ -1094,15 +1173,31 @@ public class DuccHandlerClassic extends
}
catch(Exception e) {
}
- double swapping = service.getSwap();
- swapping = swapping/Constants.GB;
- if((swapping * faults) > 0) {
- sb.append("<span class=\"health_red\""+">");
- }
- else {
- sb.append("<span class=\"health_black\""+">");
+ 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 = service.getSwap();
+ if((swapping * faults) > 0) {
+ sb.append("<span class=\"health_red\""+">");
+ }
+ else {
+ sb.append("<span class=\"health_black\""+">");
+ }
+ sb.append(faults);
+ break;
}
- sb.append(faults);
sb.append("</span>");
sb.append("</td>");
// Swap
@@ -1110,18 +1205,35 @@ public class DuccHandlerClassic extends
String swapSizeDisplay = "";
String swapSizeHover = "";
String title = "";
- double swapBytes = 0;
- swapBytes = service.getSwap();
- 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\""+">");
+ double swap = service.getSwap();
+ 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;
+ 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(swapSizeDisplay);
sb.append("</span>");
sb.append("</td>");
// Size
Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java?rev=1780704&r1=1780703&r2=1780704&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java Sat Jan 28 14:45:07 2017
@@ -57,7 +57,6 @@ import org.apache.uima.ducc.common.utils
import org.apache.uima.ducc.common.utils.TimeStamp;
import org.apache.uima.ducc.common.utils.id.DuccId;
import org.apache.uima.ducc.orchestrator.jd.scheduler.JdReservation;
-import org.apache.uima.ducc.transport.Constants;
import org.apache.uima.ducc.transport.event.common.DuccWorkJob;
import org.apache.uima.ducc.transport.event.common.DuccWorkReservation;
import org.apache.uima.ducc.transport.event.common.IDuccPerWorkItemStatistics;
@@ -332,42 +331,86 @@ public class DuccHandlerJsonFormat exten
// Pgin
sb = new StringBuffer();
sb.append("<span>");
+ //
long faults = 0;
try {
faults = job.getPgInCount();
}
catch(Exception e) {
}
- double swapping = job.getSwapUsageGbMax();
- if((swapping * faults) > 0) {
- sb.append("<span class=\"health_red\""+">");
- }
- else {
- sb.append("<span class=\"health_black\""+">");
+ 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(faults);
sb.append("</span>");
+ //
sb.append("</span>");
row.add(new JsonPrimitive(sb.toString()));
// Swap
sb = new StringBuffer();
sb.append("<span>");
+ //
String swapSizeDisplay = "";
String swapSizeHover = "";
title = "";
- double swapBytes = 0;
- swapBytes = DuccHandlerUtils.getSwapSizeBytes(job);
- swapSizeDisplay = DuccHandlerUtils.getSwapSizeDisplay(swapBytes);
- swapSizeHover = DuccHandlerUtils.getSwapSizeHover(swapBytes);
- title = "title="+"\""+swapSizeHover+"\"";
- if(swapBytes > 0) {
- sb.append("<span "+title+" "+"class=\"health_red\""+">");
+ double swap = 0;
+ if(job.isCompleted()) {
+ swap = job.getSwapUsageGbMax();
}
else {
- sb.append("<span "+title+" "+"class=\"health_black\""+">");
+ 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(swapSizeDisplay);
sb.append("</span>");
+ //
sb.append("</span>");
row.add(new JsonPrimitive(sb.toString()));
// Memory
@@ -878,6 +921,7 @@ public class DuccHandlerJsonFormat exten
// PgIn
sb = new StringBuffer();
sb.append("<span>");
+ //
if(duccwork instanceof DuccWorkJob) {
DuccWorkJob job = (DuccWorkJob) duccwork;
long faults = 0;
@@ -886,40 +930,83 @@ public class DuccHandlerJsonFormat exten
}
catch(Exception e) {
}
- double swapping = job.getSwapUsageGbMax();
- if((swapping * faults) > 0) {
- sb.append("<span class=\"health_red\""+">");
- }
- else {
- sb.append("<span class=\"health_black\""+">");
+ 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(faults);
sb.append("</span>");
}
+ //
sb.append("</span>");
row.add(new JsonPrimitive(sb.toString()));
// Swap
sb = new StringBuffer();
sb.append("<span>");
- String swapSizeDisplay = "";
- String swapSizeHover = "";
- title = "";
- double swapBytes = 0;
+ //
if(duccwork instanceof DuccWorkJob) {
DuccWorkJob job = (DuccWorkJob) duccwork;
- swapBytes = DuccHandlerUtils.getSwapSizeBytes(job);
- 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\""+">");
+ 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(swapSizeDisplay);
- sb.append("</span>");
+ //
sb.append("</span>");
row.add(new JsonPrimitive(sb.toString()));
// Memory
@@ -1236,42 +1323,80 @@ public class DuccHandlerJsonFormat exten
// Pgin
col = new StringBuffer();
col.append("<span>");
+ //
long faults = 0;
try {
faults = service.getPgIn();
}
catch(Exception e) {
}
- double swapping = service.getSwap();
- swapping = swapping/Constants.GB;
- if((swapping * faults) > 0) {
- col.append("<span class=\"health_red\""+">");
- }
- else {
- col.append("<span class=\"health_black\""+">");
+ int ifaults = (int)faults;
+ switch(ifaults) {
+ case -3: // (some do and some don't have cgroups) but retVal would have been > 0
+ col.append("<span title=\"incomplete\" class=\"health_red\""+">");
+ col.append(inc);
+ break;
+ case -2: // (some do and some don't have cgroups) but retVal would have been == 0
+ col.append("<span title=\"incomplete\" class=\"health_black\""+">");
+ col.append(inc);
+ break;
+ case -1: // (none have cgroups)
+ col.append("<span title=\"not available\" class=\"health_black\""+">");
+ col.append(notAvailable);
+ break;
+ default: // (all have cgroups)
+ double swapping = service.getSwap();
+ if((swapping * faults) > 0) {
+ col.append("<span class=\"health_red\""+">");
+ }
+ else {
+ col.append("<span class=\"health_black\""+">");
+ }
+ col.append(faults);
+ break;
}
- col.append(faults);
+ col.append("</span>");
+ //
col.append("</span>");
row.add(new JsonPrimitive(col.toString()));
// Swap
col = new StringBuffer();
col.append("<span>");
+ //
String swapSizeDisplay = "";
String swapSizeHover = "";
String title = "";
- double swapBytes = 0;
- swapBytes = service.getSwap();
- swapSizeDisplay = DuccHandlerUtils.getSwapSizeDisplay(swapBytes);
- swapSizeHover = DuccHandlerUtils.getSwapSizeHover(swapBytes);
- title = "title="+"\""+swapSizeHover+"\"";
- if(swapBytes > 0) {
- col.append("<span "+title+" "+"class=\"health_red\""+">");
- }
- else {
- col.append("<span "+title+" "+"class=\"health_black\""+">");
+ double swap = service.getSwap();
+ int iswap = (int)swap;
+ switch(iswap) {
+ case -3: // (some do and some don't have cgroups) but retVal would have been > 0
+ col.append("<span title=\"incomplete\" class=\"health_red\""+">");
+ col.append(inc);
+ break;
+ case -2: // (some do and some don't have cgroups) but retVal would have been == 0
+ col.append("<span title=\"incomplete\" class=\"health_black\""+">");
+ col.append(inc);
+ break;
+ case -1: // (none have cgroups)
+ col.append("<span title=\"not available\" class=\"health_black\""+">");
+ col.append(notAvailable);
+ break;
+ default: // (all have cgroups)
+ double swapBytes = swap;
+ swapSizeDisplay = DuccHandlerUtils.getSwapSizeDisplay(swapBytes);
+ swapSizeHover = DuccHandlerUtils.getSwapSizeHover(swapBytes);
+ title = "title="+"\""+swapSizeHover+"\"";
+ if(swapBytes > 0) {
+ col.append("<span "+title+" "+"class=\"health_red\""+">");
+ }
+ else {
+ col.append("<span "+title+" "+"class=\"health_black\""+">");
+ }
+ col.append(swapSizeDisplay);
+ break;
}
- col.append(swapSizeDisplay);
col.append("</span>");
+ //
col.append("</span>");
row.add(new JsonPrimitive(col.toString()));
// Size
Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerUtils.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerUtils.java?rev=1780704&r1=1780703&r2=1780704&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerUtils.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerUtils.java Sat Jan 28 14:45:07 2017
@@ -20,9 +20,6 @@ package org.apache.uima.ducc.ws.server;
import java.text.DecimalFormat;
-import org.apache.uima.ducc.transport.event.common.IDuccWorkJob;
-
-
public class DuccHandlerUtils {
public static String warn(String text) {
@@ -75,14 +72,6 @@ public class DuccHandlerUtils {
// *****
- public static double getSwapSizeBytes(IDuccWorkJob job) {
- double swapBytes = job.getSwapUsageGb()*GB;
- if(job.isCompleted()) {
- swapBytes = job.getSwapUsageGbMax()*GB;
- }
- return swapBytes;
- }
-
private static DecimalFormat formatter = new DecimalFormat("###0.0");
public static String getSwapSizeDisplay(double swapBytes) {
@@ -90,9 +79,9 @@ public class DuccHandlerUtils {
return retVal;
}
- private static double GB = Math.pow(10,9);
- private static double MB = Math.pow(10,6);
- private static double KB = Math.pow(10,3);
+ public static double GB = Math.pow(10,9);
+ public static double MB = Math.pow(10,6);
+ public static double KB = Math.pow(10,3);
public static String getSwapSizeHover(double swapBytes) {
String retVal = null;