Move acquireWriteLock call in terminateInstance method to a separate try-finally block in-order to avoid releasing locks which are not taken
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/cbde779f Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/cbde779f Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/cbde779f Branch: refs/heads/stratos-4.1.x Commit: cbde779f99690d72edddfc6360fafad445cbcb13 Parents: 6ae0185 Author: Akila Perera <[email protected]> Authored: Mon Dec 7 16:04:38 2015 +0530 Committer: Isuru Haththotuwa <[email protected]> Committed: Wed Dec 9 18:41:33 2015 +0530 ---------------------------------------------------------------------- .../impl/CloudControllerServiceImpl.java | 56 ++++++++++---------- 1 file changed, 29 insertions(+), 27 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/cbde779f/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java index 6a1303a..d25ab52 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java @@ -645,41 +645,43 @@ public class CloudControllerServiceImpl implements CloudControllerService { throw new InvalidMemberException(msg); } - // check if status == active, if true, then this is a termination on member faulty - TopologyHolder.acquireWriteLock(); - Topology topology = TopologyHolder.getTopology(); - org.apache.stratos.messaging.domain.topology.Service service = topology - .getService(memberContext.getCartridgeType()); - - if (service != null) { - Cluster cluster = service.getCluster(memberContext.getClusterId()); - if (cluster != null) { - Member member = cluster.getMember(memberId); - if (member != null) { - - // check if ready to shutdown member is expired and send - // member terminated if it is. - if (isMemberExpired(member, memberContext.getObsoleteInitTime(), - memberContext.getObsoleteExpiryTime())) { - if (log.isInfoEnabled()) { - log.info(String.format( - "Member pending termination in ReadyToShutdown state exceeded expiry time. " - + "This member has to be manually deleted: %s", - memberContext.getMemberId())); - } + try { + // check if status == active, if true, then this is a termination on member faulty + TopologyHolder.acquireWriteLock(); + Topology topology = TopologyHolder.getTopology(); + org.apache.stratos.messaging.domain.topology.Service service = topology + .getService(memberContext.getCartridgeType()); + + if (service != null) { + Cluster cluster = service.getCluster(memberContext.getClusterId()); + if (cluster != null) { + Member member = cluster.getMember(memberId); + if (member != null) { + + // check if ready to shutdown member is expired and send + // member terminated if it is. + if (isMemberExpired(member, memberContext.getObsoleteInitTime(), + memberContext.getObsoleteExpiryTime())) { + if (log.isInfoEnabled()) { + log.info(String.format( + "Member pending termination in ReadyToShutdown state exceeded expiry time. " + + "This member has to be manually deleted: %s", + memberContext.getMemberId())); + } - CloudControllerServiceUtil.executeMemberTerminationPostProcess(memberContext); - return false; + CloudControllerServiceUtil.executeMemberTerminationPostProcess(memberContext); + return false; + } } } } + executorService.execute(new InstanceTerminator(memberContext)); + } finally { + TopologyHolder.releaseWriteLock(); } - executorService.execute(new InstanceTerminator(memberContext)); } catch (Exception e) { String message = "Could not terminate instance: [member-id] " + memberId; throw new CloudControllerException(message, e); - } finally { - TopologyHolder.releaseWriteLock(); } return true; }
