changeset 573:92e6648fd11d

Add failure status to thread monitor agent code review-thread: http://icedtea.classpath.org/pipermail/thermostat/2012-August/002990.html reviewed-by: vanaltj
author Mario Torre <neugens.limasoftware@gmail.com>
date Fri, 31 Aug 2012 10:12:53 +0200
parents 6f6d09025f91
children 06f2dcf9ad3b
files thread/client-controllers/src/main/java/com/redhat/thermostat/thread/client/controller/impl/VMThreadCapabilitiesController.java thread/harvester/src/main/java/com/redhat/thermostat/thread/harvester/Harvester.java thread/harvester/src/main/java/com/redhat/thermostat/thread/harvester/ThreadHarvester.java
diffstat 3 files changed, 89 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/thread/client-controllers/src/main/java/com/redhat/thermostat/thread/client/controller/impl/VMThreadCapabilitiesController.java	Wed Aug 29 19:43:25 2012 -0400
+++ b/thread/client-controllers/src/main/java/com/redhat/thermostat/thread/client/controller/impl/VMThreadCapabilitiesController.java	Fri Aug 31 10:12:53 2012 +0200
@@ -61,7 +61,9 @@
                 switch (actionEvent.getActionId()) {
                 case VISIBLE:
                     VMThreadCapabilities caps = collector.getVMThreadCapabilities();
-                    view.setVMThreadCapabilities(caps);
+                    if (caps != null) {
+                        view.setVMThreadCapabilities(caps);
+                    }
                     break;
 
                 default:
--- a/thread/harvester/src/main/java/com/redhat/thermostat/thread/harvester/Harvester.java	Wed Aug 29 19:43:25 2012 -0400
+++ b/thread/harvester/src/main/java/com/redhat/thermostat/thread/harvester/Harvester.java	Fri Aug 31 10:12:53 2012 +0200
@@ -43,6 +43,8 @@
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import javax.management.MalformedObjectNameException;
 
@@ -56,6 +58,8 @@
 @SuppressWarnings("restriction")
 class Harvester {
     
+    private static final Logger logger = Logger.getLogger(Harvester.class.getSimpleName());
+    
     private boolean isConnected;
     private ScheduledExecutorService threadPool;
     private ScheduledFuture<?> harvester;
@@ -76,52 +80,66 @@
         this.threadPool = threadPool;
     }
     
-    synchronized void start() {
-        if (isConnected) return;
-              
+    synchronized boolean start() {
+        if (isConnected) {
+            return true;
+        }
+
         if (!connector.isAttached()) {
             try {
                 connector.attach();
-            } catch (Exception ignore) {
-                ignore.printStackTrace();
+            } catch (Exception ex) {
+                logger.log(Level.SEVERE, "can't attach", ex);
+                return false;
             }
         }
       
         try {
             connection = connector.connect();
-        } catch (Exception e) {
-            e.printStackTrace();
+        } catch (Exception ex) {
+            logger.log(Level.SEVERE, "can't connect", ex);
+            return false;
         }
-        isConnected = true;
         
+        isConnected = true;
         harvester = threadPool.scheduleAtFixedRate(new HarvesterAction(), 0, 1, TimeUnit.SECONDS);
+        
+        return isConnected;
     }
     
     boolean isConnected() {
         return isConnected;
     }
     
-    synchronized void stop() {
-        if (!isConnected)
-            return;
+    synchronized boolean stop() {
+        if (!isConnected) {
+            return true;
+        }
         
         harvester.cancel(false);
+        isConnected = false;
 
+        boolean stillConnected = false;
         try {
             connection.close();
-        } catch (IOException e) {
-            e.printStackTrace();
+        } catch (IOException ex) {
+            logger.log(Level.SEVERE, "can't close connection", ex);
+            stillConnected = true;
         }
 
         if (connector.isAttached()) {
             try {
                 connector.close();
-            } catch (Exception ignore) {
-                ignore.printStackTrace();
+            } catch (Exception ex) {
+                logger.log(Level.SEVERE, "can't detach", ex);
+                if (stillConnected) {
+                    isConnected = true;
+                }
+                return false;
             }
         }
 
-        isConnected = false;
+        return true;
     }
     
     ThreadMXBean getDataCollectorBean(MXBeanConnection connection)
@@ -161,12 +179,14 @@
           if (collectorBean instanceof com.sun.management.ThreadMXBean) {
               com.sun.management.ThreadMXBean sunBean = (com.sun.management.ThreadMXBean) collectorBean;
               boolean wasEnabled = false;
-              if (sunBean.isThreadAllocatedMemorySupported()) {
-                  wasEnabled = sunBean.isThreadAllocatedMemoryEnabled();
-                  sunBean.setThreadAllocatedMemoryEnabled(true);
-                  allocatedBytes = sunBean.getThreadAllocatedBytes(ids);
-                  sunBean.setThreadAllocatedMemoryEnabled(wasEnabled);
-              }
+              try {
+                  if (sunBean.isThreadAllocatedMemorySupported()) {
+                      wasEnabled = sunBean.isThreadAllocatedMemoryEnabled();
+                      sunBean.setThreadAllocatedMemoryEnabled(true);
+                      allocatedBytes = sunBean.getThreadAllocatedBytes(ids);
+                      sunBean.setThreadAllocatedMemoryEnabled(wasEnabled);
+                  }
+              } catch (Exception ignore) {}
           }
 
           ThreadInfo[] threadInfos = collectorBean.getThreadInfo(ids, true, true);
@@ -207,15 +227,19 @@
         }
     }
     
-    synchronized void saveVmCaps() {
+    synchronized boolean saveVmCaps() {
         
         boolean closeAfter = false;
         if (!connector.isAttached()) {
             closeAfter = true; 
             try {
                 connector.attach();
-            } catch (Exception ignore) {
-                ignore.printStackTrace();
+            } catch (Exception ex) {
+                logger.log(Level.SEVERE, "can't attach", ex);
+                if (closeAfter) {
+                    closeConnection();
+                }
+                return false;
             }
         }
 
@@ -231,22 +255,33 @@
 
             if (bean instanceof com.sun.management.ThreadMXBean) {
                 com.sun.management.ThreadMXBean sunBean = (com.sun.management.ThreadMXBean) bean;
-                if (sunBean.isThreadAllocatedMemorySupported())
-                    caps.addFeature(ThreadDao.THREAD_ALLOCATED_MEMORY);
+                
+                try {
+                    if (sunBean.isThreadAllocatedMemorySupported()) {
+                        caps.addFeature(ThreadDao.THREAD_ALLOCATED_MEMORY);
+                    }
+                } catch (Exception ignore) {};
             }
 
             threadDao.saveCapabilities(vmId, agentId, caps);
 
-        } catch (Exception e) {
-            e.printStackTrace();
+        } catch (Exception ex) {
+            logger.log(Level.SEVERE, "can't get MXBeanConnection connection", ex);
+            return false;
         }
 
         if (closeAfter) {
-            try {
-                connector.close();
-            } catch (Exception ignore) {
-                ignore.printStackTrace();
-            }
+            closeConnection();
+        }
+        
+        return true;
+    }
+    
+    private void closeConnection() {
+        try {
+            connector.close();
+        } catch (Exception ex) {
+            logger.log(Level.SEVERE, "can't close connection to vm", ex);
         }
     }
 }
