You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by re...@apache.org on 2014/10/28 05:31:00 UTC
git commit: fixing issues while terminatnig the child and adding life
cycle check for group events
Repository: stratos
Updated Branches:
refs/heads/4.0.0-grouping 5efc02521 -> 7b4e32644
fixing issues while terminatnig the child and adding life cycle check for group events
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/7b4e3264
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/7b4e3264
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/7b4e3264
Branch: refs/heads/4.0.0-grouping
Commit: 7b4e326440287071d6271f9583caa2c1d947fe26
Parents: 5efc025
Author: reka <rt...@gmail.com>
Authored: Tue Oct 28 10:00:21 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Tue Oct 28 10:00:50 2014 +0530
----------------------------------------------------------------------
.../grouping/topic/StatusEventPublisher.java | 82 +++++++++++++++++---
.../AutoscalerTopologyEventReceiver.java | 12 ++-
.../stratos/autoscaler/monitor/Monitor.java | 9 ++-
.../monitor/ParentComponentMonitor.java | 11 ++-
.../monitor/application/ApplicationMonitor.java | 3 +-
.../monitor/cluster/ClusterMonitor.java | 6 +-
.../autoscaler/monitor/group/GroupMonitor.java | 3 +-
.../status/checker/StatusChecker.java | 27 +++++--
8 files changed, 118 insertions(+), 35 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/7b4e3264/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/topic/StatusEventPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/topic/StatusEventPublisher.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/topic/StatusEventPublisher.java
index ee75f74..fece506 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/topic/StatusEventPublisher.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/topic/StatusEventPublisher.java
@@ -4,7 +4,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.stratos.messaging.broker.publish.EventPublisher;
import org.apache.stratos.messaging.broker.publish.EventPublisherPool;
-import org.apache.stratos.messaging.domain.topology.ClusterDataHolder;
+import org.apache.stratos.messaging.domain.topology.*;
import org.apache.stratos.messaging.event.Event;
import org.apache.stratos.messaging.event.application.status.*;
import org.apache.stratos.messaging.event.application.status.AppStatusApplicationActivatedEvent;
@@ -14,6 +14,7 @@ import org.apache.stratos.messaging.event.application.status.AppStatusApplicatio
import org.apache.stratos.messaging.event.application.status.AppStatusClusterActivatedEvent;
import org.apache.stratos.messaging.event.application.status.AppStatusClusterInactivateEvent;
import org.apache.stratos.messaging.event.application.status.AppStatusGroupActivatedEvent;
+import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
import org.apache.stratos.messaging.util.Constants;
import java.util.Set;
@@ -83,9 +84,25 @@ public class StatusEventPublisher {
" [group]: " + groupId);
}
- AppStatusGroupActivatedEvent groupActivatedEvent = new AppStatusGroupActivatedEvent(appId, groupId);
+ try {
+ TopologyManager.acquireReadLockForApplication(appId);
+ Application application = TopologyManager.getTopology().getApplication(appId);
+ if(application != null) {
+ Group group = application.getGroupRecursively(groupId);
+ if(group.getStatus().getNextStates().contains(GroupStatus.Active)) {
+ AppStatusGroupActivatedEvent groupActivatedEvent =
+ new AppStatusGroupActivatedEvent(appId, groupId);
+
+ publishEvent(groupActivatedEvent);
+ } else {
+ log.warn("Active is not in the possible state list of [group] " + groupId);
+ }
+ }
+ } finally {
+ TopologyManager.releaseReadLockForApplication(appId);
+ }
+
- publishEvent(groupActivatedEvent);
}
public static void sendGroupInActivateEvent(String appId, String groupId) {
@@ -94,11 +111,25 @@ public class StatusEventPublisher {
log.info("Publishing Group in-activate event for [application]: " + appId +
" [group]: " + groupId);
}
+ try {
+ TopologyManager.acquireReadLockForApplication(appId);
+ Application application = TopologyManager.getTopology().getApplication(appId);
+ if(application != null) {
+ Group group = application.getGroupRecursively(groupId);
+ if(group.getStatus().getNextStates().contains(GroupStatus.Inactive)) {
+ AppStatusGroupInactivateEvent appStatusGroupInactivateEvent= new
+ AppStatusGroupInactivateEvent(appId, groupId);
+
+ publishEvent(appStatusGroupInactivateEvent);
+ } else {
+ log.warn("InActive is not in the possible state list of [group] " + groupId);
+ }
+ }
+ } finally {
+ TopologyManager.releaseReadLockForApplication(appId);
+ }
- AppStatusGroupInactivateEvent appStatusGroupInactivateEvent= new
- AppStatusGroupInactivateEvent(appId, groupId);
- publishEvent(appStatusGroupInactivateEvent);
}
public static void sendGroupTerminatingEvent(String appId, String groupId) {
@@ -107,9 +138,22 @@ public class StatusEventPublisher {
log.info("Publishing Group terminating event for [application]: " + appId +
" [group]: " + groupId);
}
-
- AppStatusGroupTerminatingEvent groupInTerminatingEvent = new AppStatusGroupTerminatingEvent(appId, groupId);
- publishEvent(groupInTerminatingEvent);
+ try {
+ TopologyManager.acquireReadLockForApplication(appId);
+ Application application = TopologyManager.getTopology().getApplication(appId);
+ if(application != null) {
+ Group group = application.getGroupRecursively(groupId);
+ if(group.getStatus().getNextStates().contains(GroupStatus.Terminating)) {
+ AppStatusGroupTerminatingEvent groupInTerminatingEvent =
+ new AppStatusGroupTerminatingEvent(appId, groupId);
+ publishEvent(groupInTerminatingEvent);
+ } else {
+ log.warn("Terminating is not in the possible state list of [group] " + groupId);
+ }
+ }
+ } finally {
+ TopologyManager.releaseReadLockForApplication(appId);
+ }
}
public static void sendGroupTerminatedEvent(String appId, String groupId) {
@@ -119,8 +163,24 @@ public class StatusEventPublisher {
" [group]: " + groupId);
}
- AppStatusGroupTerminatedEvent groupInTerminatedEvent = new AppStatusGroupTerminatedEvent(appId, groupId);
- publishEvent(groupInTerminatedEvent);
+ try {
+ TopologyManager.acquireReadLockForApplication(appId);
+ Application application = TopologyManager.getTopology().getApplication(appId);
+ if(application != null) {
+ Group group = application.getGroupRecursively(groupId);
+ if(group.getStatus().getNextStates().contains(GroupStatus.Terminated)) {
+ AppStatusGroupTerminatedEvent groupInTerminatedEvent =
+ new AppStatusGroupTerminatedEvent(appId, groupId);
+ publishEvent(groupInTerminatedEvent);
+ } else {
+ log.warn("Terminated is not in the possible state list of [group] " + groupId);
+ }
+ }
+ } finally {
+ TopologyManager.releaseReadLockForApplication(appId);
+ }
+
+
}
public static void sendApplicationActivatedEvent(String appId) {
http://git-wip-us.apache.org/repos/asf/stratos/blob/7b4e3264/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 89fe51f..9109d50 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
@@ -210,7 +210,13 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
(AbstractClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterId);
//changing the status in the monitor, will notify its parent monitor
- clusterMonitor.setStatus(ClusterStatus.Terminating);
+ if (clusterMonitor != null) {
+ clusterMonitor.setDestroyed(true);
+ clusterMonitor.terminateAllMembers();
+ clusterMonitor.setStatus(ClusterStatus.Terminating);
+ } else {
+ log.warn("No Cluster Monitor found for cluster id " + clusterId);
+ }
//starting the status checker to decide on the status of it's parent
//StatusChecker.getInstance().onClusterStatusChange(clusterId, appId);
@@ -251,7 +257,9 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
GroupMonitor monitor = (GroupMonitor) appMonitor.findGroupMonitorWithId(groupId);
//changing the status in the monitor, will notify its parent monitor
- monitor.setStatus(GroupStatus.Active);
+ if(monitor != null) {
+ monitor.setStatus(GroupStatus.Active);
+ }
}
});
http://git-wip-us.apache.org/repos/asf/stratos/blob/7b4e3264/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java
index 2088351..9ef7d73 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java
@@ -75,13 +75,14 @@ public abstract class Monitor implements EventHandler {
public boolean hasActiveMonitors() {
boolean hasMonitor = false;
- if(this.aliasToActiveMonitorsMap != null && !this.aliasToActiveMonitorsMap.isEmpty()) {
+ if ((this.aliasToActiveMonitorsMap != null && !this.aliasToActiveMonitorsMap.isEmpty()) ||
+ (this.aliasToInActiveMonitorsMap != null && !this.aliasToInActiveMonitorsMap.isEmpty())) {
hasMonitor = true;
}
return hasMonitor;
}
- public boolean hasMonitors () {
+ public boolean hasMonitors() {
return this.aliasToActiveMonitorsMap != null || this.aliasToInActiveMonitorsMap != null;
}
@@ -96,8 +97,8 @@ public abstract class Monitor implements EventHandler {
public boolean hasInDependentChild() {
boolean hasInDepChild = false;
- for(Monitor monitor : this.aliasToActiveMonitorsMap.values()) {
- if(!monitor.isDependent()) {
+ for (Monitor monitor : this.aliasToActiveMonitorsMap.values()) {
+ if (!monitor.isDependent()) {
hasInDepChild = true;
break;
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/7b4e3264/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java
index 9f3417d..6aa76b6 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java
@@ -116,7 +116,7 @@ public abstract class ParentComponentMonitor extends Monitor {
List<ApplicationContext> terminationList;
Monitor monitor;
//Temporarily move the group/cluster to inactive list
- this.aliasToInActiveMonitorsMap.put(idOfEvent, this.aliasToActiveMonitorsMap.remove(idOfEvent));
+ //this.aliasToInActiveMonitorsMap.put(idOfEvent, this.aliasToActiveMonitorsMap.remove(idOfEvent));
if(this.hasDependent) {
//need to notify the parent
@@ -171,18 +171,20 @@ public abstract class ParentComponentMonitor extends Monitor {
context.setTerminated(true);
terminationList = this.dependencyTree.getTerminationDependencies(idOfEvent);
+
+
/**
* Make sure that all the dependents have been terminated properly to start the recovery
*/
if (terminationList != null) {
for (ApplicationContext context1 : terminationList) {
- if (this.aliasToInActiveMonitorsMap.containsKey(context1.getId())) {
+ if (!this.aliasToInActiveMonitorsMap.containsKey(context1.getId())) {
allDependentTerminated = false;
} else if (this.aliasToActiveMonitorsMap.containsKey(context1.getId())) {
log.warn("Dependent [monitor] " + context1.getId() + " not in the correct state");
allDependentTerminated = false;
} else {
- allDependentTerminated = true;
+ log.info("Waiting for the [dependent] " + context1.getId() + " to be terminated...");
}
}
}
@@ -213,11 +215,12 @@ public abstract class ParentComponentMonitor extends Monitor {
//Find the non existent monitor by traversing dependency tree
try {
- this.startDependency();
+ this.startDependencyOnTermination();
} catch (TopologyInConsistentException e) {
e.printStackTrace();
}
} else {
+ StatusChecker.getInstance().onChildStatusChange(idOfEvent, this.id, this.appId);
log.info("Waiting for the dependent of [monitor] " + idOfEvent
+ " to be terminated");
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/7b4e3264/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java
index 45530c5..66044ef 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java
@@ -179,8 +179,7 @@ public class ApplicationMonitor extends ParentComponentMonitor {
} else if (status1 == ClusterStatus.Terminated || status1 == GroupStatus.Terminated) {
//Check whether all dependent goes Terminated and then start them in parallel.
this.aliasToInActiveMonitorsMap.remove(id);
- if (this.status != ApplicationStatus.Terminating && !this.aliasToInActiveMonitorsMap.isEmpty() &&
- !this.aliasToActiveMonitorsMap.isEmpty()) {
+ if (this.status != ApplicationStatus.Terminating) {
onChildTerminatedEvent(id);
} else {
StatusChecker.getInstance().onChildStatusChange(id, this.id, this.appId);
http://git-wip-us.apache.org/repos/asf/stratos/blob/7b4e3264/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java
index 557fedb..a089fc6 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java
@@ -72,12 +72,12 @@ public class ClusterMonitor extends AbstractClusterMonitor {
@Override
public void run() {
while (!isDestroyed()) {
- if (log.isDebugEnabled()) {
- log.debug("Cluster monitor is running.. " + this.toString());
- }
try {
if ((this.status.getCode() <= ClusterStatus.Active.getCode()) ||
(this.status == ClusterStatus.Inactive && !hasDependent)) {
+ if (log.isDebugEnabled()) {
+ log.debug("Cluster monitor is running.. " + this.toString());
+ }
monitor();
} else {
if (log.isDebugEnabled()) {
http://git-wip-us.apache.org/repos/asf/stratos/blob/7b4e3264/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/group/GroupMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/group/GroupMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/group/GroupMonitor.java
index 3123782..dff0bba 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/group/GroupMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/group/GroupMonitor.java
@@ -94,8 +94,7 @@ public class GroupMonitor extends ParentComponentMonitor implements EventHandler
} else if (status1 == ClusterStatus.Terminated || status1 == GroupStatus.Terminated) {
//Check whether all dependent goes Terminated and then start them in parallel.
this.aliasToInActiveMonitorsMap.remove(id);
- if (this.status != GroupStatus.Terminating && !this.aliasToInActiveMonitorsMap.isEmpty() &&
- !this.aliasToActiveMonitorsMap.isEmpty()) {
+ if (this.status != GroupStatus.Terminating) {
onChildTerminatedEvent(id);
} else {
StatusChecker.getInstance().onChildStatusChange(id, this.id, this.appId);
http://git-wip-us.apache.org/repos/asf/stratos/blob/7b4e3264/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java
index 7b3e0ac..acf6d71 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java
@@ -289,8 +289,8 @@ public class StatusChecker {
//send the in activation event
if (parent instanceof Application) {
//send application activated event
- log.info("sending app in-active : " + appId);
- StatusEventPublisher.sendApplicationInactivatedEvent(appId);
+ log.warn("Application can't be in in-active : " + appId);
+ //StatusEventPublisher.sendApplicationInactivatedEvent(appId);
} else if (parent instanceof Group) {
//send activation to the parent
log.info("sending group in-active: " + parent.getUniqueIdentifier());
@@ -301,9 +301,22 @@ public class StatusChecker {
groupStatus == GroupStatus.Terminated && clusterStatus == ClusterStatus.Terminated) {
//send the terminated event
if (parent instanceof Application) {
- //send application activated event
- log.info("sending app terminated: " + appId);
- StatusEventPublisher.sendApplicationTerminatedEvent(appId, parent.getClusterDataRecursively());
+ //validating the life cycle
+ try {
+ TopologyManager.acquireReadLockForApplication(appId);
+ Application application = TopologyManager.getTopology().getApplication(appId);
+ if(application.getStatus().equals(ApplicationStatus.Terminating)) {
+ log.info("sending app terminated: " + appId);
+ StatusEventPublisher.sendApplicationTerminatedEvent(appId, parent.getClusterDataRecursively());
+ } else {
+ log.info("[Application] " + appId + " is in the [status] " +
+ application.getStatus().toString() + ". Hence not sending terminated event");
+ }
+
+ } finally {
+ TopologyManager.releaseReadLockForApplication(appId);
+ }
+
//StatusEventPublisher.sendApp(appId);
} else if (parent instanceof Group) {
//send activation to the parent
@@ -316,8 +329,8 @@ public class StatusChecker {
//send the terminated event
if (parent instanceof Application) {
//send application activated event
- log.info("sending app terminating: " + appId);
- StatusEventPublisher.sendApplicationTerminatingEvent(appId);
+ log.warn("Application can't be in terminating: " + appId);
+ //StatusEventPublisher.sendApplicationTerminatingEvent(appId);
//StatusEventPublisher.sendApp(appId);
} else if (parent instanceof Group) {
//send activation to the parent