life cycle status machine contd.
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/17d68aba Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/17d68aba Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/17d68aba Branch: refs/heads/4.0.0-grouping Commit: 17d68aba871352cf94ecbb0d843bfbb587478516 Parents: 4ec1d6f Author: Isuru Haththotuwa <[email protected]> Authored: Fri Oct 17 17:36:56 2014 +0530 Committer: Isuru Haththotuwa <[email protected]> Committed: Sun Oct 19 08:52:07 2014 +0530 ---------------------------------------------------------------------- .../AutoscalerTopologyEventReceiver.java | 20 ++++++--- .../monitor/cluster/ClusterMonitor.java | 4 +- .../monitor/cluster/LbClusterMonitor.java | 4 +- .../status/checker/StatusChecker.java | 2 +- .../InstanceStatusEventMessageDelegator.java | 31 ++----------- .../controller/topology/TopologyBuilder.java | 35 +++++++++++---- .../conf/LoadBalancerConfiguration.java | 8 +--- .../messaging/domain/topology/Cluster.java | 27 ++++++++--- .../domain/topology/ClusterStatus.java | 40 +++++++++++++---- .../LifeCycleStateTransitionBehavior.java | 35 +++++++++++++++ .../messaging/domain/topology/Member.java | 23 +++++++--- .../InvalidLifecycleTransitionException.java | 47 -------------------- .../lifecycle/LifeCycleStateManager.java | 33 ++++++++------ .../topology/ClusterActivatedProcessor.java | 10 ++--- .../ClusterMaintenanceModeMessageProcessor.java | 5 ++- .../MemberActivatedMessageProcessor.java | 10 ++--- .../MemberMaintenanceModeProcessor.java | 10 ++--- .../MemberReadyToShutdownMessageProcessor.java | 10 ++--- .../topology/MemberStartedMessageProcessor.java | 10 ++--- .../MemberSuspendedMessageProcessor.java | 10 ++--- 20 files changed, 201 insertions(+), 173 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/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 1e20937..b342a81 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 @@ -306,7 +306,7 @@ public class AutoscalerTopologyEventReceiver implements Runnable { AbstractClusterMonitor monitor; if (AutoscalerContext.getInstance().monitorExist((cluster.getClusterId()))) { monitor = (AbstractClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterMaitenanceEvent.getClusterId()); - monitor.setStatus(Status.In_Active); + monitor.setStatus(Status.In_Maintenance); } else if (AutoscalerContext.getInstance(). lbMonitorExist((cluster.getClusterId()))) { AutoscalerContext.getInstance().getLBMonitor(clusterMaitenanceEvent.getClusterId()). @@ -589,19 +589,25 @@ public class AutoscalerTopologyEventReceiver implements Runnable { th = new Thread( new ApplicationMonitorAdder(applicationId)); } - // if (th != null) { - th.start(); + + if (th != null) { + th.start(); // try { // th.join(); // } catch (InterruptedException ignore) { - // } - if (log.isDebugEnabled()) { - log.debug(String + if (log.isDebugEnabled()) { + log.debug(String .format("Application monitor thread has been started successfully: " + "[application] %s ", applicationId)); + } + } else { + if (log.isDebugEnabled()) { + log.debug(String + .format("Application monitor thread already exists: " + + "[application] %s ", applicationId)); + } } - // } } private class ApplicationMonitorAdder implements Runnable { http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/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 b9e9948..c681a0f 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 @@ -84,12 +84,12 @@ public class ClusterMonitor extends AbstractClusterMonitor { log.debug("Cluster monitor is running.. " + this.toString()); } try { - if (!ClusterStatus.In_Maintenance.equals(status)) { + if (!ClusterStatus.Inactive.equals(status)) { monitor(); } else { if (log.isDebugEnabled()) { log.debug("Cluster monitor is suspended as the cluster is in " + - ClusterStatus.In_Maintenance + " mode......"); + ClusterStatus.Inactive + " mode......"); } } } catch (Exception e) { http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/LbClusterMonitor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/LbClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/LbClusterMonitor.java index e627503..d3a2371 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/LbClusterMonitor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/LbClusterMonitor.java @@ -63,12 +63,12 @@ public class LbClusterMonitor extends AbstractClusterMonitor { log.debug("Cluster monitor is running.. " + this.toString()); } try { - if( !ClusterStatus.In_Maintenance.equals(status)) { + if( !ClusterStatus.Inactive.equals(status)) { monitor(); } else { if (log.isDebugEnabled()) { log.debug("LB Cluster monitor is suspended as the cluster is in " + - ClusterStatus.In_Maintenance + " mode......"); + ClusterStatus.Inactive + " mode......"); } } } catch (Exception e) { http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/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 c76df01..ff45af1 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 @@ -283,7 +283,7 @@ public class StatusChecker { for (Map.Entry<String, ClusterDataHolder> clusterDataHolderEntry : clusterData.entrySet()) { Service service = TopologyManager.getTopology().getService(clusterDataHolderEntry.getValue().getServiceType()); if (service.getCluster(clusterDataHolderEntry.getValue().getClusterId()). - getStatus() == Status.Activated) { + getStatus() == ClusterStatus.Active) { clusterActiveStatus = true; } else { clusterActiveStatus = false; http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topic/instance/status/InstanceStatusEventMessageDelegator.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topic/instance/status/InstanceStatusEventMessageDelegator.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topic/instance/status/InstanceStatusEventMessageDelegator.java index fd89723..dd279ed 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topic/instance/status/InstanceStatusEventMessageDelegator.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topic/instance/status/InstanceStatusEventMessageDelegator.java @@ -21,7 +21,6 @@ package org.apache.stratos.cloud.controller.topic.instance.status; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.stratos.cloud.controller.topology.TopologyBuilder; -import org.apache.stratos.messaging.domain.topology.lifecycle.InvalidLifecycleTransitionException; import org.apache.stratos.messaging.event.instance.status.InstanceActivatedEvent; import org.apache.stratos.messaging.event.instance.status.InstanceMaintenanceModeEvent; import org.apache.stratos.messaging.event.instance.status.InstanceReadyToShutdownEvent; @@ -49,51 +48,27 @@ public class InstanceStatusEventMessageDelegator implements Runnable { if (InstanceStartedEvent.class.getName().equals(type)) { // retrieve the actual message String json = message.getText(); - try { TopologyBuilder.handleMemberStarted((InstanceStartedEvent) Util. jsonToObject(json, InstanceStartedEvent.class)); - } catch (InvalidLifecycleTransitionException e) { - //TODO: handle properly - log.error(e); - } - } else if (InstanceActivatedEvent.class.getName().equals(type)) { // retrieve the actual message String json = message.getText(); - try { - TopologyBuilder.handleMemberActivated((InstanceActivatedEvent) Util. + TopologyBuilder.handleMemberActivated((InstanceActivatedEvent) Util. jsonToObject(json, InstanceActivatedEvent.class)); - } catch (InvalidLifecycleTransitionException e) { - //TODO: handle properly - log.error(e); - } - } else if (InstanceReadyToShutdownEvent.class.getName().equals(type)) { //retrieve the actual message String json = message.getText(); - try { - TopologyBuilder.handleMemberReadyToShutdown((InstanceReadyToShutdownEvent) Util. + TopologyBuilder.handleMemberReadyToShutdown((InstanceReadyToShutdownEvent) Util. jsonToObject(json, InstanceReadyToShutdownEvent.class)); - } catch (InvalidLifecycleTransitionException e) { - //TODO: handle properly - log.error(e); - } - } else if (InstanceMaintenanceModeEvent.class.getName().equals(type)) { //retrieve the actual message String json = message.getText(); - try { - TopologyBuilder.handleMemberMaintenance((InstanceMaintenanceModeEvent) Util. + TopologyBuilder.handleMemberMaintenance((InstanceMaintenanceModeEvent) Util. jsonToObject(json, InstanceMaintenanceModeEvent.class)); - } catch (InvalidLifecycleTransitionException e) { - //TODO: handle properly - log.error(e); - } - } else { log.warn("Event message received is not InstanceStartedEvent or InstanceActivatedEvent"); } http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java index 906323b..9f74524 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java @@ -29,7 +29,6 @@ import org.apache.stratos.cloud.controller.publisher.CartridgeInstanceDataPublis import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder; import org.apache.stratos.cloud.controller.util.CloudControllerUtil; import org.apache.stratos.messaging.domain.topology.*; -import org.apache.stratos.messaging.domain.topology.lifecycle.InvalidLifecycleTransitionException; import org.apache.stratos.messaging.domain.topology.util.CompositeApplicationBuilder; import org.apache.stratos.messaging.event.application.status.ApplicationActivatedEvent; import org.apache.stratos.messaging.event.application.status.ClusterActivatedEvent; @@ -151,7 +150,7 @@ public class TopologyBuilder { } cluster.setProperties(props); cluster.setLbCluster(isLb); - cluster.setStatus(Status.Created); + //cluster.setStatus(Status.Created); service.addCluster(cluster); } TopologyManager.updateTopology(topology); @@ -210,7 +209,11 @@ public class TopologyBuilder { try { TopologyManager.acquireWriteLock(); Cluster cluster = service.getCluster(ctxt.getClusterId()); - cluster.setStatus(Status.In_Active); + if (!cluster.isStateTransitionValid(ClusterStatus.Inactive)) { + log.error("Invalid State Transition from " + cluster.getStatus() + " to " + ClusterStatus.Inactive); + } + cluster.setStatus(ClusterStatus.Inactive); + //cluster.setStatus(Status.In_Maintenance); TopologyManager.updateTopology(topology); } finally { TopologyManager.releaseWriteLock(); @@ -256,7 +259,7 @@ public class TopologyBuilder { publicIp, privateIp, context); } - public static void handleMemberStarted(InstanceStartedEvent instanceStartedEvent) throws InvalidLifecycleTransitionException { + public static void handleMemberStarted(InstanceStartedEvent instanceStartedEvent) { Topology topology = TopologyManager.getTopology(); Service service = topology.getService(instanceStartedEvent.getServiceName()); if (service == null) { @@ -303,6 +306,9 @@ public class TopologyBuilder { try { TopologyManager.acquireWriteLock(); // try update lifecycle state + if (!member.isStateTransitionValid(MemberStatus.Starting)) { + log.error("Invalid State Transition from " + member.getStatus() + " to " + MemberStatus.Starting); + } member.setStatus(MemberStatus.Starting); log.info("member started event adding status started"); @@ -322,7 +328,7 @@ public class TopologyBuilder { null); } - public static void handleMemberActivated(InstanceActivatedEvent instanceActivatedEvent) throws InvalidLifecycleTransitionException { + public static void handleMemberActivated(InstanceActivatedEvent instanceActivatedEvent) { Topology topology = TopologyManager.getTopology(); Service service = topology.getService(instanceActivatedEvent.getServiceName()); if (service == null) { @@ -372,6 +378,9 @@ public class TopologyBuilder { try { TopologyManager.acquireWriteLock(); // try update lifecycle state + if (!member.isStateTransitionValid(MemberStatus.Activated)) { + log.error("Invalid State Transition from " + member.getStatus() + " to " + MemberStatus.Activated); + } member.setStatus(MemberStatus.Activated); log.info("member started event adding status activated"); Cartridge cartridge = FasterLookUpDataHolder.getInstance(). @@ -407,7 +416,7 @@ public class TopologyBuilder { } public static void handleMemberReadyToShutdown(InstanceReadyToShutdownEvent instanceReadyToShutdownEvent) - throws InvalidMemberException, InvalidCartridgeTypeException, InvalidLifecycleTransitionException { + throws InvalidMemberException, InvalidCartridgeTypeException { Topology topology = TopologyManager.getTopology(); Service service = topology.getService(instanceReadyToShutdownEvent.getServiceName()); //update the status of the member @@ -459,6 +468,10 @@ public class TopologyBuilder { instanceReadyToShutdownEvent.getMemberId()); try { TopologyManager.acquireWriteLock(); + + if (!member.isStateTransitionValid(MemberStatus.ReadyToShutDown)) { + log.error("Invalid State Transition from " + member.getStatus() + " to " + MemberStatus.ReadyToShutDown); + } member.setStatus(MemberStatus.ReadyToShutDown); log.info("Member Ready to shut down event adding status started"); @@ -479,7 +492,7 @@ public class TopologyBuilder { } public static void handleMemberMaintenance(InstanceMaintenanceModeEvent instanceMaintenanceModeEvent) - throws InvalidMemberException, InvalidCartridgeTypeException, InvalidLifecycleTransitionException { + throws InvalidMemberException, InvalidCartridgeTypeException { Topology topology = TopologyManager.getTopology(); Service service = topology.getService(instanceMaintenanceModeEvent.getServiceName()); //update the status of the member @@ -535,6 +548,9 @@ public class TopologyBuilder { try { TopologyManager.acquireWriteLock(); // try update lifecycle state + if (!member.isStateTransitionValid(MemberStatus.In_Maintenance)) { + log.error("Invalid State Transition from " + member.getStatus() + " to " + MemberStatus.In_Maintenance); + } member.setStatus(MemberStatus.In_Maintenance); log.info("member maintenance mode event adding status started"); @@ -630,7 +646,7 @@ public class TopologyBuilder { Cluster cluster = new Cluster(applicationClusterContext.getCartridgeType(), applicationClusterContext.getClusterId(), applicationClusterContext.getDeploymentPolicyName(), applicationClusterContext.getAutoscalePolicyName(), application.getUniqueIdentifier()); - cluster.setStatus(Status.Created); + //cluster.setStatus(Status.Created); cluster.addHostName(applicationClusterContext.getHostName()); cluster.setTenantRange(applicationClusterContext.getTenantRange()); clusters.add(cluster); @@ -756,7 +772,8 @@ public class TopologyBuilder { clusterActivatedEvent.getClusterId()); try { TopologyManager.acquireWriteLock(); - cluster.setStatus(Status.Activated); + //cluster.setStatus(Status.Activated); + cluster.setStatus(ClusterStatus.Active); log.info("Cluster activated adding status started"); TopologyManager.updateTopology(topology); http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java index 4fff70a..ed8aa05 100644 --- a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java +++ b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java @@ -32,7 +32,6 @@ import org.apache.stratos.load.balancer.context.LoadBalancerContext; import org.apache.stratos.load.balancer.context.LoadBalancerContextUtil; import org.apache.stratos.load.balancer.exception.InvalidConfigurationException; import org.apache.stratos.messaging.domain.topology.*; -import org.apache.stratos.messaging.domain.topology.lifecycle.InvalidLifecycleTransitionException; import org.apache.stratos.messaging.message.receiver.topology.TopologyManager; import java.io.File; @@ -489,12 +488,7 @@ public class LoadBalancerConfiguration { Port port = new Port(portNode.getName(), Integer.valueOf(value), Integer.valueOf(proxy)); member.addPort(port); } - try { - member.setStatus(MemberStatus.Activated); - - } catch (InvalidLifecycleTransitionException e) { - log.error(e); - } + member.setStatus(MemberStatus.Activated); cluster.addMember(member); } // Add cluster to service http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java index 578089a..31b7bf1 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java @@ -20,6 +20,7 @@ package org.apache.stratos.messaging.domain.topology; import org.apache.commons.lang3.StringUtils; +import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleStateManager; import org.apache.stratos.messaging.util.Util; import org.apache.stratos.messaging.util.bean.type.map.MapAdapter; @@ -33,7 +34,7 @@ import java.util.*; * Key: serviceName, clusterId */ @XmlRootElement -public class Cluster implements Serializable { +public class Cluster implements Serializable, LifeCycleStateTransitionBehavior<ClusterStatus> { private static final long serialVersionUID = -361960242360176077L; @@ -49,13 +50,14 @@ public class Cluster implements Serializable { @XmlJavaTypeAdapter(MapAdapter.class) private Map<String, Member> memberMap; - private Status status; + //private Status status; private String appId; private String loadBalanceAlgorithmName; @XmlJavaTypeAdapter(MapAdapter.class) private Properties properties; + private LifeCycleStateManager<ClusterStatus> clusterStateManager; public Cluster(String serviceName, String clusterId, String deploymentPolicyName, String autoscalePolicyName, String appId) { @@ -66,6 +68,7 @@ public class Cluster implements Serializable { this.hostNames = new ArrayList<String>(); this.memberMap = new HashMap<String, Member>(); this.appId = appId; + this.clusterStateManager = new LifeCycleStateManager<ClusterStatus>(ClusterStatus.Created); } public String getServiceName() { @@ -207,12 +210,24 @@ public class Cluster implements Serializable { return partitionIds.keySet(); } - public Status getStatus() { - return status; + @Override + public boolean isStateTransitionValid(ClusterStatus newState) { + return clusterStateManager.isStateTransitionValid(newState); + } + + @Override + public Stack<ClusterStatus> getTransitionedStates() { + return clusterStateManager.getStateStack(); + } + + public ClusterStatus getStatus() { + //return status; + return clusterStateManager.getCurrentState(); } - public void setStatus(Status status) { - this.status = status; + public void setStatus(ClusterStatus newStatus) { + clusterStateManager.changeState(newStatus); + //this.status = newStatus; } public boolean equals(Object other) { http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ClusterStatus.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ClusterStatus.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ClusterStatus.java index 9556c4d..a9f8afe 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ClusterStatus.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ClusterStatus.java @@ -18,13 +18,38 @@ */ package org.apache.stratos.messaging.domain.topology; -public enum ClusterStatus { - Created(1), - In_Maintenance(2), - terminating(3), - Removed(4), - Running(5), - Active(6); + +import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public enum ClusterStatus implements LifeCycleState { + Created(0) { + @Override + public Set<LifeCycleState> getNextStates() { + return new HashSet<LifeCycleState>(Arrays.asList(ClusterStatus.Active)); + } + }, + Active(1) { + @Override + public Set<LifeCycleState> getNextStates() { + return new HashSet<LifeCycleState>(Arrays.asList(ClusterStatus.Inactive)); + } + }, + Inactive(3) { + @Override + public Set<LifeCycleState> getNextStates() { + return new HashSet<LifeCycleState>(Arrays.asList(ClusterStatus.Active, ClusterStatus.Terminated)); + } + }, + Terminated(4) { + @Override + public Set<LifeCycleState> getNextStates() { + return null; + } + }; private int code; @@ -35,5 +60,4 @@ public enum ClusterStatus { public int getCode() { return code; } - } http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/LifeCycleStateTransitionBehavior.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/LifeCycleStateTransitionBehavior.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/LifeCycleStateTransitionBehavior.java new file mode 100644 index 0000000..2199b9a --- /dev/null +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/LifeCycleStateTransitionBehavior.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.stratos.messaging.domain.topology; + +import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState; + +import java.util.Stack; + +public interface LifeCycleStateTransitionBehavior<T extends LifeCycleState> { + + public boolean isStateTransitionValid(T newState); + + public Stack<T> getTransitionedStates (); + + public T getStatus(); + + public void setStatus(T newState); +} http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java index 4ea198c..f0cde24 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java @@ -19,7 +19,7 @@ package org.apache.stratos.messaging.domain.topology; -import org.apache.stratos.messaging.domain.topology.lifecycle.InvalidLifecycleTransitionException; +import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState; import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleStateManager; import org.apache.stratos.messaging.util.bean.type.map.MapAdapter; @@ -33,7 +33,7 @@ import java.util.*; * Key: serviceName, clusterId, memberId */ @XmlRootElement -public class Member implements Serializable { +public class Member implements Serializable, LifeCycleStateTransitionBehavior<MemberStatus> { private static final long serialVersionUID = 4179661867903664661L; private final String serviceName; @@ -74,16 +74,27 @@ public class Member implements Serializable { return memberId; } + @Override + public boolean isStateTransitionValid(MemberStatus newState) { + return memberStateManager.isStateTransitionValid(newState); + } + + @Override public MemberStatus getStatus() { return memberStateManager.getCurrentState(); } - public void setStatus(MemberStatus status) throws InvalidLifecycleTransitionException { - this.memberStateManager.changeState(status); + public Stack<MemberStatus> getTransitionedStates () { + return memberStateManager.getStateStack(); + } + + @Override + public void setStatus(MemberStatus newState) { + memberStateManager.changeState(newState); } - public boolean isActive() { - return (this.memberStateManager.getCurrentState() == MemberStatus.Activated); + public boolean isActive () { + return memberStateManager.getCurrentState().equals(MemberStatus.Activated); } public Collection<Port> getPorts() { http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/InvalidLifecycleTransitionException.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/InvalidLifecycleTransitionException.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/InvalidLifecycleTransitionException.java deleted file mode 100644 index 279e70d..0000000 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/InvalidLifecycleTransitionException.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.stratos.messaging.domain.topology.lifecycle; - -public class InvalidLifecycleTransitionException extends Exception { - - private String message; - - public InvalidLifecycleTransitionException() { - super(); - } - - public InvalidLifecycleTransitionException(String message, Throwable cause) { - super(message, cause); - this.message = message; - } - - public InvalidLifecycleTransitionException(String message) { - super(message); - this.message = message; - } - - public InvalidLifecycleTransitionException(Throwable cause) { - super(cause); - } - - public String getMessage() { - return message; - } -} http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java index ee0d6e5..8131b1d 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java @@ -35,23 +35,24 @@ public class LifeCycleStateManager<T extends LifeCycleState> implements Serializ public LifeCycleStateManager(T initialState) { stateStack = new Stack<T>(); stateStack.push(initialState); + //if (log.isDebugEnabled()) { + log.info("Life Cycle State Manager created, initial state: " + initialState.toString()); + //} } - public void changeState (T nextState) throws InvalidLifecycleTransitionException { + public <S extends TopologyEvent> boolean isPreConditionsValid (T nextState, S topologyEvent) { + // TODO: implement + return true; + } + + public boolean isStateTransitionValid (T nextState) { - if(getCurrentState().getNextStates().contains(nextState)) { - // do the transition - stateStack.push(nextState); - //if (log.isDebugEnabled()) { - log.info("Life Cycle State successfully updated from " + getCurrentState() + " to " + nextState); - //} - } else { - // invalid state transition - String errorMsg = "Attempted transition from " + getCurrentState() + " to " + nextState - + " is invalid"; - log.error(errorMsg); - throw new InvalidLifecycleTransitionException(errorMsg); - } + return stateStack.peek().getNextStates().contains(nextState); + } + + public void changeState (T nextState) { + + stateStack.push(nextState); } public Stack<T> getStateStack () { @@ -61,4 +62,8 @@ public class LifeCycleStateManager<T extends LifeCycleState> implements Serializ public T getCurrentState () { return stateStack.peek(); } + + public T getPreviousState () { + return stateStack.get(1); + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterActivatedProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterActivatedProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterActivatedProcessor.java index cb8eb5f..69fc3e7 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterActivatedProcessor.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterActivatedProcessor.java @@ -20,10 +20,7 @@ package org.apache.stratos.messaging.message.processor.topology; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.stratos.messaging.domain.topology.Cluster; -import org.apache.stratos.messaging.domain.topology.Service; -import org.apache.stratos.messaging.domain.topology.Status; -import org.apache.stratos.messaging.domain.topology.Topology; +import org.apache.stratos.messaging.domain.topology.*; import org.apache.stratos.messaging.event.topology.ClusterActivatedEvent; import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilter; import org.apache.stratos.messaging.message.filter.topology.TopologyServiceFilter; @@ -118,7 +115,10 @@ public class ClusterActivatedProcessor extends MessageProcessor { } } else { // Apply changes to the topology - cluster.setStatus(Status.Activated); + if (!cluster.isStateTransitionValid(ClusterStatus.Active)) { + log.error("Invalid State Transition from " + cluster.getStatus() + " to " + ClusterStatus.Active); + } + cluster.setStatus(ClusterStatus.Active); if (log.isInfoEnabled()) { log.info(String.format("Cluster updated as activated : %s", cluster.toString())); http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterMaintenanceModeMessageProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterMaintenanceModeMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterMaintenanceModeMessageProcessor.java index 4dc573e..35966e8 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterMaintenanceModeMessageProcessor.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterMaintenanceModeMessageProcessor.java @@ -110,7 +110,10 @@ public class ClusterMaintenanceModeMessageProcessor extends MessageProcessor { } } else { // Apply changes to the topology - cluster.setStatus(Status.In_Active); + if (!cluster.isStateTransitionValid(ClusterStatus.Inactive)) { + log.error("Invalid State Transition from " + cluster.getStatus() + " to " + ClusterStatus.Inactive); + } + cluster.setStatus(ClusterStatus.Inactive); if (log.isInfoEnabled()) { log.info(String.format("Cluster updated as maintenance mode: %s", cluster.toString())); http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberActivatedMessageProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberActivatedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberActivatedMessageProcessor.java index dc98c9e..db9c85c 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberActivatedMessageProcessor.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberActivatedMessageProcessor.java @@ -25,7 +25,6 @@ import org.apache.stratos.messaging.domain.topology.Member; import org.apache.stratos.messaging.domain.topology.MemberStatus; import org.apache.stratos.messaging.domain.topology.Service; import org.apache.stratos.messaging.domain.topology.Topology; -import org.apache.stratos.messaging.domain.topology.lifecycle.InvalidLifecycleTransitionException; import org.apache.stratos.messaging.event.topology.MemberActivatedEvent; import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilter; import org.apache.stratos.messaging.message.filter.topology.TopologyMemberFilter; @@ -60,10 +59,6 @@ public class MemberActivatedMessageProcessor extends MessageProcessor { try { return doProcess(event, topology); - } catch (InvalidLifecycleTransitionException e) { - log.error(e); - return false; - } finally { TopologyUpdater.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId()); } @@ -78,7 +73,7 @@ public class MemberActivatedMessageProcessor extends MessageProcessor { } } - private boolean doProcess (MemberActivatedEvent event,Topology topology) throws InvalidLifecycleTransitionException { + private boolean doProcess (MemberActivatedEvent event,Topology topology) { // Apply service filter if (TopologyServiceFilter.getInstance().isActive()) { @@ -165,6 +160,9 @@ public class MemberActivatedMessageProcessor extends MessageProcessor { // Apply changes to the topology member.addPorts(event.getPorts()); member.setMemberIp(event.getMemberIp()); + if (!member.isStateTransitionValid(MemberStatus.Activated)) { + log.error("Invalid State Transition from " + member.getStatus() + " to " + MemberStatus.Activated); + } member.setStatus(MemberStatus.Activated); if (log.isInfoEnabled()) { http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberMaintenanceModeProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberMaintenanceModeProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberMaintenanceModeProcessor.java index 9408e46..2810b19 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberMaintenanceModeProcessor.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberMaintenanceModeProcessor.java @@ -22,7 +22,6 @@ package org.apache.stratos.messaging.message.processor.topology; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.stratos.messaging.domain.topology.*; -import org.apache.stratos.messaging.domain.topology.lifecycle.InvalidLifecycleTransitionException; import org.apache.stratos.messaging.event.topology.MemberMaintenanceModeEvent; import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilter; import org.apache.stratos.messaging.message.filter.topology.TopologyMemberFilter; @@ -57,10 +56,6 @@ public class MemberMaintenanceModeProcessor extends MessageProcessor { try { return doProcess(event, topology); - } catch (InvalidLifecycleTransitionException e) { - log.error(e); - return false; - } finally { TopologyUpdater.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId()); } @@ -75,7 +70,7 @@ public class MemberMaintenanceModeProcessor extends MessageProcessor { } } - private boolean doProcess (MemberMaintenanceModeEvent event,Topology topology) throws InvalidLifecycleTransitionException { + private boolean doProcess (MemberMaintenanceModeEvent event,Topology topology) { // Apply service filter if (TopologyServiceFilter.getInstance().isActive()) { @@ -148,6 +143,9 @@ public class MemberMaintenanceModeProcessor extends MessageProcessor { } else { // Apply changes to the topology + if (!member.isStateTransitionValid(MemberStatus.In_Maintenance)) { + log.error("Invalid State Transition from " + member.getStatus() + " to " + MemberStatus.In_Maintenance); + } member.setStatus(MemberStatus.In_Maintenance); if (log.isInfoEnabled()) { http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberReadyToShutdownMessageProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberReadyToShutdownMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberReadyToShutdownMessageProcessor.java index 83bb94f..2ede9da 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberReadyToShutdownMessageProcessor.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberReadyToShutdownMessageProcessor.java @@ -21,7 +21,6 @@ package org.apache.stratos.messaging.message.processor.topology; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.stratos.messaging.domain.topology.*; -import org.apache.stratos.messaging.domain.topology.lifecycle.InvalidLifecycleTransitionException; import org.apache.stratos.messaging.event.topology.MemberReadyToShutdownEvent; import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilter; import org.apache.stratos.messaging.message.filter.topology.TopologyMemberFilter; @@ -56,10 +55,6 @@ public class MemberReadyToShutdownMessageProcessor extends MessageProcessor{ try { return doProcess(event, topology); - } catch (InvalidLifecycleTransitionException e) { - log.error(e); - return false; - } finally { TopologyUpdater.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId()); } @@ -74,7 +69,7 @@ public class MemberReadyToShutdownMessageProcessor extends MessageProcessor{ } } - private boolean doProcess (MemberReadyToShutdownEvent event,Topology topology) throws InvalidLifecycleTransitionException { + private boolean doProcess (MemberReadyToShutdownEvent event,Topology topology) { // Apply service filter if (TopologyServiceFilter.getInstance().isActive()) { @@ -147,6 +142,9 @@ public class MemberReadyToShutdownMessageProcessor extends MessageProcessor{ } else { // Apply changes to the topology + if (!member.isStateTransitionValid(MemberStatus.ReadyToShutDown)) { + log.error("Invalid State Transition from " + member.getStatus() + " to " + MemberStatus.ReadyToShutDown); + } member.setStatus(MemberStatus.ReadyToShutDown); if (log.isInfoEnabled()) { http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberStartedMessageProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberStartedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberStartedMessageProcessor.java index b55ea26..2e4b171 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberStartedMessageProcessor.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberStartedMessageProcessor.java @@ -25,7 +25,6 @@ import org.apache.stratos.messaging.domain.topology.Member; import org.apache.stratos.messaging.domain.topology.MemberStatus; import org.apache.stratos.messaging.domain.topology.Service; import org.apache.stratos.messaging.domain.topology.Topology; -import org.apache.stratos.messaging.domain.topology.lifecycle.InvalidLifecycleTransitionException; import org.apache.stratos.messaging.event.topology.MemberStartedEvent; import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilter; import org.apache.stratos.messaging.message.filter.topology.TopologyMemberFilter; @@ -60,10 +59,6 @@ public class MemberStartedMessageProcessor extends MessageProcessor { try { return doProcess(event, topology); - } catch (InvalidLifecycleTransitionException e) { - log.error(e); - return false; - } finally { TopologyUpdater.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId()); } @@ -78,7 +73,7 @@ public class MemberStartedMessageProcessor extends MessageProcessor { } } - private boolean doProcess (MemberStartedEvent event,Topology topology) throws InvalidLifecycleTransitionException { + private boolean doProcess (MemberStartedEvent event,Topology topology) { // Apply service filter if (TopologyServiceFilter.getInstance().isActive()) { @@ -150,6 +145,9 @@ public class MemberStartedMessageProcessor extends MessageProcessor { } else { // Apply changes to the topology + if (!member.isStateTransitionValid(MemberStatus.Starting)) { + log.error("Invalid State Transition from " + member.getStatus() + " to " + MemberStatus.Starting); + } member.setStatus(MemberStatus.Starting); if (log.isInfoEnabled()) { http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberSuspendedMessageProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberSuspendedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberSuspendedMessageProcessor.java index 56cc055..e57903f 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberSuspendedMessageProcessor.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberSuspendedMessageProcessor.java @@ -25,7 +25,6 @@ import org.apache.stratos.messaging.domain.topology.Member; import org.apache.stratos.messaging.domain.topology.MemberStatus; import org.apache.stratos.messaging.domain.topology.Service; import org.apache.stratos.messaging.domain.topology.Topology; -import org.apache.stratos.messaging.domain.topology.lifecycle.InvalidLifecycleTransitionException; import org.apache.stratos.messaging.event.topology.MemberSuspendedEvent; import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilter; import org.apache.stratos.messaging.message.filter.topology.TopologyMemberFilter; @@ -60,10 +59,6 @@ public class MemberSuspendedMessageProcessor extends MessageProcessor { try { return doProcess(event, topology); - } catch (InvalidLifecycleTransitionException e) { - log.error(e); - return false; - } finally { TopologyUpdater.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId()); } @@ -78,7 +73,7 @@ public class MemberSuspendedMessageProcessor extends MessageProcessor { } } - private boolean doProcess (MemberSuspendedEvent event,Topology topology) throws InvalidLifecycleTransitionException { + private boolean doProcess (MemberSuspendedEvent event,Topology topology) { // Apply service filter if (TopologyServiceFilter.getInstance().isActive()) { @@ -150,6 +145,9 @@ public class MemberSuspendedMessageProcessor extends MessageProcessor { } else { // Apply changes to the topology + if (!member.isStateTransitionValid(MemberStatus.Suspended)) { + log.error("Invalid State Transition from " + member.getStatus() + " to " + MemberStatus.Suspended); + } member.setStatus(MemberStatus.Suspended); if (log.isInfoEnabled()) {
