persisting network partitions in registry, retrieve at start up, NetworkPartitionContext should be serializable, making Partition Manager thread safe
Project: http://git-wip-us.apache.org/repos/asf/incubator-stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-stratos/commit/d1ddd6eb Tree: http://git-wip-us.apache.org/repos/asf/incubator-stratos/tree/d1ddd6eb Diff: http://git-wip-us.apache.org/repos/asf/incubator-stratos/diff/d1ddd6eb Branch: refs/heads/master Commit: d1ddd6eb7e5ae346c748d6b2d85630455c03c71f Parents: fe3de0c Author: Nirmal Fernando <[email protected]> Authored: Sat Dec 14 15:11:20 2013 +0530 Committer: Nirmal Fernando <[email protected]> Committed: Sat Dec 14 15:11:20 2013 +0530 ---------------------------------------------------------------------- .../autoscaler/NetworkPartitionContext.java | 11 ++++- .../stratos/autoscaler/PartitionContext.java | 4 +- .../internal/AutoscalerServerComponent.java | 10 +++++ .../autoscaler/partition/PartitionManager.java | 39 +++++++++++------- .../autoscaler/registry/RegistryManager.java | 42 ++++++++++++++++++++ .../autoscaler/util/AutoScalerConstants.java | 1 + 6 files changed, 90 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/d1ddd6eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java index 1f7f029..ae53601 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java @@ -22,6 +22,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.stratos.cloud.controller.deployment.partition.Partition; +import java.io.Serializable; import java.util.HashMap; import java.util.Map; @@ -29,8 +30,9 @@ import java.util.Map; * Holds runtime data of a network partition. * */ -public class NetworkPartitionContext { +public class NetworkPartitionContext implements Serializable { + private static final long serialVersionUID = -5458149704820463584L; private static final Log log = LogFactory.getLog(NetworkPartitionContext.class); private String id; @@ -203,6 +205,13 @@ public class NetworkPartitionContext { + @Override + public String toString() { + return "NetworkPartitionContext [id=" + id + ", defaultLbClusterId=" + defaultLbClusterId + + ", partitionAlgorithm=" + partitionAlgorithm + ", minInstanceCount=" + + minInstanceCount + ", maxInstanceCount=" + maxInstanceCount + "]"; + } + public int getCurrentPartitionIndex() { return currentPartitionIndex; } http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/d1ddd6eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/PartitionContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/PartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/PartitionContext.java index 0f46893..2843e16 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/PartitionContext.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/PartitionContext.java @@ -23,6 +23,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.stratos.cloud.controller.deployment.partition.Partition; import org.apache.stratos.cloud.controller.pojo.MemberContext; +import java.io.Serializable; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -39,8 +40,9 @@ import java.util.concurrent.CopyOnWriteArrayList; * */ -public class PartitionContext { +public class PartitionContext implements Serializable{ + private static final long serialVersionUID = 5822689534291741272L; private static final Log log = LogFactory.getLog(PartitionContext.class); private String partitionId; private String serviceName; http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/d1ddd6eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java index e5c7964..a68800b 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java @@ -20,6 +20,7 @@ package org.apache.stratos.autoscaler.internal; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.stratos.autoscaler.NetworkPartitionContext; import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy; import org.apache.stratos.autoscaler.exception.AutoScalerException; import org.apache.stratos.autoscaler.message.receiver.health.HealthEventMessageDelegator; @@ -89,6 +90,15 @@ public class AutoscalerServerComponent { Partition partition = partitionIterator.next(); PartitionManager.getInstance().addPartitionToInformationModel(partition); } + + // Adding the network partitions stored in registry to the information model + List<NetworkPartitionContext> nwPartitionCtxts = RegistryManager.getInstance().retrieveNetworkPartitions(); + Iterator<NetworkPartitionContext> nwPartitionIterator = nwPartitionCtxts.iterator(); + while (nwPartitionIterator.hasNext()) { + NetworkPartitionContext nwPartition = nwPartitionIterator.next(); + PartitionManager.getInstance().addNetworkPartitionContext(nwPartition); + } + List<AutoscalePolicy> asPolicies = RegistryManager.getInstance().retrieveASPolicies(); Iterator<AutoscalePolicy> asPolicyIterator = asPolicies.iterator(); while (asPolicyIterator.hasNext()) { http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/d1ddd6eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/partition/PartitionManager.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/partition/PartitionManager.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/partition/PartitionManager.java index d8daead..b80e46e 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/partition/PartitionManager.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/partition/PartitionManager.java @@ -28,11 +28,9 @@ import org.apache.stratos.autoscaler.exception.AutoScalerException; import org.apache.stratos.autoscaler.exception.InvalidPartitionException; import org.apache.stratos.autoscaler.exception.PartitionValidationException; import org.apache.stratos.autoscaler.registry.RegistryManager; -import org.apache.stratos.autoscaler.util.AutoScalerConstants; import org.apache.stratos.cloud.controller.deployment.partition.Partition; import java.util.HashMap; -import java.util.List; import java.util.Map; /** @@ -45,7 +43,7 @@ private static final Log log = LogFactory.getLog(PartitionManager.class); // Partitions against partitionID private static Map<String,Partition> partitions = new HashMap<String, Partition>(); - private List<NetworkPartitionContext> networkPartitions; +// private List<NetworkPartitionContext> networkPartitions; /* * Key - partition id @@ -62,9 +60,6 @@ private static final Log log = LogFactory.getLog(PartitionManager.class); private static PartitionManager instance; - private String partitionResourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE - + AutoScalerConstants.PARTITION_RESOURCE + "/"; - private PartitionManager(){ networkPartitionContexts = new HashMap<String, NetworkPartitionContext>(); // networkPartitions = new ArrayList<NetworkPartitionContext>(); @@ -72,10 +67,14 @@ private static final Log log = LogFactory.getLog(PartitionManager.class); } public static PartitionManager getInstance(){ - if(null == instance) - return new PartitionManager(); - else - return instance; + if (instance == null) { + synchronized (PartitionManager.class) { + if (instance == null) { + instance = new PartitionManager(); + } + } + } + return instance; } public boolean partitionExist(String partitionId){ @@ -119,9 +118,9 @@ private static final Log log = LogFactory.getLog(PartitionManager.class); return this.networkPartitionContexts.get(networkPartitionId); } - public List<NetworkPartitionContext> getAllNetworkPartitions() { - return this.networkPartitions; - } +// public List<NetworkPartitionContext> getAllNetworkPartitions() { +// return this.networkPartitions; +// } // /** // * TODO make {@link NetworkPartitionContext}s extensible. @@ -176,10 +175,20 @@ private static final Log log = LogFactory.getLog(PartitionManager.class); public void deployNewNetworkPartitions(DeploymentPolicy depPolicy) { for(PartitionGroup partitionGroup: depPolicy.getPartitionGroups()){ - NetworkPartitionContext networkPartitionContext = new NetworkPartitionContext(partitionGroup.getId()); - networkPartitionContexts.put(partitionGroup.getId(), networkPartitionContext); + String id = partitionGroup.getId(); + if (!networkPartitionContexts.containsKey(id)) { + NetworkPartitionContext networkPartitionContext = + new NetworkPartitionContext( + id); + addNetworkPartitionContext(networkPartitionContext); + RegistryManager.getInstance().persistNetworkPartition(networkPartitionContext); + } } } + + public void addNetworkPartitionContext(NetworkPartitionContext ctxt) { + networkPartitionContexts.put(ctxt.getId(), ctxt); + } } http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/d1ddd6eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java index ba1afdf..c22a0dc 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java @@ -2,6 +2,7 @@ package org.apache.stratos.autoscaler.registry; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.stratos.autoscaler.NetworkPartitionContext; import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy; import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy; import org.apache.stratos.autoscaler.util.Deserializer; @@ -91,6 +92,14 @@ public class RegistryManager { partition.getId(), partition.getProvider(), partition.getPartitionMin(), partition.getPartitionMax())); } } + + public void persistNetworkPartition(NetworkPartitionContext nwPartitionCtxt) { + String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.NETWORK_PARTITION_RESOURCE + "/"; + persist(nwPartitionCtxt, resourcePath); + if(log.isDebugEnabled()) { + log.debug("NetworkPartitionContext written to registry: "+nwPartitionCtxt.toString()); + } + } public void persistAutoscalerPolicy(AutoscalePolicy autoscalePolicy) { String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.AS_POLICY_RESOURCE + "/" + autoscalePolicy.getId(); @@ -158,6 +167,39 @@ public class RegistryManager { } return partitionList; } + + public List<NetworkPartitionContext> retrieveNetworkPartitions() { + List<NetworkPartitionContext> nwPartitionList = new ArrayList<NetworkPartitionContext>(); + RegistryManager registryManager = RegistryManager.getInstance(); + String[] partitionsResourceList = (String[]) registryManager.retrieve(AutoScalerConstants.AUTOSCALER_RESOURCE + + AutoScalerConstants.NETWORK_PARTITION_RESOURCE); + + if (partitionsResourceList != null) { + NetworkPartitionContext nwPartition; + for (String resourcePath : partitionsResourceList) { + Object serializedObj = registryManager.retrieve(resourcePath); + if (serializedObj != null) { + try { + + Object dataObj = Deserializer.deserializeFromByteArray((byte[]) serializedObj); + if (dataObj instanceof NetworkPartitionContext) { + nwPartition = (NetworkPartitionContext) dataObj; + if(log.isDebugEnabled()) { + log.debug(String.format("NetworkPartitionContext read from registry: "+nwPartition.toString())); + } + nwPartitionList.add(nwPartition); + } else { + return null; + } + } catch (Exception e) { + String msg = "Unable to retrieve data from Registry. Hence, any historical NetworkPartitionContext will not get reflected."; + log.warn(msg, e); + } + } + } + } + return nwPartitionList; + } public List<AutoscalePolicy> retrieveASPolicies() { List<AutoscalePolicy> asPolicyList = new ArrayList<AutoscalePolicy>(); http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/d1ddd6eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoScalerConstants.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoScalerConstants.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoScalerConstants.java index 3530cc3..9702cc8 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoScalerConstants.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoScalerConstants.java @@ -35,6 +35,7 @@ public final class AutoScalerConstants { */ public static final String AUTOSCALER_RESOURCE = "/autoscaler"; public static final String PARTITION_RESOURCE = "/partitions"; + public static final String NETWORK_PARTITION_RESOURCE = "/network-partitions"; public static final String AS_POLICY_RESOURCE = "/policies/autoscalingPolicies"; public static final String DEPLOYMENT_POLICY_RESOURCE = "/policies/deploymentPolicies";
