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/29 07:03:36 UTC
git commit: adding flag upon member fault and refactoring
statusChecker
Repository: stratos
Updated Branches:
refs/heads/4.0.0-grouping 01315a745 -> 1b7064dae
adding flag upon member fault and refactoring statusChecker
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/1b7064da
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/1b7064da
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/1b7064da
Branch: refs/heads/4.0.0-grouping
Commit: 1b7064daee10880ddfbf5c1a848c0fd0f108fdc0
Parents: 01315a7
Author: reka <rt...@gmail.com>
Authored: Wed Oct 29 11:33:06 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Wed Oct 29 11:33:06 2014 +0530
----------------------------------------------------------------------
.../grouping/topic/StatusEventPublisher.java | 86 ++++-----
.../AutoscalerHealthStatEventReceiver.java | 6 +-
.../AutoscalerTopologyEventReceiver.java | 15 +-
.../monitor/AbstractClusterMonitor.java | 13 +-
.../monitor/application/ApplicationMonitor.java | 4 +-
.../monitor/cluster/ClusterMonitor.java | 3 +-
.../autoscaler/monitor/group/GroupMonitor.java | 4 +-
.../status/checker/StatusChecker.java | 188 +++++++++----------
8 files changed, 155 insertions(+), 164 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/1b7064da/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 5b09a21..7bbe8ce 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
@@ -19,18 +19,16 @@ public class StatusEventPublisher {
private static final Log log = LogFactory.getLog(StatusEventPublisher.class);
public static void sendClusterActivatedEvent(String appId, String serviceName, String clusterId) {
-
- if (log.isInfoEnabled()) {
- log.info("Publishing Cluster activated event for [application]: " + appId +
- " [cluster]: " + clusterId);
- }
-
try {
TopologyManager.acquireReadLockForCluster(serviceName, clusterId);
Service service = TopologyManager.getTopology().getService(serviceName);
if (service != null) {
Cluster cluster = service.getCluster(clusterId);
if (cluster.isStateTransitionValid(ClusterStatus.Active)) {
+ if (log.isInfoEnabled()) {
+ log.info("Publishing Cluster activated event for [application]: " + appId +
+ " [cluster]: " + clusterId);
+ }
AppStatusClusterActivatedEvent clusterActivatedEvent =
new AppStatusClusterActivatedEvent(appId, serviceName, clusterId);
@@ -45,18 +43,16 @@ public class StatusEventPublisher {
}
public static void sendClusterInActivateEvent(String appId, String serviceName, String clusterId) {
-
- if (log.isInfoEnabled()) {
- log.info("Publishing Cluster in-activate event for [application]: " + appId +
- " [cluster]: " + clusterId);
- }
-
try {
TopologyManager.acquireReadLockForCluster(serviceName, clusterId);
Service service = TopologyManager.getTopology().getService(serviceName);
if (service != null) {
Cluster cluster = service.getCluster(clusterId);
if (cluster.isStateTransitionValid(ClusterStatus.Inactive)) {
+ if (log.isInfoEnabled()) {
+ log.info("Publishing Cluster in-activate event for [application]: " + appId +
+ " [cluster]: " + clusterId);
+ }
AppStatusClusterInactivateEvent clusterInActivateEvent =
new AppStatusClusterInactivateEvent(appId, serviceName, clusterId);
@@ -73,16 +69,16 @@ public class StatusEventPublisher {
public static void sendClusterTerminatingEvent(String appId, String serviceName, String clusterId) {
- if (log.isInfoEnabled()) {
- log.info("Publishing Cluster Terminating event for [application]: " + appId +
- " [cluster]: " + clusterId);
- }
try {
TopologyManager.acquireReadLockForCluster(serviceName, clusterId);
Service service = TopologyManager.getTopology().getService(serviceName);
if (service != null) {
Cluster cluster = service.getCluster(clusterId);
if (cluster.isStateTransitionValid(ClusterStatus.Terminating)) {
+ if (log.isInfoEnabled()) {
+ log.info("Publishing Cluster Terminating event for [application]: " + appId +
+ " [cluster]: " + clusterId);
+ }
AppStatusClusterTerminatingEvent appStatusClusterTerminatingEvent =
new AppStatusClusterTerminatingEvent(appId, serviceName, clusterId);
@@ -99,17 +95,16 @@ public class StatusEventPublisher {
}
public static void sendClusterTerminatedEvent(String appId, String serviceName, String clusterId) {
-
- if (log.isInfoEnabled()) {
- log.info("Publishing Cluster terminated event for [application]: " + appId +
- " [cluster]: " + clusterId);
- }
try {
TopologyManager.acquireReadLockForCluster(serviceName, clusterId);
Service service = TopologyManager.getTopology().getService(serviceName);
if (service != null) {
Cluster cluster = service.getCluster(clusterId);
if (cluster.isStateTransitionValid(ClusterStatus.Terminated)) {
+ if (log.isInfoEnabled()) {
+ log.info("Publishing Cluster terminated event for [application]: " + appId +
+ " [cluster]: " + clusterId);
+ }
AppStatusClusterTerminatedEvent appStatusClusterTerminatedEvent =
new AppStatusClusterTerminatedEvent(appId, serviceName, clusterId);
@@ -125,18 +120,16 @@ public class StatusEventPublisher {
}
public static void sendGroupActivatedEvent(String appId, String groupId) {
-
- if (log.isInfoEnabled()) {
- log.info("Publishing Group activated 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.isStateTransitionValid(GroupStatus.Active)) {
+ if (log.isInfoEnabled()) {
+ log.info("Publishing Group activated event for [application]: " + appId +
+ " [group]: " + groupId);
+ }
AppStatusGroupActivatedEvent groupActivatedEvent =
new AppStatusGroupActivatedEvent(appId, groupId);
@@ -151,17 +144,16 @@ public class StatusEventPublisher {
}
public static void sendGroupInActivateEvent(String appId, String groupId) {
-
- if (log.isInfoEnabled()) {
- 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.isStateTransitionValid(GroupStatus.Inactive)) {
+ if (log.isInfoEnabled()) {
+ log.info("Publishing Group in-activate event for [application]: " + appId +
+ " [group]: " + groupId);
+ }
AppStatusGroupInactivateEvent appStatusGroupInactivateEvent = new
AppStatusGroupInactivateEvent(appId, groupId);
@@ -176,17 +168,16 @@ public class StatusEventPublisher {
}
public static void sendGroupTerminatingEvent(String appId, String groupId) {
-
- if (log.isInfoEnabled()) {
- log.info("Publishing Group terminating 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.isStateTransitionValid(GroupStatus.Terminating)) {
+ if (log.isInfoEnabled()) {
+ log.info("Publishing Group terminating event for [application]: " + appId +
+ " [group]: " + groupId);
+ }
AppStatusGroupTerminatingEvent groupInTerminatingEvent =
new AppStatusGroupTerminatingEvent(appId, groupId);
publishEvent(groupInTerminatingEvent);
@@ -227,16 +218,14 @@ public class StatusEventPublisher {
}
public static void sendApplicationActivatedEvent(String appId) {
-
- if (log.isInfoEnabled()) {
- log.info("Publishing Application activated event for [application]: " + appId);
- }
-
try {
TopologyManager.acquireReadLockForApplication(appId);
Application application = TopologyManager.getTopology().getApplication(appId);
if (application != null) {
if (application.isStateTransitionValid(ApplicationStatus.Active)) {
+ if (log.isInfoEnabled()) {
+ log.info("Publishing Application activated event for [application]: " + appId);
+ }
AppStatusApplicationActivatedEvent applicationActivatedEvent =
new AppStatusApplicationActivatedEvent(appId);
@@ -273,15 +262,14 @@ public class StatusEventPublisher {
}
public static void sendApplicationTerminatingEvent(String appId) {
- if (log.isInfoEnabled()) {
- log.info("Publishing Application terminated event for [application]: " + appId);
- }
-
try {
TopologyManager.acquireReadLockForApplication(appId);
Application application = TopologyManager.getTopology().getApplication(appId);
if (application != null) {
if (application.isStateTransitionValid(ApplicationStatus.Terminating)) {
+ if (log.isInfoEnabled()) {
+ log.info("Publishing Application terminated event for [application]: " + appId);
+ }
AppStatusApplicationTerminatingEvent applicationTerminatingEvent =
new AppStatusApplicationTerminatingEvent(appId);
publishEvent(applicationTerminatingEvent);
@@ -295,14 +283,14 @@ public class StatusEventPublisher {
}
public static void sendApplicationTerminatedEvent(String appId, Set<ClusterDataHolder> clusterData) {
- if (log.isInfoEnabled()) {
- log.info("Publishing Application terminated event for [application]: " + appId);
- }
try {
TopologyManager.acquireReadLockForApplication(appId);
Application application = TopologyManager.getTopology().getApplication(appId);
if (application != null) {
if (application.isStateTransitionValid(ApplicationStatus.Terminated)) {
+ if (log.isInfoEnabled()) {
+ log.info("Publishing Application terminated event for [application]: " + appId);
+ }
AppStatusApplicationTerminatedEvent applicationTerminatedEvent =
new AppStatusApplicationTerminatedEvent(appId, clusterData);
publishEvent(applicationTerminatedEvent);
http://git-wip-us.apache.org/repos/asf/stratos/blob/1b7064da/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/health/AutoscalerHealthStatEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/health/AutoscalerHealthStatEventReceiver.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/health/AutoscalerHealthStatEventReceiver.java
index 6986fbb..cf072f3 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/health/AutoscalerHealthStatEventReceiver.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/health/AutoscalerHealthStatEventReceiver.java
@@ -656,15 +656,15 @@ public class AutoscalerHealthStatEventReceiver implements Runnable {
}
return;
}
+ //Check the clusterStatus as part of the member fault event
+ StatusChecker.getInstance().onMemberFaultEvent(clusterId, partitionCtxt);
+
// terminate the faulty member
CloudControllerClient ccClient = CloudControllerClient.getInstance();
ccClient.terminate(memberId);
// remove from active member list
partitionCtxt.removeActiveMemberById(memberId);
- //Check the clusterStatus as part of the member fault event
- StatusChecker.getInstance().onMemberFaultEvent(clusterId, partitionCtxt);
-
if (log.isInfoEnabled()) {
log.info(String.format("Faulty member is terminated and removed from the active members list: [member] %s [partition] %s [cluster] %s ",
http://git-wip-us.apache.org/repos/asf/stratos/blob/1b7064da/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 1423385..7b411b8 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
@@ -155,7 +155,9 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
(AbstractClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterId);
//changing the status in the monitor, will notify its parent monitor
- clusterMonitor.setStatus(ClusterStatus.Active);
+ if(clusterMonitor!= null) {
+ clusterMonitor.setStatus(ClusterStatus.Active);
+ }
}
});
@@ -190,7 +192,9 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
(AbstractClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterId);
//changing the status in the monitor, will notify its parent monitor
- clusterMonitor.setStatus(ClusterStatus.Inactive);
+ if(clusterMonitor!= null) {
+ clusterMonitor.setStatus(ClusterStatus.Inactive);
+ }
}
});
@@ -237,9 +241,6 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
if (clusterMonitor != null) {
clusterMonitor.setStatus(ClusterStatus.Terminated);
}
-
- //starting the status checker to decide on the status of it's parent
- //StatusChecker.getInstance().onClusterStatusChange(clusterId, appId);
}
});
@@ -337,7 +338,9 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
String appId = applicationActivatedEvent.getAppId();
ApplicationMonitor appMonitor = AutoscalerContext.getInstance().getAppMonitor(appId);
- appMonitor.setStatus(ApplicationStatus.Active);
+ if(appMonitor != null) {
+ appMonitor.setStatus(ApplicationStatus.Active);
+ }
}
});
http://git-wip-us.apache.org/repos/asf/stratos/blob/1b7064da/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
index 0a9d628..1461b6e 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
@@ -65,6 +65,8 @@ abstract public class AbstractClusterMonitor extends Monitor implements Runnable
protected String serviceId;
protected String appId;
+ protected boolean hasFaultyMember = false;
+
protected ClusterStatus status;
//protected ParentComponentMonitor parent;
@@ -228,7 +230,7 @@ abstract public class AbstractClusterMonitor extends Monitor implements Runnable
public void setStatus(ClusterStatus status) {
log.info(String.format("[Monitor] %s is notifying the parent" +
"on its state change from %s to %s", clusterId, this.status, status));
- if(this.status != status) {
+ //if(this.status != status) {
this.status = status;
/**
* notifying the parent monitor about the state change
@@ -241,7 +243,7 @@ abstract public class AbstractClusterMonitor extends Monitor implements Runnable
} else {
MonitorStatusEventBuilder.handleClusterStatusEvent(this.parent, this.status, this.clusterId);
}
- }
+ //}
}
@@ -260,4 +262,11 @@ abstract public class AbstractClusterMonitor extends Monitor implements Runnable
}
+ public boolean isHasFaultyMember() {
+ return hasFaultyMember;
+ }
+
+ public void setHasFaultyMember(boolean hasFaultyMember) {
+ this.hasFaultyMember = hasFaultyMember;
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/stratos/blob/1b7064da/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 966c8b2..a147b35 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
@@ -142,9 +142,9 @@ public class ApplicationMonitor extends ParentComponentMonitor {
public void setStatus(ApplicationStatus status) {
log.info(String.format("[ApplicationMonitor] %s " +
"state changes from %s to %s", id, this.status, status));
- if(this.status != status) {
+ //if(this.status != status) {
this.status = status;
- }
+ //}
}
@Override
http://git-wip-us.apache.org/repos/asf/stratos/blob/1b7064da/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 a089fc6..d67b4f4 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
@@ -74,7 +74,8 @@ public class ClusterMonitor extends AbstractClusterMonitor {
while (!isDestroyed()) {
try {
if ((this.status.getCode() <= ClusterStatus.Active.getCode()) ||
- (this.status == ClusterStatus.Inactive && !hasDependent)) {
+ (this.status == ClusterStatus.Inactive && !hasDependent) ||
+ this.hasFaultyMember) {
if (log.isDebugEnabled()) {
log.debug("Cluster monitor is running.. " + this.toString());
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/1b7064da/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 ab3ef16..261f745 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
@@ -140,7 +140,7 @@ public class GroupMonitor extends ParentComponentMonitor implements EventHandler
public void setStatus(GroupStatus status) {
log.info(String.format("[Monitor] %s is notifying the parent" +
"on its state change from %s to %s", id, this.status, status));
- if(this.status != status) {
+ //if(this.status != status) {
this.status = status;
//notifying the parent
if (status == GroupStatus.Inactive && !this.hasDependent) {
@@ -149,7 +149,7 @@ public class GroupMonitor extends ParentComponentMonitor implements EventHandler
} else {
MonitorStatusEventBuilder.handleGroupStatusEvent(this.parent, this.status, this.id);
}
- }
+ //}
}
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/1b7064da/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 acf6d71..d2d8b44 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
@@ -54,40 +54,48 @@ public class StatusChecker {
*
* @param clusterId id of the cluster
*/
- public void onMemberStatusChange(String clusterId) {
- ClusterMonitor monitor = (ClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterId);
- boolean clusterActive = false;
- if(monitor != null) {
- clusterActive = clusterActive(monitor);
+ public void onMemberStatusChange(final String clusterId) {
+ Runnable group = new Runnable() {
+ public void run() {
+ ClusterMonitor monitor = (ClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterId);
+ boolean clusterActive = false;
+ if (monitor != null) {
+ clusterActive = clusterActive(monitor);
- }
- log.info("Status checker running for [cluster] " + clusterId +
- " the status [clusterActive] " + clusterActive);
- // if active then notify upper layer
- if (clusterActive) {
- //send event to cluster status topic
- StatusEventPublisher.sendClusterActivatedEvent(monitor.getAppId(),
- monitor.getServiceId(), monitor.getClusterId());
- }
+ }
+ log.info("Status checker running for [cluster] " + clusterId +
+ " the status [clusterActive] " + clusterActive);
+ // if active then notify upper layer
+ if (clusterActive) {
+ //send event to cluster status topic
+ StatusEventPublisher.sendClusterActivatedEvent(monitor.getAppId(),
+ monitor.getServiceId(), monitor.getClusterId());
+ }
+ }
+ };
+ Thread groupThread = new Thread(group);
+ groupThread.start();
}
- public void onMemberTermination(String clusterId) {
- ClusterMonitor monitor = (ClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterId);
- boolean clusterMonitorHasMembers = clusterMonitorHasMembers(monitor);
- boolean clusterActive = clusterActive(monitor);
-
- try {
- TopologyManager.acquireReadLockForCluster(monitor.getServiceId(), monitor.getClusterId());
- Service service = TopologyManager.getTopology().getService(monitor.getServiceId());
- Cluster cluster;
- if(service != null) {
- cluster = service.getCluster(monitor.getClusterId());
- if(cluster != null) {
- if(!clusterMonitorHasMembers && cluster.getStatus() == ClusterStatus.Terminating) {
- StatusEventPublisher.sendClusterTerminatedEvent(monitor.getAppId(), monitor.getServiceId(),
- monitor.getClusterId());
- } else {
- log.info("Cluster has non terminated [members] and in the [status] "
+ public void onMemberTermination(final String clusterId) {
+ Runnable group = new Runnable() {
+ public void run() {
+ ClusterMonitor monitor = (ClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterId);
+ boolean clusterMonitorHasMembers = clusterMonitorHasMembers(monitor);
+ boolean clusterActive = clusterActive(monitor);
+
+ try {
+ TopologyManager.acquireReadLockForCluster(monitor.getServiceId(), monitor.getClusterId());
+ Service service = TopologyManager.getTopology().getService(monitor.getServiceId());
+ Cluster cluster;
+ if (service != null) {
+ cluster = service.getCluster(monitor.getClusterId());
+ if (cluster != null) {
+ if (!clusterMonitorHasMembers && cluster.getStatus() == ClusterStatus.Terminating) {
+ StatusEventPublisher.sendClusterTerminatedEvent(monitor.getAppId(), monitor.getServiceId(),
+ monitor.getClusterId());
+ } else {
+ log.info("Cluster has non terminated [members] and in the [status] "
+ cluster.getStatus().toString());
/*if(!clusterActive && !(cluster.getStatus() == ClusterStatus.Inactive ||
@@ -97,15 +105,19 @@ public class StatusChecker {
monitor.getServiceId(), clusterId);
}*/
+ }
+ }
}
- }
- }
- } finally {
- TopologyManager.releaseReadLockForCluster(monitor.getServiceId(), monitor.getClusterId());
+ } finally {
+ TopologyManager.releaseReadLockForCluster(monitor.getServiceId(), monitor.getClusterId());
- }
+ }
+ }
+ };
+ Thread groupThread = new Thread(group);
+ groupThread.start();
}
@@ -147,21 +159,30 @@ public class StatusChecker {
* @param partitionContext is to decide in which partition has less members while others have active members
*/
public void onMemberFaultEvent(final String clusterId, final PartitionContext partitionContext) {
- ClusterMonitor monitor = (ClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterId);
- boolean clusterInActive = getClusterInActive(monitor, partitionContext);
- String appId = monitor.getAppId();
- if (clusterInActive) {
- //TODO evaluate life cycle
- //send cluster In-Active event to cluster status topic
- StatusEventPublisher.sendClusterInActivateEvent(appId, monitor.getServiceId(), clusterId);
+ Runnable group = new Runnable() {
+ public void run() {
+ ClusterMonitor monitor = (ClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterId);
+ boolean clusterInActive = getClusterInActive(monitor, partitionContext);
+ String appId = monitor.getAppId();
+ if (clusterInActive) {
+ //if the monitor is dependent, temporarily pausing it
+ if(monitor.isDependent()) {
+ monitor.setHasFaultyMember(true);
+ }
+ //send cluster In-Active event to cluster status topic
+ StatusEventPublisher.sendClusterInActivateEvent(appId, monitor.getServiceId(), clusterId);
+
+ } else {
+ boolean clusterActive = clusterActive(monitor);
+ if (clusterActive) {
+ StatusEventPublisher.sendClusterActivatedEvent(appId, monitor.getServiceId(), clusterId);
+ }
+ }
- } else {
- boolean clusterActive = clusterActive(monitor);
- if (clusterActive) {
- //TODO evaluate life cycle
- //send clusterActive event to cluster status topic
}
- }
+ };
+ Thread groupThread = new Thread(group);
+ groupThread.start();
}
private boolean getClusterInActive(AbstractClusterMonitor monitor, PartitionContext partitionContext) {
@@ -195,7 +216,7 @@ public class StatusChecker {
try {
TopologyManager.acquireReadLockForApplication(appId);
ParentComponent component;
- if(groupId.equals(appId)) {
+ if (groupId.equals(appId)) {
//it is an application
component = TopologyManager.getTopology().
getApplication(appId);
@@ -244,29 +265,6 @@ public class StatusChecker {
log.info("cluster found: " + clusterFound);
if (clusterFound || groups.containsKey(id)) {
childFound = true;
- /*if (!clusterData.isEmpty() && !groups.isEmpty()) {
- if (log.isDebugEnabled()) {
- log.debug("group active found: " + clusterFound);
- }
-
- if (log.isDebugEnabled()) {
- log.debug("Active cluster" + clustersActive + " and group: " + groupActive);
- }
- groupActive = clustersActive == ClusterStatus.Active && groupsActive == GroupStatus.Active;
- } else if (!groups.isEmpty()) {
- groupsActive = getGroupStatus(groups);
- if (log.isDebugEnabled()) {
- log.info("group active found: " + clusterFound);
- }
- groupActive = groupsActive == GroupStatus.Active;
- } else if (!clusterData.isEmpty()) {
- clustersActive = getClusterStatus(clusterData);
- if (log.isDebugEnabled()) {
- log.debug("Active cluster" + clustersActive + " and group: " + groupActive);
- }
- groupActive = clustersActive == ClusterStatus.Active;
- } */
-
clusterStatus = getClusterStatus(clusterData);
groupStatus = getGroupStatus(groups);
@@ -286,10 +284,10 @@ public class StatusChecker {
} else if (groups.isEmpty() && clusterStatus == ClusterStatus.Inactive ||
clusterData.isEmpty() && groupStatus == GroupStatus.Inactive ||
groupStatus == GroupStatus.Inactive && clusterStatus == ClusterStatus.Inactive) {
- //send the in activation event
- if (parent instanceof Application) {
- //send application activated event
- log.warn("Application can't be in in-active : " + appId);
+ //send the in activation event
+ if (parent instanceof Application) {
+ //send application activated event
+ log.warn("Application can't be in in-active : " + appId);
//StatusEventPublisher.sendApplicationInactivatedEvent(appId);
} else if (parent instanceof Group) {
//send activation to the parent
@@ -299,13 +297,13 @@ public class StatusChecker {
} else if (groups.isEmpty() && clusterStatus == ClusterStatus.Terminated ||
clusterData.isEmpty() && groupStatus == GroupStatus.Terminated ||
groupStatus == GroupStatus.Terminated && clusterStatus == ClusterStatus.Terminated) {
- //send the terminated event
+ //send the terminated event
if (parent instanceof Application) {
//validating the life cycle
try {
TopologyManager.acquireReadLockForApplication(appId);
Application application = TopologyManager.getTopology().getApplication(appId);
- if(application.getStatus().equals(ApplicationStatus.Terminating)) {
+ if (application.getStatus().equals(ApplicationStatus.Terminating)) {
log.info("sending app terminated: " + appId);
StatusEventPublisher.sendApplicationTerminatedEvent(appId, parent.getClusterDataRecursively());
} else {
@@ -351,33 +349,25 @@ public class StatusChecker {
}
private GroupStatus getGroupStatus(Map<String, Group> groups) {
- boolean groupActiveStatus = false;
GroupStatus status = null;
boolean groupActive = false;
boolean groupTerminated = false;
for (Group group : groups.values()) {
- /*if (group.getTempStatus() == Status.Activated) {
- groupActiveStatus = true;
- } else {
- groupActiveStatus = false;
- break;
- }*/
-
if (group.getStatus() == GroupStatus.Active) {
groupActive = true;
groupTerminated = false;
- } else if(group.getStatus() == GroupStatus.Inactive){
+ } else if (group.getStatus() == GroupStatus.Inactive) {
status = GroupStatus.Inactive;
break;
- } else if(group.getStatus() == GroupStatus.Terminated) {
+ } else if (group.getStatus() == GroupStatus.Terminated) {
groupActive = false;
groupTerminated = true;
- } else if(group.getStatus() == GroupStatus.Created) {
+ } else if (group.getStatus() == GroupStatus.Created) {
groupActive = false;
groupTerminated = false;
status = GroupStatus.Created;
- } else if(group.getStatus() == GroupStatus.Terminating) {
+ } else if (group.getStatus() == GroupStatus.Terminating) {
groupActive = false;
groupTerminated = false;
status = GroupStatus.Terminating;
@@ -385,9 +375,9 @@ public class StatusChecker {
}
}
- if(groupActive) {
+ if (groupActive) {
status = GroupStatus.Active;
- } else if(groupTerminated) {
+ } else if (groupTerminated) {
status = GroupStatus.Terminated;
}
return status;
@@ -404,28 +394,28 @@ public class StatusChecker {
if (cluster.getStatus() == ClusterStatus.Active) {
clusterActive = true;
clusterTerminated = false;
- } else if(cluster.getStatus() == ClusterStatus.Inactive){
+ } else if (cluster.getStatus() == ClusterStatus.Inactive) {
status = ClusterStatus.Inactive;
clusterActive = false;
clusterTerminated = false;
break;
- } else if(cluster.getStatus() == ClusterStatus.Terminated) {
+ } else if (cluster.getStatus() == ClusterStatus.Terminated) {
clusterActive = false;
clusterTerminated = true;
- } else if(cluster.getStatus() == ClusterStatus.Terminating) {
+ } else if (cluster.getStatus() == ClusterStatus.Terminating) {
status = ClusterStatus.Terminating;
clusterActive = false;
clusterTerminated = false;
- } else if(cluster.getStatus() == ClusterStatus.Created) {
+ } else if (cluster.getStatus() == ClusterStatus.Created) {
status = ClusterStatus.Created;
clusterActive = false;
clusterTerminated = false;
}
}
- if(clusterActive) {
+ if (clusterActive) {
status = ClusterStatus.Active;
- } else if(clusterTerminated) {
+ } else if (clusterTerminated) {
status = ClusterStatus.Terminated;
}
return status;