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

Reply via email to