You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ud...@apache.org on 2014/12/12 11:11:46 UTC

[44/50] stratos git commit: Optimized mock statistics generator logic to run statistics updaters for only running services

Optimized mock statistics generator logic to run statistics updaters for only running services


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/9a7b32bb
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/9a7b32bb
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/9a7b32bb

Branch: refs/heads/master
Commit: 9a7b32bb6076a1b7690e65e9ca5bc7564aae8001
Parents: 0061291
Author: Imesh Gunaratne <im...@apache.org>
Authored: Fri Dec 12 10:39:56 2014 +0530
Committer: Imesh Gunaratne <im...@apache.org>
Committed: Fri Dec 12 10:40:11 2014 +0530

----------------------------------------------------------------------
 .../controller/iaases/mock/MockIaasService.java | 71 ++++++++++++------
 .../MockHealthStatisticsGenerator.java          | 79 ++++++++++++++++----
 .../lifecycle/LifeCycleStateManager.java        |  8 +-
 .../distribution/src/main/conf/mock-iaas.xml    |  2 +-
 4 files changed, 115 insertions(+), 45 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/9a7b32bb/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/MockIaasService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/MockIaasService.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/MockIaasService.java
index ee9394a..bbca7ea 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/MockIaasService.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/MockIaasService.java
@@ -33,6 +33,7 @@ import org.apache.stratos.common.threading.StratosThreadPool;
 import org.jclouds.compute.domain.NodeMetadata;
 import org.wso2.carbon.registry.core.exceptions.RegistryException;
 
