Author: degenaro
Date: Tue May 31 17:32:31 2016
New Revision: 1746305

URL: http://svn.apache.org/viewvc?rev=1746305&view=rev
Log:
UIMA-4923 DUCC Web Server (WS) should not display nodes that have been removed 
from service on Machines page

- Code simplifications
- Use sort name to insure uniqueness between defined and agent reported nodes

Modified:
    
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/DuccMachinesData.java
    
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/DuccMachinesDataHelper.java
    
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/MachineInfo.java
    
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/WebServerComponent.java
    
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java
    
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java
    
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/types/NodeId.java

Modified: 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/DuccMachinesData.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/DuccMachinesData.java?rev=1746305&r1=1746304&r2=1746305&view=diff
==============================================================================
--- 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/DuccMachinesData.java
 (original)
+++ 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/DuccMachinesData.java
 Tue May 31 17:32:31 2016
@@ -23,6 +23,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Properties;
 import java.util.TreeMap;
 import java.util.concurrent.ConcurrentSkipListMap;
 import java.util.concurrent.atomic.AtomicLong;
@@ -42,8 +43,10 @@ import org.apache.uima.ducc.common.utils
 import org.apache.uima.ducc.common.utils.id.DuccId;
 import org.apache.uima.ducc.transport.event.NodeMetricsUpdateDuccEvent;
 import org.apache.uima.ducc.transport.event.ProcessInfo;
+import org.apache.uima.ducc.ws.MachineInfo.MachineStatus;
 import org.apache.uima.ducc.ws.db.DbQuery;
 import org.apache.uima.ducc.ws.db.IDbMachine;
+import org.apache.uima.ducc.ws.server.DuccWebProperties;
 import org.apache.uima.ducc.ws.types.Ip;
 import org.apache.uima.ducc.ws.types.NodeId;
 import org.apache.uima.ducc.ws.types.UserId;
@@ -95,16 +98,120 @@ public class DuccMachinesData {
                return retVal;
        }
        
