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