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 <[email protected]> Authored: Wed Oct 29 20:46:42 2014 +0530 Committer: Isuru Haththotuwa <[email protected]> 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);
