You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jo...@apache.org on 2015/01/29 00:33:03 UTC

[3/3] ambari git commit: AMBARI-9368 - Deadlock Between Dependent Cluster/Service/Component/Host Implementations (jonathanhurley)

AMBARI-9368 - Deadlock Between Dependent Cluster/Service/Component/Host Implementations (jonathanhurley)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/23d506e2
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/23d506e2
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/23d506e2

Branch: refs/heads/trunk
Commit: 23d506e2aec743f129aaa48a7a1619be9d33910a
Parents: 86dc939
Author: Jonathan Hurley <jh...@hortonworks.com>
Authored: Wed Jan 28 15:08:26 2015 -0500
Committer: Jonathan Hurley <jh...@hortonworks.com>
Committed: Wed Jan 28 18:32:55 2015 -0500

----------------------------------------------------------------------
 .../server/state/ServiceComponentImpl.java      |  304 ++-
 .../apache/ambari/server/state/ServiceImpl.java |  292 +--
 .../server/state/cluster/ClusterImpl.java       | 1741 ++++++++----------
 .../svccomphost/ServiceComponentHostImpl.java   |  697 +++----
 .../state/cluster/ClusterDeadlockTest.java      |  363 ++++
 5 files changed, 1540 insertions(+), 1857 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/23d506e2/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
index a31e42c..d1b40df 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
@@ -18,12 +18,12 @@
 
 package org.apache.ambari.server.state;
 
-import com.google.gson.Gson;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
-import com.google.inject.persist.Transactional;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.ObjectNotFoundException;
 import org.apache.ambari.server.ServiceComponentHostNotFoundException;