+import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutorService;
@@ -58,15 +59,16 @@ public class MockIaasService {
     private static volatile MockIaasService instance;
 
     private MockPartitionValidator partitionValidator;
-    private ConcurrentHashMap<String, MockMember> membersMap;
+    // Map<ServiceName, Map<MemberId,MockMember>>
+    private Map<String, Map<String, MockMember>> serviceNameToMockMemberMap;
 
     private MockIaasService() {
         super();
         partitionValidator = new MockPartitionValidator();
-        membersMap = readFromRegistry();
-        if(membersMap == null) {
+        serviceNameToMockMemberMap = readFromRegistry();
+        if(serviceNameToMockMemberMap == null) {
             // No members found in registry, create a new map
-            membersMap = new ConcurrentHashMap<String, MockMember>();
+            serviceNameToMockMemberMap = new ConcurrentHashMap<String, Map<String, MockMember>>();
         }
     }
 
@@ -88,13 +90,18 @@ public class MockIaasService {
      * Start mock members
      */
     public void startMockMembers() {
-        if((membersMap != null) && (membersMap.size() > 0)) {
-            // Start existing mock members
-            for (MockMember mockMember : membersMap.values()) {
-                mockMemberExecutorService.submit(mockMember);
+        if(serviceNameToMockMemberMap != null) {
+            for(Map.Entry<String, Map<String, MockMember>> serviceNameEntry : serviceNameToMockMemberMap.entrySet())  {
+                // Start mock members
+                for(Map.Entry<String, MockMember> memberEntry : serviceNameEntry.getValue().entrySet()) {
+                    mockMemberExecutorService.submit(memberEntry.getValue());
+                }
+
+                // Schedule statistics updater tasks for service
+                if(serviceNameEntry.getValue().entrySet().size() > 0) {
+                    MockHealthStatisticsGenerator.getInstance().scheduleStatisticsUpdaterTasks(serviceNameEntry.getKey());
+                }
             }
-            // Schedule health statistics updaters
-            MockHealthStatisticsGenerator.getInstance().scheduleStatisticsUpdaters();
         }
     }
 
@@ -105,7 +112,7 @@ public class MockIaasService {
                     clusterContext.getClusterId(), memberContext.getMemberId(), memberContext.getNetworkPartitionId(),
                     memberContext.getPartition().getId(), memberContext.getInstanceId());
             MockMember mockMember = new MockMember(mockMemberContext);
-            membersMap.put(mockMember.getMockMemberContext().getMemberId(), mockMember);
+            addMemberToMap(mockMember);
             mockMemberExecutorService.submit(mockMember);
 
             // Prepare node metadata
@@ -115,24 +122,34 @@ public class MockIaasService {
             // Persist changes
             persistInRegistry();
 
-            if(!MockHealthStatisticsGenerator.getInstance().isScheduled()) {
-                MockHealthStatisticsGenerator.getInstance().scheduleStatisticsUpdaters();
-            }
+            String serviceName = mockMemberContext.getServiceName();
+            MockHealthStatisticsGenerator.getInstance().scheduleStatisticsUpdaterTasks(serviceName);
 
             return nodeMetadata;
         }
     }
 
+    private void addMemberToMap(MockMember mockMember) {
+        String serviceName = mockMember.getMockMemberContext().getServiceName();
+        Map<String, MockMember> memberMap = serviceNameToMockMemberMap.get(serviceName);
+        if(memberMap == null) {
+            memberMap = new ConcurrentHashMap<String, MockMember>();
+            serviceNameToMockMemberMap.put(serviceName, memberMap);
+        }
+        memberMap.put(mockMember.getMockMemberContext().getMemberId(), mockMember);
+    }
+
     private void persistInRegistry() {
         try {
-            RegistryManager.getInstance().persist(MOCK_IAAS_MEMBERS, membersMap);
+            RegistryManager.getInstance().persist(MOCK_IAAS_MEMBERS,
+                    (ConcurrentHashMap<String, Map<String, MockMember>>)serviceNameToMockMemberMap);
         } catch (RegistryException e) {
             log.error("Could not persist mock iaas members in registry", e);
         }
     }
 
-    private static ConcurrentHashMap<String, MockMember> readFromRegistry() {
-        return (ConcurrentHashMap<String, MockMember>) RegistryManager.getInstance().read(MOCK_IAAS_MEMBERS);
+    private ConcurrentHashMap<String, Map<String, MockMember>> readFromRegistry() {
+        return (ConcurrentHashMap<String, Map<String, MockMember>>) RegistryManager.getInstance().read(MOCK_IAAS_MEMBERS);
     }
 
     public void allocateIpAddress(String clusterId, MemberContext memberContext, Partition partition,
@@ -188,14 +205,20 @@ public class MockIaasService {
 
     public void terminateInstance(MemberContext memberContext) throws InvalidCartridgeTypeException, InvalidMemberException {
         synchronized (MockIaasService.class) {
-            MockMember mockMember = membersMap.get(memberContext.getMemberId());
-            if (mockMember != null) {
-                mockMember.terminate();
-                membersMap.remove(memberContext.getMemberId());
-            }
+            String serviceName = memberContext.getCartridgeType();
+            Map<String, MockMember> memberMap = serviceNameToMockMemberMap.get(serviceName);
+            if(memberMap != null) {
+                MockMember mockMember = memberMap.get(memberContext.getMemberId());
+                if(mockMember != null) {
+                    if (mockMember != null) {
+                        mockMember.terminate();
+                        memberMap.remove(memberContext.getMemberId());
+                    }
 
-            if(membersMap.size() == 0) {
-                MockHealthStatisticsGenerator.getInstance().stopStatisticsUpdaters();
+                    if (memberMap.size() == 0) {
+                        MockHealthStatisticsGenerator.getInstance().stopStatisticsUpdaterTasks(serviceName);
+                    }
+                }
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/9a7b32bb/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/statistics/generator/MockHealthStatisticsGenerator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/statistics/generator/MockHealthStatisticsGenerator.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/statistics/generator/MockHealthStatisticsGenerator.java
index db72225..1c1ef34 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/statistics/generator/MockHealthStatisticsGenerator.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/statistics/generator/MockHealthStatisticsGenerator.java
@@ -24,8 +24,13 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.cloud.controller.iaases.mock.config.MockIaasConfig;
 import org.apache.stratos.common.threading.StratosThreadPool;
 
+import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -40,6 +45,8 @@ public class MockHealthStatisticsGenerator {
             StratosThreadPool.getScheduledExecutorService("MOCK_STATISTICS_GENERATOR_EXECUTOR_SERVICE", 10);
 
     private boolean scheduled;
+    // Map<ServiceName, List<ScheduledFuture>>
+    private Map<String, List<ScheduledFuture>> serviceNameToTaskListMap;
 
     public static MockHealthStatisticsGenerator getInstance() {
         if (instance == null) {
@@ -53,36 +60,76 @@ public class MockHealthStatisticsGenerator {
     }
 
     private MockHealthStatisticsGenerator() {
+        serviceNameToTaskListMap = new ConcurrentHashMap<String, List<ScheduledFuture>>();
     }
 
-    public void scheduleStatisticsUpdaters() {
-        if(!scheduled) {
-            synchronized (MockHealthStatisticsGenerator.class) {
-                if(!scheduled) {
-                    List<MockHealthStatisticsPattern> statisticsPatterns = MockIaasConfig.getInstance().
-                            getMockHealthStatisticsConfig().getStatisticsPatterns();
+    /**
+     * Schedule statistics updater tasks for the given service/cartridge type.
+     *
+     * @param serviceName
+     */
+    public void scheduleStatisticsUpdaterTasks(String serviceName) {
+        synchronized (MockHealthStatisticsGenerator.class) {
+            if (!statisticsUpdaterTasksScheduled(serviceName)) {
+                List<MockHealthStatisticsPattern> statisticsPatterns = MockIaasConfig.getInstance().
+                        getMockHealthStatisticsConfig().getStatisticsPatterns();
+
+                List taskList = serviceNameToTaskListMap.get(serviceName);
+                if (taskList == null) {
+                    taskList = new ArrayList<ScheduledFuture>();
+                    serviceNameToTaskListMap.put(serviceName, taskList);
+                }
 
-                    for (MockHealthStatisticsPattern statisticsPattern : statisticsPatterns) {
-                        scheduledExecutorService.scheduleAtFixedRate(new MockHealthStatisticsUpdater(statisticsPattern), 0,
+                for (MockHealthStatisticsPattern statisticsPattern : statisticsPatterns) {
+                    if (statisticsPattern.getCartridgeType().equals(serviceName)) {
+                        MockHealthStatisticsUpdater runnable = new MockHealthStatisticsUpdater(statisticsPattern);
+                        ScheduledFuture<?> task = scheduledExecutorService.scheduleAtFixedRate(runnable, 0,
                                 statisticsPattern.getSampleDuration(), TimeUnit.SECONDS);
+                        taskList.add(task);
                     }
+                }
 
-                    if (log.isInfoEnabled()) {
-                        log.info("Mock statistics updaters scheduled");
-                    }
-                    scheduled = true;
+                if (log.isInfoEnabled()) {
+                    log.info(String.format("Mock statistics updaters scheduled: [service-name] %s", serviceName));
                 }
             }
         }
     }
 
-    public void stopStatisticsUpdaters() {
+    /**
+     * Stop statistics updater tasks of the given service/cartridge type.
+     *
+     * @param serviceName
+     */
+    public void stopStatisticsUpdaterTasks(String serviceName) {
         synchronized (MockHealthStatisticsGenerator.class) {
-            scheduledExecutorService.shutdownNow();
+            List<ScheduledFuture> taskList = serviceNameToTaskListMap.get(serviceName);
+            if ((taskList != null) && (taskList.size() > 0)) {
+                Iterator<ScheduledFuture> iterator = taskList.iterator();
+                while(iterator.hasNext()) {
+                    // Cancel task
+                    ScheduledFuture task = iterator.next();
+                    task.cancel(true);
+
+                    // Remove from task list
+                    iterator.remove();
+                }
+
+                if (log.isInfoEnabled()) {
+                    log.info(String.format("Mock statistics updaters stopped: [service-name] %s", serviceName));
+                }
+            }
         }
     }
 
-    public boolean isScheduled() {
-        return scheduled;
+    /**
+     * Returns true if there are statistics updater tasks scheduled for the given service/cartridge type
+     * else returns false.
+     * @param serviceName
+     * @return
+     */
+    public boolean statisticsUpdaterTasksScheduled(String serviceName) {
+        List<ScheduledFuture> tasks = serviceNameToTaskListMap.get(serviceName);
+        return ((tasks != null) && (tasks.size() > 0));
     }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/9a7b32bb/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java
index a688288..e2907bb 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java
@@ -83,12 +83,12 @@ public class LifeCycleStateManager<T extends LifeCycleState> implements Serializ
         if (getCurrentState() != nextState) {
             stateStack.push(nextState);
             stateChanged = true;
-            log.info("Element [ " + identifier + " ]'s life Cycle State changed from [ " +
-                    getPreviousState() + " ] to [ " + getCurrentState() + " ]");
+            log.info("Element [" + identifier + "]'s lifecycle state changed from [" +
+                    getPreviousState() + "] to [" + getCurrentState() + "]");
         } else {
             if (log.isDebugEnabled()) {
-                log.debug("Element [ " + identifier +" ]'s life Cycle State has been " +
-                        "already updated to [ " + nextState + " ]");
+                log.debug("Element [" + identifier +"]'s lifecycle state has been " +
+                        "already updated to [" + nextState + "]");
             }
         }
         if (log.isDebugEnabled()) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/9a7b32bb/products/stratos/modules/distribution/src/main/conf/mock-iaas.xml
----------------------------------------------------------------------
diff --git a/products/stratos/modules/distribution/src/main/conf/mock-iaas.xml b/products/stratos/modules/distribution/src/main/conf/mock-iaas.xml
index 06d63d2..555d7f9 100644
--- a/products/stratos/modules/distribution/src/main/conf/mock-iaas.xml
+++ b/products/stratos/modules/distribution/src/main/conf/mock-iaas.xml
@@ -24,7 +24,7 @@
                 <!-- Sample values -->
                 <sampleValues>20,30,40,50,60,70,50,40,30,20,20,20,20,20,20,20</sampleValues>
                 <!-- Duration of each sample value in seconds -->
-                <sampleDuration>30</sampleDuration>
+                <sampleDuration>60</sampleDuration>
             </pattern>
             <pattern factor="load-average">
                 <!-- Sample values -->