+       private long down_fudge = 10;
+       private long DOWN_AFTER_SECONDS = 
WebServerComponent.updateIntervalSeconds + down_fudge;
+       private long SECONDS_PER_MILLI = 1000;
+       
+       private long getAgentMillisMIA() {
+               String location = "getAgentMillisMIA";
+               long millisMIA = DOWN_AFTER_SECONDS*SECONDS_PER_MILLI;
+               Properties properties = DuccWebProperties.get();
+               String s_tolerance = 
properties.getProperty("ducc.rm.node.stability");
+               String s_rate = 
properties.getProperty("ducc.agent.node.metrics.publish.rate");
+               try {
+                       long tolerance = Long.parseLong(s_tolerance.trim());
+                       long rate = Long.parseLong(s_rate.trim());
+                       long secondsRM = (tolerance * rate) / SECONDS_PER_MILLI;
+                       logger.trace(location, jobid, 
"default:"+DOWN_AFTER_SECONDS+" "+"secondsRM:"+secondsRM);
+                       if(DOWN_AFTER_SECONDS < secondsRM) {
+                               millisMIA = secondsRM * SECONDS_PER_MILLI;
+                       }
+               }
+               catch(Throwable t) {
+                       logger.warn(location, jobid, t);
+               }
+               return millisMIA;
+       }
+       
+       private void determineStatus(MachineInfo mi, IDbMachine dbMachine) {
+               String location = "determineStatus";
+               if(dbMachine != null) {
+                       // determine defined/down/up based on DB
+                       Boolean responsive = dbMachine.getResponsive();
+                       Boolean online = dbMachine.getOnline();
+                       Boolean blacklisted = dbMachine.getBlacklisted();
+                       MachineStatus machineStatus = MachineStatus.Down;
+                       if(responsive) {
+                               if(online) {
+                                       if(!blacklisted) {
+                                               machineStatus = 
MachineStatus.Up;
+                                       }
+                               }
+                       }
+                       mi.setMachineStatus(machineStatus);
+                       mi.setResponsive(responsive);
+                       mi.setOnline(online);
+                       mi.setBlacklisted(blacklisted);
+                       StringBuffer sb = new StringBuffer();
+                       sb.append(mi.getName());
+                       sb.append(" ");
+                       sb.append(mi.getMachineStatus());
+                       sb.append(" ");
+                       sb.append(mi.getMachineStatusReason());
+                       sb.append(" ");
+                       String text = sb.toString().trim();
+                       logger.trace(location, jobid, text);
+                       mi.setQuantum(dbMachine.getQuantum());
+               }
+               else {
+                       // determine defined/down/up based on Agent
+                       if(mi.getElapsedSeconds() < 0) {
+                               mi.setMachineStatus(MachineStatus.Defined);
+                       }
+                       else if(mi.isExpired(getAgentMillisMIA())) {
+                               mi.setMachineStatus(MachineStatus.Down);
+                       }
+                       else {
+                               mi.setMachineStatus(MachineStatus.Up);
+                       }
+               }
+       }
+       
+       private Map<String, IDbMachine> getDbMapMachines() {
+               String location = "getDbMapMachines";
+               Map<String, IDbMachine> retVal = null;
+               try {
+                       DbQuery dbQuery = DbQuery.getInstance();
+                       //if(!dbQuery.isEnabled()) {
+                               retVal = dbQuery.getMapMachines();
+                       //}
+               }
+               catch(Exception e) {
+                       logger.error(location, jobid, e);
+               }
+               return retVal;
+       }
+       
+       private IDbMachine getDbMachine(Map<String, IDbMachine> dbMapMachines, 
NodeId nodeId) {
+               String location = "getDbMachine";
+               IDbMachine retVal = null;
+               try {
+                       if(dbMapMachines != null) {
+                               if(nodeId != null) {
+                                       String name = nodeId.getLongName();
+                                       retVal = dbMapMachines.get(name);
+                               }
+                       }
+               }
+               catch(Exception e) {
+                       logger.error(location, jobid, e);
+               }
+               return retVal;
+       }
+       
        public void updateSortedMachines() {
                String location = "updateSortedMachines";
                logger.debug(location, jobid, "start");
                try {
                        ConcurrentSkipListMap<MachineInfo,NodeId> map = new 
ConcurrentSkipListMap<MachineInfo,NodeId>();
+                       Map<String, IDbMachine> dbMapMachines = 
getDbMapMachines();
                        for(Entry<NodeId,MachineInfo> entry : 
unsortedMachines.entrySet()) {
-                               NodeId value = entry.getKey();
-                               MachineInfo key = entry.getValue();
-                               map.put(key, value);
-                               logger.debug(location, jobid, "put: "+value);
+                               NodeId nodeId = entry.getKey();
+                               IDbMachine dbMachine = 
getDbMachine(dbMapMachines, nodeId);
+                               MachineInfo machineInfo = entry.getValue();
+                               determineStatus(machineInfo, dbMachine);
+                               map.put(machineInfo, nodeId);
+                               logger.debug(location, jobid, "put: "+nodeId);
                        }
                        sortedMachines = map;
                        updateMachineFactsList();
@@ -225,17 +332,30 @@ public class DuccMachinesData {
                return cpu;
        }
        
-       public void put(DatedNodeMetricsUpdateDuccEvent duccEvent) {
+       /**
+        * 
+        * @param duccEvent
+        * @return true is new node or false if already known node
+        * 
+        * Put new or updated node metrics into map of Agent node metric reports
+        */
+       public boolean put(DatedNodeMetricsUpdateDuccEvent duccEvent) {
+               boolean retVal = true;
                String location = "put";
                MachineSummaryInfo msi = new MachineSummaryInfo();
                NodeMetricsUpdateDuccEvent nodeMetrics = 
duccEvent.getNodeMetricsUpdateDuccEvent();
                Ip ip = new Ip(nodeMetrics.getNodeIdentity().getIp().trim());
                TreeMap<String, NodeUsersInfo> map = 
nodeMetrics.getNodeUsersMap();
                if(map != null) {
-                       ipToNodeUsersInfoMap.put(ip.toString(), map);
+                       String ipString = ip.toString();
+                       ipToNodeUsersInfoMap.put(ipString, map);
                }
                String machineName = 
nodeMetrics.getNodeIdentity().getName().trim();
                NodeId nodeId = new NodeId(machineName);
+               // determine if this is new machine (true) or already known 
machine (false)
+               if(ipToNameMap.containsKey(ip)) {
+                       retVal = false;
+               }
                ipToNameMap.put(ip,nodeId);
                nameToIpMap.put(nodeId,ip);
                // mem: total
@@ -305,6 +425,7 @@ public class DuccMachinesData {
                putMachine(current);
                updateTotals(nodeId,msi);
                setPublished();
+               return retVal;
        }
        
        public List<String> getPids(Ip ip, UserId user) {
@@ -400,20 +521,6 @@ public class DuccMachinesData {
                return retVal;
        }
        
-       private void enhance(MachineFacts facts, Map<String, IDbMachine> 
dbMachineMap) {
-               if(facts != null) {
-                       if(dbMachineMap != null) {
-                               String[] machineStatus = 
DuccMachinesDataHelper.getMachineStatus(facts, dbMachineMap);
-                               facts.status = machineStatus[0];
-                               facts.statusReason = machineStatus[1];
-                               String reserveSize = 
DuccMachinesDataHelper.getMachineReserveSize(facts, dbMachineMap);
-                               facts.memReserve = reserveSize;
-                               String quantum = 
DuccMachinesDataHelper.getMachineQuantum(facts, dbMachineMap);
-                               facts.quantum = quantum;
-                       }
-               }
-       }
-       
        /**
         * Create a cached data set employed by the WS 
         * to display the System -> Machines page.  The
@@ -485,7 +592,6 @@ public class DuccMachinesData {
         * in part on the data comprising the ducc.nodes file.
         */
        private void updateMachineFactsListAgent() {
-               
                MachineFactsList factsList = new MachineFactsList();
                long quantum = getQuantum();
                ConcurrentSkipListMap<MachineInfo,NodeId> sortedMachines = 
getSortedMachines();
@@ -493,7 +599,9 @@ public class DuccMachinesData {
                iterator = sortedMachines.keySet().iterator();
                while(iterator.hasNext()) {
                        MachineInfo machineInfo = iterator.next();
-                       String status = machineInfo.getStatus();
+                       MachineStatus machineStatus = 
machineInfo.getMachineStatus();
+                       String status = machineStatus.getLowerCaseName();
+                       String statusReason = "";
                        String ip = machineInfo.getIp();
                        String name = machineInfo.getName();
                        String memTotal = calculateMem(quantum, 
machineInfo.getMemTotal());
@@ -505,7 +613,7 @@ public class DuccMachinesData {
                        boolean cGroups = machineInfo.getCgroups();
                        List<String> aliens = machineInfo.getAliens();
                        String heartbeat = ""+machineInfo.getElapsed();
-                       MachineFacts facts = new 
MachineFacts(status,ip,name,memTotal,memFree,swapInuse,swapDelta,swapFree,cpu,cGroups,aliens,heartbeat);
+                       MachineFacts facts = new 
MachineFacts(status,statusReason,ip,name,memTotal,memFree,swapInuse,swapDelta,swapFree,cpu,cGroups,aliens,heartbeat);
                        // when not using DB, memResrve == memTotal
                        facts.memReserve = memTotal;
                        factsList.add(facts);
@@ -520,6 +628,7 @@ public class DuccMachinesData {
         * in part on the data comprising the ducc.nodes file.
         */
        private void updateMachineFactsListDb() {
+               String location = "updateMachineFactsListDb";
                // The returnable
                MachineFactsList mfl = new MachineFactsList();
                // Working map used to generate the returnable
@@ -543,11 +652,14 @@ public class DuccMachinesData {
                // Initialize returnable with "defined" machines
                ArrayList<String> duccNodes = DuccNodes.getInstance().get();
                for(String name : duccNodes) {
+                       NodeId nodeId = new NodeId(name);;
+                       String shortName = nodeId.getShortName();
                        // skip defined machine if it already appears in DB
-                       if(knownShortNames.contains(name)) {
+                       if(knownShortNames.contains(shortName)) {
                                continue;
                        }
                        String status = "defined";
+                       String statusReason = "";
                        String ip = "";
                        String memTotal = "";
                        String memFree = "";
@@ -558,13 +670,15 @@ public class DuccMachinesData {
                        boolean cGroups = false;
                        List<String> aliens = new ArrayList<String>();
                        String heartbeat = "";
-                       MachineFacts facts = new 
MachineFacts(status,ip,name,memTotal,memFree,swapInuse,swapDelta,swapFree,cpu,cGroups,aliens,heartbeat);
+                       MachineFacts facts = new 
MachineFacts(status,statusReason,ip,name,memTotal,memFree,swapInuse,swapDelta,swapFree,cpu,cGroups,aliens,heartbeat);
                        mfl.add(facts);
                }
                // Augment returnable with data from Agents & RM (from DB)
                for(Entry<MachineInfo, NodeId> entry : 
dbSortedMachines.entrySet()) {
                        MachineInfo machineInfo = entry.getKey();
-                       String status = machineInfo.getStatus();
+                       MachineStatus machineStatus = 
machineInfo.getMachineStatus();
+                       String status = machineStatus.getLowerCaseName();
+                       String statusReason = 
machineInfo.getMachineStatusReason();
                        String ip = machineInfo.getIp();
                        String name = machineInfo.getName();
                        String memTotal = machineInfo.getMemTotal();
@@ -576,9 +690,10 @@ public class DuccMachinesData {
                        boolean cGroups = machineInfo.getCgroups();
                        List<String> aliens = machineInfo.getAliens();
                        String heartbeat = ""+machineInfo.getElapsed();
-                       MachineFacts facts = new 
MachineFacts(status,ip,name,memTotal,memFree,swapInuse,swapDelta,swapFree,cpu,cGroups,aliens,heartbeat);
-                       // Add info from Agent that DB does not have
-                       enhance(facts, dbMapMachines);
+                       MachineFacts facts = new 
MachineFacts(status,statusReason,ip,name,memTotal,memFree,swapInuse,swapDelta,swapFree,cpu,cGroups,aliens,heartbeat);
+                       facts.memReserve = machineInfo.getMemTotal();
+                       facts.quantum = ""+machineInfo.getQuantum();
+                       logger.trace(location, jobid, facts.status+" 
"+facts.statusReason);
                        mfl.add(facts);
                }
                machineFactsList = mfl;

Modified: 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/DuccMachinesDataHelper.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/DuccMachinesDataHelper.java?rev=1746305&r1=1746304&r2=1746305&view=diff
==============================================================================
--- 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/DuccMachinesDataHelper.java
 (original)
+++ 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/DuccMachinesDataHelper.java
 Tue May 31 17:32:31 2016
@@ -18,21 +18,10 @@
 */
 package org.apache.uima.ducc.ws;
 
-import java.util.Map;
-
 import org.apache.uima.ducc.cli.ws.json.MachineFacts;
 import org.apache.uima.ducc.cli.ws.json.MachineFactsList;
-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.ws.db.IDbMachine;
 
 public class DuccMachinesDataHelper {
-
-       private static DuccLogger logger = 
DuccLoggerComponents.getWsLogger(DuccMachinesDataHelper.class.getName());
-       private static DuccId jobid = null;
-       
-       public enum MachineStatus { up, down, unknown };
        
        /**
         * @param factsList = list of machine facts, each entry comprising one 
machine
@@ -70,136 +59,5 @@ public class DuccMachinesDataHelper {
                }
                return retVal;
        }
-       
-       private static String[] getMachineStatusWs(MachineFacts facts, 
Map<String, IDbMachine> dbMachineMap) {
-               String location = "getMachineStatusWs";
-               String[] retVal = null;
-               if(facts != null) {
-                       if(facts.status != null) {
-                               if(facts.status.equals("up")) {
-                                       retVal = new String[2];
-                                       retVal[0] = facts.status;
-                                       retVal[1] = "";
-                                       logger.debug(location, jobid, 
retVal[0]+" "+retVal[1]);
-                               }
-                               else if(facts.status.equals("down")) {
-                                       retVal = new String[2];
-                                       retVal[0] = facts.status;
-                                       retVal[1] = "heartbeat=missing";
-                                       logger.debug(location, jobid, 
retVal[0]+" "+retVal[1]);
-                               }
-                       }
-               }
-               return retVal;
-       }
-       
-       // up: responsive == true && online == true && blacklisted == false
-       
-       private static String[] getMachineStatusDb(MachineFacts facts, 
Map<String, IDbMachine> dbMachineMap) {
-               String location = "getMachineStatusDb";
-               String[] retVal = null;
-               if(facts != null) {
-                       if(facts.status != null) {
-                               if(dbMachineMap != null) {
-                                       IDbMachine dbMachine = 
dbMachineMap.get(facts.name);
-                                       if(dbMachine != null) {
-                                               Boolean responsive = 
dbMachine.getResponsive();
-                                               Boolean online = 
dbMachine.getOnline();
-                                               Boolean blacklisted = 
dbMachine.getBlacklisted();
-                                               StringBuffer sb = new 
StringBuffer();
-                                               
sb.append("responsive="+responsive);
-                                               sb.append(" ");
-                                               sb.append("online="+online);
-                                               sb.append(" ");
-                                               
sb.append("blacklisted="+blacklisted);
-                                               retVal = new String[2];
-                                               retVal[0] = 
MachineStatus.down.name();
-                                               retVal[1] = sb.toString();
-                                               if(responsive) {
-                                                       if(online) {
-                                                               
if(!blacklisted) {
-                                                                       
retVal[0] = MachineStatus.up.name();
-                                                               }
-                                                       }
-                                               }
-                                               logger.debug(location, jobid, 
sb);
-                                       }
-                               }
-                       }
-               }
-               return retVal;
-       }
-       
-       public static String[] getMachineStatus(MachineFacts facts, Map<String, 
IDbMachine> dbMachineMap) {
-               String[] retVal = null;
-               if(retVal == null) {
-                       retVal = getMachineStatusDb(facts, dbMachineMap);
-               }
-               if(retVal == null) {
-                       retVal = getMachineStatusWs(facts, dbMachineMap);
-               }
-               if(retVal == null) {
-                       retVal = new String[2];
-                       retVal[0] = facts.status;
-                       retVal[1] = "";
-               }
-               return retVal;
-       }
-       
-       private static String getMachineReserveSizeWs(MachineFacts facts, 
Map<String, IDbMachine> dbMachineMap) {
-               String location = "getMachineReserveSizeWs";
-               String retVal = null;
-               if(facts != null) {
-                       if(!facts.status.equals("defined")) {
-                               retVal = facts.memFree;
-                               logger.debug(location, jobid, retVal);
-                       }
-               }
-               return retVal;
-       }
-       
-       // reserve size: quantum * shareOrder
-       
-       private static String getMachineReserveSizeDb(MachineFacts facts, 
Map<String, IDbMachine> dbMachineMap) {
-               String location = "getMachineReserveSizeDb";
-               String retVal = null;
-               if(dbMachineMap != null) {
-                       IDbMachine dbMachine = dbMachineMap.get(facts.name);
-                       if(dbMachine != null) {
-                               retVal = 
""+dbMachine.getQuantum()*dbMachine.getShareOrder();
-                               logger.debug(location, jobid, retVal);
-                       }
-               }
-               return retVal;
-       }
-       
-       public static String getMachineReserveSize(MachineFacts facts, 
Map<String, IDbMachine> dbMachineMap) {
-               String retVal = null;
-               if(retVal == null) {
-                       retVal = getMachineReserveSizeDb(facts, dbMachineMap);
-               }
-               if(retVal == null) {
-                       retVal = getMachineReserveSizeWs(facts, dbMachineMap);
-               }
-               if(retVal == null) {
-                       retVal = "0";
-               }
-               return retVal;
-       }
-       
-       // quantum
-       
-       public static String getMachineQuantum(MachineFacts facts, Map<String, 
IDbMachine> dbMachineMap) {
-               String location = "getMachineQuantum";
-               String retVal = "";
-               if(dbMachineMap != null) {
-                       IDbMachine dbMachine = dbMachineMap.get(facts.name);
-                       if(dbMachine != null) {
-                               retVal = ""+dbMachine.getQuantum();
-                               logger.debug(location, jobid, retVal);
-                       }
-               }
-               return retVal;
-       }
-       
+
 }

Modified: 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/MachineInfo.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/MachineInfo.java?rev=1746305&r1=1746304&r2=1746305&view=diff
==============================================================================
--- 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/MachineInfo.java
 (original)
+++ 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/MachineInfo.java
 Tue May 31 17:32:31 2016
@@ -21,13 +21,11 @@ package org.apache.uima.ducc.ws;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Properties;
 
 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.ProcessInfo;
-import org.apache.uima.ducc.ws.server.DuccWebProperties;
 
 
 public class MachineInfo implements Comparable<MachineInfo> {
@@ -35,10 +33,16 @@ public class MachineInfo implements Comp
        private static DuccLogger logger = 
DuccLoggerComponents.getWsLogger(MachineInfo.class.getName());
        private static DuccId jobid = null;
        
-       private long down_fudge = 10;
-       private long DOWN_AFTER_SECONDS = 
WebServerComponent.updateIntervalSeconds + down_fudge;
-       private long SECONDS_PER_MILLI = 1000;
-       
+       public enum MachineStatus { 
+               Defined, 
+               Down, 
+               Up;
+               public String getLowerCaseName() {
+                       String retVal = name().toLowerCase();
+                       return retVal;
+               }
+       };
+
        private String fileDef;
        private String ip;
        private String name;
@@ -56,7 +60,23 @@ public class MachineInfo implements Comp
        private long pubSize;
        private long pubSizeMax;
        
+       private MachineStatus machineStatus = MachineStatus.Defined;
+       private Boolean responsive = null;
+       private Boolean online = null;
+       private Boolean blacklisted = null;
+       
+       private Integer quantum = null;
+       
        public MachineInfo(String fileDef, String ip, String name, String 
memTotal, String memFree, String swapInuse, String swapFree, double cpu, 
boolean cGroups, List<ProcessInfo> alienPids, long heartbeat, long pubSize) {
+               init(MachineStatus.Defined, fileDef, ip, name, memTotal, 
memFree, swapInuse, swapFree, cpu, cGroups, alienPids, heartbeat, pubSize);
+       }
+       
+       public MachineInfo(MachineStatus machineStatus, String fileDef, String 
ip, String name, String memTotal, String memFree, String swapInuse, String 
swapFree, double cpu, boolean cGroups, List<ProcessInfo> alienPids, long 
heartbeat, long pubSize) {
+               init(machineStatus, fileDef, ip, name, memTotal, memFree, 
swapInuse, swapFree, cpu, cGroups, alienPids, heartbeat, pubSize);
+       }
+       
+       private void init(MachineStatus machineStatus, String fileDef, String 
ip, String name, String memTotal, String memFree, String swapInuse, String 
swapFree, double cpu, boolean cGroups, List<ProcessInfo> alienPids, long 
heartbeat, long pubSize) {
+               this.machineStatus = machineStatus;
                this.fileDef = fileDef;
                this.ip = ip;
                this.name = name;
@@ -78,45 +98,156 @@ public class MachineInfo implements Comp
                this.pubSizeMax = 0;
        }
        
-       private long getAgentMillisMIA() {
-               String location = "getAgentMillisMIA";
-               long millisMIA = DOWN_AFTER_SECONDS*SECONDS_PER_MILLI;
-               Properties properties = DuccWebProperties.get();
-               String s_tolerance = 
properties.getProperty("ducc.rm.node.stability");
-               String s_rate = 
properties.getProperty("ducc.agent.node.metrics.publish.rate");
-               try {
-                       long tolerance = Long.parseLong(s_tolerance.trim());
-                       long rate = Long.parseLong(s_rate.trim());
-                       long secondsRM = (tolerance * rate) / SECONDS_PER_MILLI;
-                       logger.trace(location, jobid, 
"default:"+DOWN_AFTER_SECONDS+" "+"secondsRM:"+secondsRM);
-                       if(DOWN_AFTER_SECONDS < secondsRM) {
-                               millisMIA = secondsRM * SECONDS_PER_MILLI;
+       /*
+        * Derived status based on DB or Agent supplied data, 
+        * one of: defined, down, up
+        */
+       
+       public String getStatus() {
+               return machineStatus.getLowerCaseName();
+       }
+       
+       public MachineStatus getMachineStatus() {
+               return this.machineStatus;
+       }
+       
+       public void setMachineStatus(MachineStatus machineStatus) {
+               this.machineStatus = machineStatus;
+       }
+       
+       /**
+        * Hover string for status of Down/Up on Machine page
+        */
+       
+       public String getMachineStatusReason() {
+               String retVal = "";
+               StringBuffer sb = new StringBuffer();
+               sb.append(getResponsive());
+               sb.append(" ");
+               sb.append(getOnline());
+               sb.append(" ");
+               sb.append(getBlacklisted());
+               sb.append(" ");
+               retVal = sb.toString().trim();
+               return retVal;
+       }
+       
+       /**
+        * Resource Manager determined value for "responsive"
+        */
+       
+       public void setResponsive(boolean value) {
+               if(value) {
+                       setResponsive();
+               }
+               else {
+                       setNotResponsive();
+               }
+       }
+       
+       public void setResponsive() {
+               responsive = new Boolean(true);
+       }
+       
+       public void setNotResponsive() {
+               responsive = new Boolean(false);
+       }
+       
+       public String getResponsive() {
+               String retVal = "";
+               if(responsive != null) {
+                       if(responsive.booleanValue()) {
+                               retVal = "responsive=true";
+                       }
+                       else {
+                               retVal = "responsive=false";
                        }
                }
-               catch(Throwable t) {
-                       logger.warn(location, jobid, t);
+               return retVal;
+       }
+       
+       /**
+        * Resource Manager determined value for "online"
+        */
+       
+       public void setOnline(boolean value) {
+               if(value) {
+                       setOnline();
                }
-               return millisMIA;
+               else {
+                       setNotOnline();
+               }
+       }
+       
+       public void setOnline() {
+               online = new Boolean(true);
+       }
+       
+       public void setNotOnline() {
+               online = new Boolean(false);
        }
        
-       private String calculateStatus() {
-               String status = "";
-               if(getElapsedSeconds() < 0) {
-                       status = "defined";
+       public String getOnline() {
+               String retVal = "";
+               if(online != null) {
+                       if(online.booleanValue()) {
+                               retVal = "online=true";
+                       }
+                       else {
+                               retVal = "online=false";
+                       }
                }
-               else if(isExpired(getAgentMillisMIA())) {
-                       status = "down";
+               return retVal;
+       }
+       
+       /**
+        * Resource Manager determined value for "blacklisted"
+        */
+       
+       public void setBlacklisted(boolean value) {
+               if(value) {
+                       setBlacklisted();
                }
                else {
-                       status = "up";
+                       setNotBlacklisted();
                }
-               return status;
        }
        
-       public String getStatus() {
-               return calculateStatus();
+       public void setBlacklisted() {
+               blacklisted = new Boolean(true);
        }
        
+       public void setNotBlacklisted() {
+               blacklisted = new Boolean(false);
+       }
+       
+       public String getBlacklisted() {
+               String retVal = "";
+               if(blacklisted != null) {
+                       if(blacklisted.booleanValue()) {
+                               retVal = "blacklisted=true";
+                       }
+                       else {
+                               retVal = "blacklisted=false";
+                       }
+               }
+               return retVal;
+       }
+       
+       /**
+        * Resource Manager determined value for "quantum"
+        */
+       
+       public void setQuantum(Integer quantum) {
+               this.quantum = quantum;
+       }
+       
+       public Integer getQuantum() {
+               return quantum;
+       }
+       
+       //
+       
        public String getFileDef() {
                return this.fileDef;
        }
@@ -316,33 +447,78 @@ public class MachineInfo implements Comp
                return retVal;
        }
        
+       /**
+        * @param m1
+        * @param m2
+        * @return 0 if m1 == m2, -1 if m1 < m2, +1 if m1 > m2, where
+        *           Defined < Down < Up
+        */
        private int compareStatus(MachineInfo m1, MachineInfo m2) {
+               String location = "compareStatus";
                int retVal = 0;
                try {
-                       String v1 = m1.getStatus();
-                       String v2 = m2.getStatus();
-                       if(!v1.equals(v2)) {
-                               if(v1.equals("defined")) {
-                                       return -1;
-                               }
-                               if(v2.equals("defined")) {
-                                       return 1;
-                               }
-                               if(v1.equals("down")) {
-                                       return -1;
-                               }
-                               if(v2.equals("down")) {
-                                       return 1;
+                       MachineStatus v1 = m1.getMachineStatus();
+                       MachineStatus v2 = m2.getMachineStatus();
+                       switch(v1) {
+                       default:
+                       case Defined:
+                               switch(v2) {
+                               default:
+                               case Defined:
+                                       retVal = 0;
+                                       break;
+                               case Down:
+                                       retVal = -1;
+                                       break;
+                               case Up:
+                                       retVal = -1;
+                                       break;
                                }
-                               if(v1.equals("up")) {
-                                       return 1;
+                               break;
+                       case Down:
+                               switch(v2) {
+                               default:
+                               case Defined:
+                                       retVal = 1;
+                                       break;
+                               case Down:
+                                       retVal = 0;
+                                       break;
+                               case Up:
+                                       retVal = -1;
+                                       break;
                                }
-                               if(v2.equals("up")) {
-                                       return -1;
+                               break;
+                       case Up:
+                               switch(v2) {
+                               default:
+                                       retVal = 1;
+                               case Defined:
+                                       break;
+                               case Down:
+                                       retVal = 1;
+                                       break;
+                               case Up:
+                                       retVal = 0;
+                                       break;
                                }
+                               break;
                        }
+                       StringBuffer sb = new StringBuffer();
+                       sb.append(m1.getName());
+                       sb.append(" ");
+                       sb.append(m1.getMachineStatus().getLowerCaseName());
+                       sb.append(" ");
+                       sb.append(m2.getName());
+                       sb.append(" ");
+                       sb.append(m2.getMachineStatus().getLowerCaseName());
+                       sb.append(" ");
+                       sb.append(" "+retVal);
+                       logger.trace(location, jobid, sb);
                }
+               
                catch(Throwable t) {
+                       logger.error(location, jobid, t);
                }
                return retVal;
        }

Modified: 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/WebServerComponent.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/WebServerComponent.java?rev=1746305&r1=1746304&r2=1746305&view=diff
==============================================================================
--- 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/WebServerComponent.java
 (original)
+++ 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/WebServerComponent.java
 Tue May 31 17:32:31 2016
@@ -64,8 +64,6 @@ implements IWebServer {
        private static AtomicLong updateLast = new 
AtomicLong(System.currentTimeMillis());
        public static long updateIntervalSeconds = 60;
        public static long updateIntervalMilliSeconds = 
updateIntervalSeconds*1000;
-       private static AtomicLong updateCount = new AtomicLong(0);
-       private static long warmup = 10;
        
        public WebServerComponent(CamelContext context, CommonConfiguration 
common) {
                super("WebServer",context);
@@ -158,14 +156,15 @@ implements IWebServer {
                }
        }
        
-       private void sortMachines() {
+       /**
+        * Sort machines if interval has elapsed (60 seconds) 
+        * or if a new machine has been detected (force == true)
+        */
+       private void sortMachines(boolean force) {
                long last = updateLast.get();
                long deadline = last + updateIntervalMilliSeconds;
-               if(updateCount.getAndIncrement() < warmup) {
-                       deadline = last + updateIntervalMilliSeconds/10;
-               }
                long now = System.currentTimeMillis();
-               if(now > deadline) {
+               if(now > deadline || force) {
                        boolean success = updateLast.compareAndSet(last, now);
                        if(success) {
                                
DuccMachinesData.getInstance().updateSortedMachines();
@@ -177,8 +176,10 @@ implements IWebServer {
                String methodName = "update";
                duccLogger.trace(methodName, jobid, duccMsg.fetch("enter"));
                duccLogger.trace(methodName, jobid, 
duccMsg.fetchLabel("received")+"NodeMetricsUpdateDuccEvent");
-               DuccMachinesData.getInstance().put(new 
DatedNodeMetricsUpdateDuccEvent(duccEvent));
-               sortMachines();
+               DuccMachinesData dmd = DuccMachinesData.getInstance();
+               DatedNodeMetricsUpdateDuccEvent datedEvent = new 
DatedNodeMetricsUpdateDuccEvent(duccEvent);
+               boolean force = dmd.put(datedEvent);
+               sortMachines(force);
                duccLogger.trace(methodName, jobid, duccMsg.fetch("exit"));
        }
 

Modified: 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java?rev=1746305&r1=1746304&r2=1746305&view=diff
==============================================================================
--- 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java
 (original)
+++ 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java
 Tue May 31 17:32:31 2016
@@ -1490,7 +1490,12 @@ public class DuccHandlerClassic extends
                        while(iterator.hasNext()) {
                                NodeId key = iterator.next();
                                MachineInfo machineInfo = machines.get(key);
-                               Properties properties = 
DuccDaemonRuntimeProperties.getInstance().getAgent(machineInfo.getName());
+                               DuccDaemonRuntimeProperties drp = 
DuccDaemonRuntimeProperties.getInstance();
+                               String machineName = machineInfo.getName();
+                               if(machineName.startsWith("=")) {
+                                       continue;
+                               }
+                               Properties properties = 
drp.getAgent(machineName);
                                sb.append(trGet(counter));
                                // Status
                                StringBuffer status = new StringBuffer();

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=1746305&r1=1746304&r2=1746305&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 May 31 17:32:31 2016
@@ -2023,7 +2023,12 @@ public class DuccHandlerJsonFormat exten
                                row = new JsonArray();
                                NodeId key = iterator.next();
                                MachineInfo machineInfo = machines.get(key);
-                               Properties properties = 
DuccDaemonRuntimeProperties.getInstance().getAgent(machineInfo.getName());
+                               DuccDaemonRuntimeProperties drp = 
DuccDaemonRuntimeProperties.getInstance();
+                               String machineName = machineInfo.getName();
+                               if(machineName.startsWith("=")) {
+                                       continue;
+                               }
+                               Properties properties = 
drp.getAgent(machineName);
                                // Status
                                StringBuffer status = new StringBuffer();
                                String machineStatus = machineInfo.getStatus();

Modified: 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/types/NodeId.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/types/NodeId.java?rev=1746305&r1=1746304&r2=1746305&view=diff
==============================================================================
--- 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/types/NodeId.java
 (original)
+++ 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/types/NodeId.java
 Tue May 31 17:32:31 2016
@@ -90,4 +90,12 @@ public class NodeId implements Comparabl
                }
                return retVal;
        }
+               
+       // @return use long name as hashCode
+       
+       @Override
+       public int hashCode()
+       {
+               return getLongName().hashCode();
+       }
 }


Reply via email to