@@ -43,11 +43,12 @@ import org.apache.ambari.server.state.cluster.ClusterImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
+import com.google.gson.Gson;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import com.google.inject.persist.Transactional;
 
 public class ServiceComponentImpl implements ServiceComponent {
 
@@ -78,22 +79,22 @@ public class ServiceComponentImpl implements ServiceComponent {
   public ServiceComponentImpl(@Assisted Service service,
                               @Assisted String componentName, Injector injector) throws AmbariException {
     injector.injectMembers(this);
-    this.clusterGlobalLock = service.getClusterGlobalLock();
+    clusterGlobalLock = service.getClusterGlobalLock();
     this.service = service;
-    this.desiredStateEntity = new ServiceComponentDesiredStateEntity();
+    desiredStateEntity = new ServiceComponentDesiredStateEntity();
     desiredStateEntity.setComponentName(componentName);
     desiredStateEntity.setDesiredState(State.INIT);
 
     setDesiredStackVersion(service.getDesiredStackVersion());
 
-    this.hostComponents = new HashMap<String, ServiceComponentHost>();
+    hostComponents = new HashMap<String, ServiceComponentHost>();
 
     StackId stackId = service.getDesiredStackVersion();
     try {
       ComponentInfo compInfo = ambariMetaInfo.getComponent(stackId.getStackName(),
           stackId.getStackVersion(), service.getName(), componentName);
-      this.isClientComponent = compInfo.isClient();
-      this.isMasterComponent = compInfo.isMaster();
+      isClientComponent = compInfo.isClient();
+      isMasterComponent = compInfo.isMaster();
     } catch (ObjectNotFoundException e) {
       throw new RuntimeException("Trying to create a ServiceComponent"
           + " not recognized in stack info"
@@ -102,7 +103,6 @@ public class ServiceComponentImpl implements ServiceComponent {
           + ", componentName=" + componentName
           + ", stackInfo=" + stackId.getStackId());
     }
-    init();
   }
 
   @AssistedInject
@@ -110,11 +110,11 @@ public class ServiceComponentImpl implements ServiceComponent {
                               @Assisted ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntity,
                               Injector injector) throws AmbariException {
     injector.injectMembers(this);
-    this.clusterGlobalLock = service.getClusterGlobalLock();
+    clusterGlobalLock = service.getClusterGlobalLock();
     this.service = service;
-    this.desiredStateEntity = serviceComponentDesiredStateEntity;
+    desiredStateEntity = serviceComponentDesiredStateEntity;
 
-    this.hostComponents = new HashMap<String, ServiceComponentHost>();
+    hostComponents = new HashMap<String, ServiceComponentHost>();
     for (HostComponentStateEntity hostComponentStateEntity : desiredStateEntity.getHostComponentStateEntities()) {
       HostComponentDesiredStateEntityPK pk = new HostComponentDesiredStateEntityPK();
       pk.setClusterId(hostComponentStateEntity.getClusterId());
@@ -134,8 +134,8 @@ public class ServiceComponentImpl implements ServiceComponent {
       ComponentInfo compInfo = ambariMetaInfo.getComponent(
           stackId.getStackName(), stackId.getStackVersion(), service.getName(),
           getName());
-      this.isClientComponent = compInfo.isClient();
-      this.isMasterComponent = compInfo.isMaster();
+      isClientComponent = compInfo.isClient();
+      isMasterComponent = compInfo.isMaster();
     } catch (ObjectNotFoundException e) {
       throw new AmbariException("Trying to create a ServiceComponent"
           + " not recognized in stack info"
@@ -148,11 +148,6 @@ public class ServiceComponentImpl implements ServiceComponent {
     persisted = true;
   }
 
-  private void init() {
-    // TODO load during restart
-    // initialize from DB
-  }
-
   @Override
   public ReadWriteLock getClusterGlobalLock() {
     return clusterGlobalLock;
@@ -160,47 +155,17 @@ public class ServiceComponentImpl implements ServiceComponent {
 
   @Override
   public String getName() {
-    clusterGlobalLock.readLock().lock();
-    try {
-      readWriteLock.readLock().lock();
-      try {
-        return desiredStateEntity.getComponentName();
-      } finally {
-        readWriteLock.readLock().unlock();
-      }
-    } finally {
-      clusterGlobalLock.readLock().unlock();
-    }
+    return desiredStateEntity.getComponentName();
   }
 
   @Override
   public String getServiceName() {
-    clusterGlobalLock.readLock().lock();
-    try {
-      readWriteLock.readLock().lock();
-      try {
-        return service.getName();
-      } finally {
-        readWriteLock.readLock().unlock();
-      }
-    } finally {
-      clusterGlobalLock.readLock().unlock();
-    }
+    return service.getName();
   }
 
   @Override
   public long getClusterId() {
-    clusterGlobalLock.readLock().lock();
-    try {
-      readWriteLock.readLock().lock();
-      try {
-        return this.service.getClusterId();
-      } finally {
-        readWriteLock.readLock().unlock();
-      }
-    } finally {
-      clusterGlobalLock.readLock().unlock();
-    }
+    return service.getClusterId();
   }
 
   @Override
@@ -272,7 +237,7 @@ public class ServiceComponentImpl implements ServiceComponent {
         // FIXME need a better approach of caching components by host
         ClusterImpl clusterImpl = (ClusterImpl) service.getCluster();
         clusterImpl.addServiceComponentHost(hostComponent);
-        this.hostComponents.put(hostComponent.getHostName(), hostComponent);
+        hostComponents.put(hostComponent.getHostName(), hostComponent);
       } finally {
         readWriteLock.writeLock().unlock();
       }
@@ -311,7 +276,7 @@ public class ServiceComponentImpl implements ServiceComponent {
         ClusterImpl clusterImpl = (ClusterImpl) service.getCluster();
         clusterImpl.addServiceComponentHost(hostComponent);
 
-        this.hostComponents.put(hostComponent.getHostName(), hostComponent);
+        hostComponents.put(hostComponent.getHostName(), hostComponent);
 
         return hostComponent;
       } finally {
@@ -333,7 +298,7 @@ public class ServiceComponentImpl implements ServiceComponent {
           throw new ServiceComponentHostNotFoundException(getClusterName(),
               getServiceName(), getName(), hostname);
         }
-        return this.hostComponents.get(hostname);
+        return hostComponents.get(hostname);
       } finally {
         readWriteLock.readLock().unlock();
       }
@@ -344,149 +309,106 @@ public class ServiceComponentImpl implements ServiceComponent {
 
   @Override
   public State getDesiredState() {
-    clusterGlobalLock.readLock().lock();
+    readWriteLock.readLock().lock();
     try {
-      readWriteLock.readLock().lock();
-      try {
-        return desiredStateEntity.getDesiredState();
-      } finally {
-        readWriteLock.readLock().unlock();
-      }
+      return desiredStateEntity.getDesiredState();
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      readWriteLock.readLock().unlock();
     }
   }
 
   @Override
   public void setDesiredState(State state) {
-    clusterGlobalLock.readLock().lock();
+    readWriteLock.writeLock().lock();
     try {
-      readWriteLock.writeLock().lock();
-      try {
-        if (LOG.isDebugEnabled()) {
-          LOG.debug("Setting DesiredState of Service"
-              + ", clusterName=" + service.getCluster().getClusterName()
-              + ", clusterId=" + service.getCluster().getClusterId()
-              + ", serviceName=" + service.getName()
-              + ", serviceComponentName=" + getName()
-              + ", oldDesiredState=" + getDesiredState()
-              + ", newDesiredState=" + state);
-        }
-        desiredStateEntity.setDesiredState(state);
-        saveIfPersisted();
-      } finally {
-        readWriteLock.writeLock().unlock();
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Setting DesiredState of Service" + ", clusterName="
+            + service.getCluster().getClusterName() + ", clusterId="
+            + service.getCluster().getClusterId() + ", serviceName="
+            + service.getName() + ", serviceComponentName=" + getName()
+            + ", oldDesiredState=" + getDesiredState() + ", newDesiredState="
+            + state);
       }
+      desiredStateEntity.setDesiredState(state);
+      saveIfPersisted();
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      readWriteLock.writeLock().unlock();
     }
   }
 
   @Override
   public StackId getDesiredStackVersion() {
-    clusterGlobalLock.readLock().lock();
+    readWriteLock.readLock().lock();
     try {
-      readWriteLock.readLock().lock();
-      try {
-        return gson.fromJson(desiredStateEntity.getDesiredStackVersion(), StackId.class);
-      } finally {
-        readWriteLock.readLock().unlock();
-      }
+      return gson.fromJson(desiredStateEntity.getDesiredStackVersion(),
+          StackId.class);
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      readWriteLock.readLock().unlock();
     }
   }
 
   @Override
   public void setDesiredStackVersion(StackId stackVersion) {
-    clusterGlobalLock.readLock().lock();
+    readWriteLock.writeLock().lock();
     try {
-      readWriteLock.writeLock().lock();
-      try {
-        if (LOG.isDebugEnabled()) {
-          LOG.debug("Setting DesiredStackVersion of Service"
-              + ", clusterName=" + service.getCluster().getClusterName()
-              + ", clusterId=" + service.getCluster().getClusterId()
-              + ", serviceName=" + service.getName()
-              + ", serviceComponentName=" + getName()
-              + ", oldDesiredStackVersion=" + getDesiredStackVersion()
-              + ", newDesiredStackVersion=" + stackVersion);
-        }
-        desiredStateEntity.setDesiredStackVersion(gson.toJson(stackVersion));
-        saveIfPersisted();
-      } finally {
-        readWriteLock.writeLock().unlock();
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Setting DesiredStackVersion of Service" + ", clusterName="
+            + service.getCluster().getClusterName() + ", clusterId="
+            + service.getCluster().getClusterId() + ", serviceName="
+            + service.getName() + ", serviceComponentName=" + getName()
+            + ", oldDesiredStackVersion=" + getDesiredStackVersion()
+            + ", newDesiredStackVersion=" + stackVersion);
       }
+      desiredStateEntity.setDesiredStackVersion(gson.toJson(stackVersion));
+      saveIfPersisted();
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      readWriteLock.writeLock().unlock();
     }
   }
 
   @Override
   public ServiceComponentResponse convertToResponse() {
-    clusterGlobalLock.readLock().lock();
+    readWriteLock.readLock().lock();
     try {
-      readWriteLock.readLock().lock();
-      try {
-        ServiceComponentResponse r = new ServiceComponentResponse(
-            getClusterId(), service.getCluster().getClusterName(),
-            service.getName(), getName(),
-            getDesiredStackVersion().getStackId(),
-            getDesiredState().toString(), getTotalCount(), getStartedCount(),
-            getInstalledCount());
-        return r;
-      } finally {
-        readWriteLock.readLock().unlock();
-      }
+      Cluster cluster = service.getCluster();
+      ServiceComponentResponse r = new ServiceComponentResponse(getClusterId(),
+          cluster.getClusterName(), service.getName(), getName(),
+          getDesiredStackVersion().getStackId(), getDesiredState().toString(),
+          getTotalCount(), getStartedCount(), getInstalledCount());
+      return r;
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      readWriteLock.readLock().unlock();
     }
   }
 
   @Override
   public String getClusterName() {
-    clusterGlobalLock.readLock().lock();
-    try {
-      readWriteLock.readLock().lock();
-      try {
-        return service.getCluster().getClusterName();
-      } finally {
-        readWriteLock.readLock().unlock();
-      }
-    } finally {
-      clusterGlobalLock.readLock().unlock();
-    }
+    return service.getCluster().getClusterName();
   }
 
   @Override
   public void debugDump(StringBuilder sb) {
-    clusterGlobalLock.readLock().lock();
+    readWriteLock.readLock().lock();
     try {
-      readWriteLock.readLock().lock();
-      try {
-        sb.append("ServiceComponent={ serviceComponentName=" + getName()
-            + ", clusterName=" + service.getCluster().getClusterName()
-            + ", clusterId=" + service.getCluster().getClusterId()
-            + ", serviceName=" + service.getName()
-            + ", desiredStackVersion=" + getDesiredStackVersion()
-            + ", desiredState=" + getDesiredState().toString()
-            + ", hostcomponents=[ ");
-        boolean first = true;
-        for (ServiceComponentHost sch : hostComponents.values()) {
-          if (!first) {
-            sb.append(" , ");
-            first = false;
-          }
-          sb.append("\n        ");
-          sch.debugDump(sb);
-          sb.append(" ");
+      sb.append("ServiceComponent={ serviceComponentName=" + getName()
+          + ", clusterName=" + service.getCluster().getClusterName()
+          + ", clusterId=" + service.getCluster().getClusterId()
+          + ", serviceName=" + service.getName() + ", desiredStackVersion="
+          + getDesiredStackVersion() + ", desiredState="
+          + getDesiredState().toString() + ", hostcomponents=[ ");
+      boolean first = true;
+      for (ServiceComponentHost sch : hostComponents.values()) {
+        if (!first) {
+          sb.append(" , ");
+          first = false;
         }
-        sb.append(" ] }");
-      } finally {
-        readWriteLock.readLock().unlock();
+        sb.append("\n        ");
+        sch.debugDump(sb);
+        sb.append(" ");
       }
+      sb.append(" ] }");
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      readWriteLock.readLock().unlock();
     }
   }
 
@@ -507,12 +429,22 @@ public class ServiceComponentImpl implements ServiceComponent {
 
   @Override
   public void persist() {
-    clusterGlobalLock.readLock().lock();
+    boolean clusterWriteLockAcquired = false;
+    if (!persisted) {
+      clusterGlobalLock.writeLock().lock();
+      clusterWriteLockAcquired = true;
+    }
+
     try {
       readWriteLock.writeLock().lock();
       try {
         if (!persisted) {
+          // persist the new cluster topology and then release the cluster lock
+          // as it has no more bearing on the rest of this persist() method
           persistEntities();
+          clusterGlobalLock.writeLock().unlock();
+          clusterWriteLockAcquired = false;
+
           refresh();
           service.refresh();
           persisted = true;
@@ -523,7 +455,9 @@ public class ServiceComponentImpl implements ServiceComponent {
         readWriteLock.writeLock().unlock();
       }
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      if (clusterWriteLockAcquired) {
+        clusterGlobalLock.writeLock().unlock();
+      }
     }
   }
 
@@ -542,52 +476,42 @@ public class ServiceComponentImpl implements ServiceComponent {
   @Override
   @Transactional
   public void refresh() {
-    clusterGlobalLock.readLock().lock();
+    readWriteLock.writeLock().lock();
     try {
-      readWriteLock.writeLock().lock();
-      try {
-        if (isPersisted()) {
-          ServiceComponentDesiredStateEntityPK pk = new ServiceComponentDesiredStateEntityPK();
-          pk.setComponentName(getName());
-          pk.setClusterId(getClusterId());
-          pk.setServiceName(getServiceName());
-          // TODO: desiredStateEntity is assigned in unway, may be a bug
-          desiredStateEntity = serviceComponentDesiredStateDAO.findByPK(pk);
-          serviceComponentDesiredStateDAO.refresh(desiredStateEntity);
-        }
-      } finally {
-        readWriteLock.writeLock().unlock();
+      if (isPersisted()) {
+        ServiceComponentDesiredStateEntityPK pk = new ServiceComponentDesiredStateEntityPK();
+        pk.setComponentName(getName());
+        pk.setClusterId(getClusterId());
+        pk.setServiceName(getServiceName());
+        // TODO: desiredStateEntity is assigned in unway, may be a bug
+        desiredStateEntity = serviceComponentDesiredStateDAO.findByPK(pk);
+        serviceComponentDesiredStateDAO.refresh(desiredStateEntity);
       }
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      readWriteLock.writeLock().unlock();
     }
   }
 
   @Transactional
   private void saveIfPersisted() {
-    clusterGlobalLock.readLock().lock();
+    readWriteLock.writeLock().lock();
     try {
-      readWriteLock.writeLock().lock();
-      try {
-        if (isPersisted()) {
-          serviceComponentDesiredStateDAO.merge(desiredStateEntity);
-        }
-      } finally {
-        readWriteLock.writeLock().unlock();
+      if (isPersisted()) {
+        serviceComponentDesiredStateDAO.merge(desiredStateEntity);
       }
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      readWriteLock.writeLock().unlock();
     }
   }
 
   @Override
   public boolean isClientComponent() {
-    return this.isClientComponent;
+    return isClientComponent;
   }
 
   @Override
   public boolean isMasterComponent() {
-    return this.isMasterComponent;
+    return isMasterComponent;
   }
 
   @Override
@@ -655,8 +579,6 @@ public class ServiceComponentImpl implements ServiceComponent {
     } finally {
       clusterGlobalLock.writeLock().unlock();
     }
-
-
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/23d506e2/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
index 85e8314..0de62ea 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
@@ -160,46 +160,21 @@ public class ServiceImpl implements Service {
 
   @Override
   public String getName() {
-    clusterGlobalLock.readLock().lock();
-    try {
-      readWriteLock.readLock().lock();
-      try {
-        return serviceEntity.getServiceName();
-      } finally {
-        readWriteLock.readLock().unlock();
-      }
-    } finally {
-      clusterGlobalLock.readLock().unlock();
-    }
+    return serviceEntity.getServiceName();
   }
 
   @Override
   public long getClusterId() {
-    clusterGlobalLock.readLock().lock();
-    try {
-      readWriteLock.readLock().lock();
-      try {
-        return cluster.getClusterId();
-      } finally {
-        readWriteLock.readLock().unlock();
-      }
-    } finally {
-      clusterGlobalLock.readLock().unlock();
-    }
+    return cluster.getClusterId();
   }
 
   @Override
   public Map<String, ServiceComponent> getServiceComponents() {
-    clusterGlobalLock.readLock().lock();
+    readWriteLock.readLock().lock();
     try {
-      readWriteLock.readLock().lock();
-      try {
-        return new HashMap<String, ServiceComponent>(components);
-      } finally {
-        readWriteLock.readLock().unlock();
-      }
+      return new HashMap<String, ServiceComponent>(components);
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      readWriteLock.readLock().unlock();
     }
   }
 
@@ -282,176 +257,124 @@ public class ServiceImpl implements Service {
     } finally {
       clusterGlobalLock.writeLock().unlock();
     }
-
-
   }
 
   @Override
   public ServiceComponent getServiceComponent(String componentName)
       throws AmbariException {
-    clusterGlobalLock.readLock().lock();
+    readWriteLock.readLock().lock();
     try {
-      readWriteLock.readLock().lock();
-      try {
-        if (!components.containsKey(componentName)) {
-          throw new ServiceComponentNotFoundException(cluster.getClusterName(),
-              getName(),
-              componentName);
-        }
-        return components.get(componentName);
-      } finally {
-        readWriteLock.readLock().unlock();
+      if (!components.containsKey(componentName)) {
+        throw new ServiceComponentNotFoundException(cluster.getClusterName(),
+            getName(), componentName);
       }
+      return components.get(componentName);
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      readWriteLock.readLock().unlock();
     }
-
-
   }
 
   @Override
   public State getDesiredState() {
-    clusterGlobalLock.readLock().lock();
+    readWriteLock.readLock().lock();
     try {
-      readWriteLock.readLock().lock();
-      try {
-        return serviceDesiredStateEntity.getDesiredState();
-      } finally {
-        readWriteLock.readLock().unlock();
-      }
+      return serviceDesiredStateEntity.getDesiredState();
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      readWriteLock.readLock().unlock();
     }
-
-
   }
 
   @Override
   public void setDesiredState(State state) {
-    clusterGlobalLock.readLock().lock();
+    readWriteLock.writeLock().lock();
     try {
-      readWriteLock.writeLock().lock();
-      try {
-        if (LOG.isDebugEnabled()) {
-          LOG.debug("Setting DesiredState of Service"
-              + ", clusterName=" + cluster.getClusterName()
-              + ", clusterId=" + cluster.getClusterId()
-              + ", serviceName=" + getName()
-              + ", oldDesiredState=" + getDesiredState()
-              + ", newDesiredState=" + state);
-        }
-        serviceDesiredStateEntity.setDesiredState(state);
-        saveIfPersisted();
-      } finally {
-        readWriteLock.writeLock().unlock();
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Setting DesiredState of Service" + ", clusterName="
+            + cluster.getClusterName() + ", clusterId="
+            + cluster.getClusterId() + ", serviceName=" + getName()
+            + ", oldDesiredState=" + getDesiredState() + ", newDesiredState="
+            + state);
       }
+      serviceDesiredStateEntity.setDesiredState(state);
+      saveIfPersisted();
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      readWriteLock.writeLock().unlock();
     }
   }
 
   @Override
   public SecurityState getSecurityState() {
-    clusterGlobalLock.readLock().lock();
+    readWriteLock.readLock().lock();
     try {
-      readWriteLock.readLock().lock();
-      try {
-        return serviceDesiredStateEntity.getSecurityState();
-      } finally {
-        readWriteLock.readLock().unlock();
-      }
+      return serviceDesiredStateEntity.getSecurityState();
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      readWriteLock.readLock().unlock();
     }
   }
 
   @Override
   public void setSecurityState(SecurityState securityState) throws AmbariException {
-    if(!securityState.isEndpoint())
+    if(!securityState.isEndpoint()) {
       throw new AmbariException("The security state must be an endpoint state");
+    }
 
-    clusterGlobalLock.readLock().lock();
+    readWriteLock.writeLock().lock();
     try {
-      readWriteLock.writeLock().lock();
-      try {
-        if (LOG.isDebugEnabled()) {
-          LOG.debug("Setting DesiredSecurityState of Service"
-              + ", clusterName=" + cluster.getClusterName()
-              + ", clusterId=" + cluster.getClusterId()
-              + ", serviceName=" + getName()
-              + ", oldDesiredSecurityState=" + getSecurityState()
-              + ", newDesiredSecurityState=" + securityState);
-        }
-        serviceDesiredStateEntity.setSecurityState(securityState);
-        saveIfPersisted();
-      } finally {
-        readWriteLock.writeLock().unlock();
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Setting DesiredSecurityState of Service" + ", clusterName="
+            + cluster.getClusterName() + ", clusterId="
+            + cluster.getClusterId() + ", serviceName=" + getName()
+            + ", oldDesiredSecurityState=" + getSecurityState()
+            + ", newDesiredSecurityState=" + securityState);
       }
+      serviceDesiredStateEntity.setSecurityState(securityState);
+      saveIfPersisted();
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      readWriteLock.writeLock().unlock();
     }
   }
 
   @Override
   public StackId getDesiredStackVersion() {
-    clusterGlobalLock.readLock().lock();
+    readWriteLock.readLock().lock();
     try {
-      readWriteLock.readLock().lock();
-      try {
-        return gson.fromJson(serviceDesiredStateEntity.getDesiredStackVersion(), StackId.class);
-      } finally {
-        readWriteLock.readLock().unlock();
-      }
+      return gson.fromJson(serviceDesiredStateEntity.getDesiredStackVersion(),
+          StackId.class);
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      readWriteLock.readLock().unlock();
     }
   }
 
   @Override
   public void setDesiredStackVersion(StackId stackVersion) {
-    clusterGlobalLock.readLock().lock();
+    readWriteLock.writeLock().lock();
     try {
-      readWriteLock.writeLock().lock();
-      try {
-        if (LOG.isDebugEnabled()) {
-          LOG.debug("Setting DesiredStackVersion of Service"
-              + ", clusterName=" + cluster.getClusterName()
-              + ", clusterId=" + cluster.getClusterId()
-              + ", serviceName=" + getName()
-              + ", oldDesiredStackVersion=" + getDesiredStackVersion()
-              + ", newDesiredStackVersion=" + stackVersion);
-        }
-        serviceDesiredStateEntity.setDesiredStackVersion(gson.toJson(stackVersion));
-        saveIfPersisted();
-      } finally {
-        readWriteLock.writeLock().unlock();
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Setting DesiredStackVersion of Service" + ", clusterName="
+            + cluster.getClusterName() + ", clusterId="
+            + cluster.getClusterId() + ", serviceName=" + getName()
+            + ", oldDesiredStackVersion=" + getDesiredStackVersion()
+            + ", newDesiredStackVersion=" + stackVersion);
       }
+      serviceDesiredStateEntity.setDesiredStackVersion(gson.toJson(stackVersion));
+      saveIfPersisted();
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      readWriteLock.writeLock().unlock();
     }
-
-
   }
 
   @Override
   public ServiceResponse convertToResponse() {
-    clusterGlobalLock.readLock().lock();
+    readWriteLock.readLock().lock();
     try {
-      readWriteLock.readLock().lock();
-      try {
-        ServiceResponse r = new ServiceResponse(cluster.getClusterId(),
-            cluster.getClusterName(),
-            getName(),
-            getDesiredStackVersion().getStackId(),
-            getDesiredState().toString());
-
-        r.setMaintenanceState(getMaintenanceState().name());
-        return r;
-      } finally {
-        readWriteLock.readLock().unlock();
-      }
+      ServiceResponse r = new ServiceResponse(cluster.getClusterId(),
+          cluster.getClusterName(), getName(),
+          getDesiredStackVersion().getStackId(), getDesiredState().toString());
+
+      r.setMaintenanceState(getMaintenanceState().name());
+      return r;
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      readWriteLock.readLock().unlock();
     }
   }
 
@@ -462,32 +385,26 @@ public class ServiceImpl implements Service {
 
   @Override
   public void debugDump(StringBuilder sb) {
-    clusterGlobalLock.readLock().lock();
+    readWriteLock.readLock().lock();
     try {
-      readWriteLock.readLock().lock();
-      try {
-        sb.append("Service={ serviceName=" + getName()
-            + ", clusterName=" + cluster.getClusterName()
-            + ", clusterId=" + cluster.getClusterId()
-            + ", desiredStackVersion=" + getDesiredStackVersion()
-            + ", desiredState=" + getDesiredState().toString()
-            + ", components=[ ");
-        boolean first = true;
-        for (ServiceComponent sc : components.values()) {
-          if (!first) {
-            sb.append(" , ");
-          }
-          first = false;
-          sb.append("\n      ");
-          sc.debugDump(sb);
-          sb.append(" ");
+      sb.append("Service={ serviceName=" + getName() + ", clusterName="
+          + cluster.getClusterName() + ", clusterId=" + cluster.getClusterId()
+          + ", desiredStackVersion=" + getDesiredStackVersion()
+          + ", desiredState=" + getDesiredState().toString()
+          + ", components=[ ");
+      boolean first = true;
+      for (ServiceComponent sc : components.values()) {
+        if (!first) {
+          sb.append(" , ");
         }
-        sb.append(" ] }");
-      } finally {
-        readWriteLock.readLock().unlock();
+        first = false;
+        sb.append("\n      ");
+        sc.debugDump(sb);
+        sb.append(" ");
       }
+      sb.append(" ] }");
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      readWriteLock.readLock().unlock();
     }
   }
 
@@ -504,12 +421,11 @@ public class ServiceImpl implements Service {
     } finally {
       clusterGlobalLock.readLock().unlock();
     }
-
   }
 
   @Override
   public void persist() {
-    clusterGlobalLock.readLock().lock();
+    clusterGlobalLock.writeLock().lock();
     try {
       readWriteLock.writeLock().lock();
       try {
@@ -534,9 +450,8 @@ public class ServiceImpl implements Service {
         readWriteLock.writeLock().unlock();
       }
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      clusterGlobalLock.writeLock().unlock();
     }
-
   }
 
   @Transactional
@@ -564,27 +479,20 @@ public class ServiceImpl implements Service {
   @Override
   @Transactional
   public void refresh() {
-    clusterGlobalLock.readLock().lock();
+    readWriteLock.writeLock().lock();
     try {
-      readWriteLock.writeLock().lock();
-      try {
-        if (isPersisted()) {
-          ClusterServiceEntityPK pk = new ClusterServiceEntityPK();
-          pk.setClusterId(getClusterId());
-          pk.setServiceName(getName());
-          serviceEntity = clusterServiceDAO.findByPK(pk);
-          serviceDesiredStateEntity = serviceEntity.getServiceDesiredStateEntity();
-          clusterServiceDAO.refresh(serviceEntity);
-          serviceDesiredStateDAO.refresh(serviceDesiredStateEntity);
-        }
-      } finally {
-        readWriteLock.writeLock().unlock();
+      if (isPersisted()) {
+        ClusterServiceEntityPK pk = new ClusterServiceEntityPK();
+        pk.setClusterId(getClusterId());
+        pk.setServiceName(getName());
+        serviceEntity = clusterServiceDAO.findByPK(pk);
+        serviceDesiredStateEntity = serviceEntity.getServiceDesiredStateEntity();
+        clusterServiceDAO.refresh(serviceEntity);
+        serviceDesiredStateDAO.refresh(serviceDesiredStateEntity);
       }
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      readWriteLock.writeLock().unlock();
     }
-
-
   }
 
   @Override
@@ -613,8 +521,6 @@ public class ServiceImpl implements Service {
     } finally {
       clusterGlobalLock.readLock().unlock();
     }
-
-
   }
 
   @Override
@@ -730,21 +636,16 @@ public class ServiceImpl implements Service {
 
   @Override
   public void setMaintenanceState(MaintenanceState state) {
-    clusterGlobalLock.readLock().lock();
+    readWriteLock.writeLock().lock();
     try {
-      try {
-        readWriteLock.writeLock().lock();
-        serviceDesiredStateEntity.setMaintenanceState(state);
-        saveIfPersisted();
+      serviceDesiredStateEntity.setMaintenanceState(state);
+      saveIfPersisted();
 
-        // broadcast the maintenance mode change
-        MaintenanceModeEvent event = new MaintenanceModeEvent(state, this);
-        eventPublisher.publish(event);
-      } finally {
-        readWriteLock.writeLock().unlock();
-      }
+      // broadcast the maintenance mode change
+      MaintenanceModeEvent event = new MaintenanceModeEvent(state, this);
+      eventPublisher.publish(event);
     } finally {
-      clusterGlobalLock.readLock().unlock();
+      readWriteLock.writeLock().unlock();
     }
   }
 
@@ -752,5 +653,4 @@ public class ServiceImpl implements Service {
   public MaintenanceState getMaintenanceState() {
     return serviceDesiredStateEntity.getMaintenanceState();
   }
-
 }