--- a/thread/harvester/src/main/java/com/redhat/thermostat/thread/harvester/ThreadHarvester.java	Wed Aug 29 19:43:25 2012 -0400
+++ b/thread/harvester/src/main/java/com/redhat/thermostat/thread/harvester/ThreadHarvester.java	Fri Aug 31 10:12:53 2012 +0200
@@ -64,48 +64,55 @@
     @Override
     public Response receive(Request request) {
         
+        boolean result = false;
+        
         String command = request.getParameter(HarvesterCommand.class.getName());
         switch (HarvesterCommand.valueOf(command)) {
         case START: {
             String vmId = request.getParameter(HarvesterCommand.VM_ID.name());
             String agentId = request.getParameter(HarvesterCommand.AGENT_ID.name());
-            startHarvester(vmId, agentId);
+            result = startHarvester(vmId, agentId);
             break;
         }   
         case STOP: {
             String vmId = request.getParameter(HarvesterCommand.VM_ID.name());
-            stopHarvester(vmId);
+            result = stopHarvester(vmId);
             break;
         }
         case VM_CAPS: {
             // this is blocking
             String vmId = request.getParameter(HarvesterCommand.VM_ID.name());
             String agentId = request.getParameter(HarvesterCommand.AGENT_ID.name());
-            saveVmCaps(vmId, agentId);
+            result = saveVmCaps(vmId, agentId);
             break;
         }
         default:
             break;
         }
         
-        return new Response(ResponseType.OK);
+        if (result) {
+            return new Response(ResponseType.OK);            
+        } else {
+            return new Response(ResponseType.ERROR);
+        }
     }
     
-    private void startHarvester(String vmId, String agentId) {
+    private boolean startHarvester(String vmId, String agentId) {
         Harvester harvester = getHarvester(vmId, agentId);
-        harvester.start();
+        return harvester.start();
     }
     
-    private void saveVmCaps(String vmId, String agentId) {
+    private boolean saveVmCaps(String vmId, String agentId) {
         Harvester harvester = getHarvester(vmId, agentId);
-        harvester.saveVmCaps();
+        return harvester.saveVmCaps();
     }
     
-    private void stopHarvester(String vmId) {
+    private boolean stopHarvester(String vmId) {
         Harvester harvester = connectors.get(vmId);
         if (harvester != null) {
-            harvester.stop();
+            return harvester.stop();
         }
+        return true;
     }
     
     Harvester getHarvester(String vmId, String agentId) {