You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by is...@apache.org on 2014/10/29 16:21:03 UTC

git commit: making ArrayLists in PartitionContext synchronised

Repository: stratos
Updated Branches:
  refs/heads/4.0.0-grouping 5e69c7fe6 -> f959b108a


making ArrayLists in PartitionContext synchronised


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

Branch: refs/heads/4.0.0-grouping
Commit: f959b108a447bd61471b91ca682684d8f24d4554
Parents: 5e69c7f
Author: Isuru Haththotuwa <is...@apache.org>
Authored: Wed Oct 29 20:46:42 2014 +0530
Committer: Isuru Haththotuwa <is...@apache.org>
Committed: Wed Oct 29 20:46:42 2014 +0530

----------------------------------------------------------------------
 .../stratos/autoscaler/PartitionContext.java    | 119 ++++++++++---------
 .../AutoscalerTopologyEventReceiver.java        |  15 +++
 2 files changed, 76 insertions(+), 58 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/f959b108/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 d0886a3..467bbc2 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
@@ -26,13 +26,7 @@ import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition;
 import org.apache.stratos.cloud.controller.stub.pojo.MemberContext;
 
 import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 
@@ -88,9 +82,10 @@ public class PartitionContext implements Serializable{
         this.setPartition(partition);
         this.minimumMemberCount = partition.getPartitionMin();
         this.partitionId = partition.getId();
-        this.pendingMembers = new CopyOnWriteArrayList<MemberContext>();
-        this.activeMembers = new CopyOnWriteArrayList<MemberContext>();
-        this.terminationPendingMembers = new CopyOnWriteArrayList<MemberContext>();
+        // TODO: fix properly, maybe with CopyOnWriteArrayList?
+        this.pendingMembers = Collections.synchronizedList(new ArrayList<MemberContext>());
+        this.activeMembers = Collections.synchronizedList(new ArrayList<MemberContext>());
+        this.terminationPendingMembers = Collections.synchronizedList(new ArrayList<MemberContext>());
         this.obsoletedMembers = new CopyOnWriteArrayList<String>();
         memberStatsContexts = new ConcurrentHashMap<String, MemberStatsContext>();
 
@@ -152,14 +147,16 @@ public class PartitionContext implements Serializable{
     	if (id == null) {
             return false;
         }
-        for (Iterator<MemberContext> iterator = pendingMembers.iterator(); iterator.hasNext();) {
-    		MemberContext pendingMember = (MemberContext) iterator.next();
-    		if(id.equals(pendingMember.getMemberId())){
-    			iterator.remove();
-    			return true;
-    		}
-			
-		}
+        synchronized (pendingMembers) {
+            for (Iterator<MemberContext> iterator = pendingMembers.iterator(); iterator.hasNext(); ) {
+                MemberContext pendingMember = (MemberContext) iterator.next();
+                if (id.equals(pendingMember.getMemberId())) {
+                    iterator.remove();
+                    return true;
+                }
+
+            }
+        }
     	
     	return false;
     }
@@ -168,25 +165,27 @@ public class PartitionContext implements Serializable{
         if (memberId == null) {
             return;
         }
-        Iterator<MemberContext> iterator = pendingMembers.listIterator();
-        while (iterator.hasNext()) {
-            MemberContext pendingMember = iterator.next();
-            if(pendingMember == null) {
-                iterator.remove();
-                continue;
-            }
-            if(memberId.equals(pendingMember.getMemberId())){
-                // member is activated
-                // remove from pending list
-                iterator.remove();
-                // add to the activated list
-                this.activeMembers.add(pendingMember);
-                pendingMembersFailureCount = 0;
-                if (log.isDebugEnabled()) {
-                    log.debug(String.format("Pending member is removed and added to the " +
-                            "activated member list. [Member Id] %s",memberId));
+        synchronized (pendingMembers) {
+            Iterator<MemberContext> iterator = pendingMembers.listIterator();
+            while (iterator.hasNext()) {
+                MemberContext pendingMember = iterator.next();
+                if (pendingMember == null) {
+                    iterator.remove();
+                    continue;
+                }
+                if (memberId.equals(pendingMember.getMemberId())) {
+                    // member is activated
+                    // remove from pending list
+                    iterator.remove();
+                    // add to the activated list
+                    this.activeMembers.add(pendingMember);
+                    pendingMembersFailureCount = 0;
+                    if (log.isDebugEnabled()) {
+                        log.debug(String.format("Pending member is removed and added to the " +
+                                "activated member list. [Member Id] %s", memberId));
+                    }
+                    break;
                 }
-                break;
             }
         }
     }
@@ -196,24 +195,26 @@ public class PartitionContext implements Serializable{
         if (memberId == null) {
             return;
         }
-        Iterator<MemberContext> iterator = activeMembers.listIterator();
-        while ( iterator.hasNext()) {
-            MemberContext activeMember = iterator.next();
-            if(activeMember == null) {
-                iterator.remove();
-                continue;
-            }
-            if(memberId.equals(activeMember.getMemberId())){
-                // member is activated
-                // remove from pending list
-                iterator.remove();
-                // add to the activated list
-                this.terminationPendingMembers.add(activeMember);
-                if (log.isDebugEnabled()) {
-                    log.debug(String.format("Active member is removed and added to the " +
-                            "termination pending member list. [Member Id] %s", memberId));
+        synchronized (activeMembers) {
+            Iterator<MemberContext> iterator = activeMembers.listIterator();
+            while (iterator.hasNext()) {
+                MemberContext activeMember = iterator.next();
+                if (activeMember == null) {
+                    iterator.remove();
+                    continue;
+                }
+                if (memberId.equals(activeMember.getMemberId())) {
+                    // member is activated
+                    // remove from pending list
+                    iterator.remove();
+                    // add to the activated list
+                    this.terminationPendingMembers.add(activeMember);
+                    if (log.isDebugEnabled()) {
+                        log.debug(String.format("Active member is removed and added to the " +
+                                "termination pending member list. [Member Id] %s", memberId));
+                    }
+                    break;
                 }
-                break;
             }
         }
     }
@@ -228,11 +229,13 @@ public class PartitionContext implements Serializable{
 
     public boolean removeTerminationPendingMember(String memberId) {
         boolean terminationPendingMemberAvailable = false;
-        for (MemberContext memberContext: terminationPendingMembers){
-            if(memberContext.getMemberId().equals(memberId)){
-                terminationPendingMemberAvailable = true;
-                terminationPendingMembers.remove(memberContext);
-                break;
+        synchronized (terminationPendingMembers) {
+            for (MemberContext memberContext : terminationPendingMembers) {
+                if (memberContext.getMemberId().equals(memberId)) {
+                    terminationPendingMemberAvailable = true;
+                    terminationPendingMembers.remove(memberContext);
+                    break;
+                }
             }
         }
         return terminationPendingMemberAvailable;

http://git-wip-us.apache.org/repos/asf/stratos/blob/f959b108/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
index c866339..5f6e503 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
@@ -357,6 +357,21 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
                 ApplicationMonitor appMonitor = AutoscalerContext.getInstance().
                         getAppMonitor(applicationUndeployedEvent.getApplicationId());
 
+                // if any of Cluster Monitors are not added yet, should send the
+                // Cluster Terminated event for those clusters
+                Set<ClusterDataHolder> clusterDataHolders = applicationUndeployedEvent.getClusterData();
+                if (clusterDataHolders != null) {
+                    for (ClusterDataHolder clusterDataHolder : clusterDataHolders) {
+                        if (AutoscalerContext.getInstance().getMonitor(clusterDataHolder.getClusterId()) == null) {
+                            // Cluster Monitor not found; send Cluster Terminated event to cleanup
+                            StatusEventPublisher.sendClusterTerminatedEvent(
+                                    applicationUndeployedEvent.getApplicationId(),
+                                    clusterDataHolder.getServiceType(),
+                                    clusterDataHolder.getClusterId());
+                        }
+                    }
+                }
+
                 if (appMonitor != null) {
                     // set Application Monitor state to 'Terminating'
                     appMonitor.setStatus(ApplicationStatus.Terminating);