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 -->