You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by sm...@apache.org on 2013/06/04 20:33:32 UTC

svn commit: r1489550 [1/3] - in /incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state: ./ cluster/ svccomphost/

Author: smohanty
Date: Tue Jun  4 18:33:30 2013
New Revision: 1489550

URL: http://svn.apache.org/r1489550
Log:
AMBARI-2195. Ambari has a deadlock when re-installing after reboot of cluster nodes. (Myroslav Papirkovskyy via smohanty)

Modified:
    incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
    incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java
    incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponent.java
    incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
    incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
    incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
    incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java

Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java?rev=1489550&r1=1489549&r2=1489550&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java Tue Jun  4 18:33:30 2013
@@ -21,6 +21,7 @@ package org.apache.ambari.server.state;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.locks.ReadWriteLock;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.ClusterResponse;
@@ -199,4 +200,9 @@ public interface Cluster {
    */
   Service addService(String serviceName) throws AmbariException;
 
+  /**
+   * Get lock to control access to cluster structure
+   * @return cluster-global lock
+   */
+  ReadWriteLock getClusterGlobalLock();
 }

Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java?rev=1489550&r1=1489549&r2=1489550&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java Tue Jun  4 18:33:30 2013
@@ -19,6 +19,7 @@
 package org.apache.ambari.server.state;
 
 import java.util.Map;
+import java.util.concurrent.locks.ReadWriteLock;
 
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.AmbariException;
@@ -85,6 +86,12 @@ public interface Service {
 
   public void delete() throws AmbariException;
 
+  /**
+   * Get lock to control access to cluster structure
+   * @return cluster-global lock
+   */
+  ReadWriteLock getClusterGlobalLock();
+
   public enum Type {
     HDFS,
     MAPREDUCE,

Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponent.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponent.java?rev=1489550&r1=1489549&r2=1489550&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponent.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponent.java Tue Jun  4 18:33:30 2013
@@ -20,6 +20,7 @@ package org.apache.ambari.server.state;
 
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.locks.ReadWriteLock;
 
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.AmbariException;
@@ -84,4 +85,10 @@ public interface ServiceComponent {
       String hostName) throws AmbariException;
 
   public void delete() throws AmbariException;
+
+  /**
+   * Get lock to control access to cluster structure
+   * @return cluster-global lock
+   */
+  ReadWriteLock getClusterGlobalLock();
 }

Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java?rev=1489550&r1=1489549&r2=1489550&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java Tue Jun  4 18:33:30 2013
@@ -44,9 +44,9 @@ public class ServiceComponentImpl implem
   private final static Logger LOG =
       LoggerFactory.getLogger(ServiceComponentImpl.class);
   
-  ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
-
   private final Service service;
+  private final ReadWriteLock clusterGlobalLock;
+  private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
 
   @Inject
   private Gson gson;
@@ -84,6 +84,7 @@ public class ServiceComponentImpl implem
   public ServiceComponentImpl(@Assisted Service service,
       @Assisted String componentName, Injector injector) throws AmbariException {
     injector.injectMembers(this);
+    this.clusterGlobalLock = service.getClusterGlobalLock();
     this.service = service;
     this.desiredStateEntity = new ServiceComponentDesiredStateEntity();
     desiredStateEntity.setComponentName(componentName);
@@ -116,6 +117,7 @@ public class ServiceComponentImpl implem
                               @Assisted ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntity,
                               Injector injector) throws AmbariException {
     injector.injectMembers(this);
+    this.clusterGlobalLock = service.getClusterGlobalLock();
     this.service = service;
     this.desiredStateEntity = serviceComponentDesiredStateEntity;
 
@@ -158,374 +160,493 @@ public class ServiceComponentImpl implem
   }
 
   @Override
+  public ReadWriteLock getClusterGlobalLock() {
+    return clusterGlobalLock;
+  }
+
+  @Override
   public String getName() {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      return desiredStateEntity.getComponentName();
+      readWriteLock.readLock().lock();
+      try {
+        return desiredStateEntity.getComponentName();
+      } finally {
+        readWriteLock.readLock().unlock();
+      }
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   public String getServiceName() {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      return service.getName();
+      readWriteLock.readLock().lock();
+      try {
+        return service.getName();
+      } finally {
+        readWriteLock.readLock().unlock();
+      }
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   public long getClusterId() {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      return this.service.getClusterId();
+      readWriteLock.readLock().lock();
+      try {
+        return this.service.getClusterId();
+      } finally {
+        readWriteLock.readLock().unlock();
+      }
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   public Map<String, ServiceComponentHost>
       getServiceComponentHosts() {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      return Collections.unmodifiableMap(hostComponents);
+      readWriteLock.readLock().lock();
+      try {
+        return Collections.unmodifiableMap(hostComponents);
+      } finally {
+        readWriteLock.readLock().unlock();
+      }
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   public void addServiceComponentHosts(
       Map<String, ServiceComponentHost> hostComponents) throws AmbariException {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.writeLock().lock();
     try {
-      // TODO validation
-      for (Entry<String, ServiceComponentHost> entry :
-          hostComponents.entrySet()) {
-        if (!entry.getKey().equals(entry.getValue().getHostName())) {
-          throw new AmbariException("Invalid arguments in map"
-              + ", hostname does not match the key in map");
+      readWriteLock.writeLock().lock();
+      try {
+        // TODO validation
+        for (Entry<String, ServiceComponentHost> entry :
+            hostComponents.entrySet()) {
+          if (!entry.getKey().equals(entry.getValue().getHostName())) {
+            throw new AmbariException("Invalid arguments in map"
+                + ", hostname does not match the key in map");
+          }
         }
-      }
-      for (ServiceComponentHost sch : hostComponents.values()) {
-        addServiceComponentHost(sch);
+        for (ServiceComponentHost sch : hostComponents.values()) {
+          addServiceComponentHost(sch);
+        }
+      } finally {
+        readWriteLock.writeLock().unlock();
       }
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.writeLock().unlock();
     }
 
+
   }
 
   @Override
   public void addServiceComponentHost(
       ServiceComponentHost hostComponent) throws AmbariException {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.writeLock().lock();
     try {
-      // TODO validation
-      // TODO ensure host belongs to cluster
-      if (LOG.isDebugEnabled()) {
-        LOG.debug("Adding a ServiceComponentHost to ServiceComponent"
-            + ", clusterName=" + service.getCluster().getClusterName()
-            + ", clusterId=" + service.getCluster().getClusterId()
-            + ", serviceName=" + service.getName()
-            + ", serviceComponentName=" + getName()
-            + ", hostname=" + hostComponent.getHostName());
-      }
-      if (hostComponents.containsKey(hostComponent.getHostName())) {
-        throw new AmbariException("Cannot add duplicate ServiceComponentHost"
-            + ", clusterName=" + service.getCluster().getClusterName()
-            + ", clusterId=" + service.getCluster().getClusterId()
-            + ", serviceName=" + service.getName()
-            + ", serviceComponentName=" + getName()
-            + ", hostname=" + hostComponent.getHostName());
+      readWriteLock.writeLock().lock();
+      try {
+        // TODO validation
+        // TODO ensure host belongs to cluster
+        if (LOG.isDebugEnabled()) {
+          LOG.debug("Adding a ServiceComponentHost to ServiceComponent"
+              + ", clusterName=" + service.getCluster().getClusterName()
+              + ", clusterId=" + service.getCluster().getClusterId()
+              + ", serviceName=" + service.getName()
+              + ", serviceComponentName=" + getName()
+              + ", hostname=" + hostComponent.getHostName());
+        }
+        if (hostComponents.containsKey(hostComponent.getHostName())) {
+          throw new AmbariException("Cannot add duplicate ServiceComponentHost"
+              + ", clusterName=" + service.getCluster().getClusterName()
+              + ", clusterId=" + service.getCluster().getClusterId()
+              + ", serviceName=" + service.getName()
+              + ", serviceComponentName=" + getName()
+              + ", hostname=" + hostComponent.getHostName());
+        }
+        // FIXME need a better approach of caching components by host
+        ClusterImpl clusterImpl = (ClusterImpl) service.getCluster();
+        clusterImpl.addServiceComponentHost(hostComponent);
+        this.hostComponents.put(hostComponent.getHostName(), hostComponent);
+      } finally {
+        readWriteLock.writeLock().unlock();
       }
-      // FIXME need a better approach of caching components by host
-      ClusterImpl clusterImpl = (ClusterImpl) service.getCluster();
-      clusterImpl.addServiceComponentHost(hostComponent);
-      this.hostComponents.put(hostComponent.getHostName(), hostComponent);
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.writeLock().unlock();
     }
 
+
   }
 
   @Override
   public ServiceComponentHost addServiceComponentHost(
       String hostName) throws AmbariException {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.writeLock().lock();
     try {
-      // TODO validation
-      // TODO ensure host belongs to cluster
-      if (LOG.isDebugEnabled()) {
-        LOG.debug("Adding a ServiceComponentHost to ServiceComponent"
-            + ", clusterName=" + service.getCluster().getClusterName()
-            + ", clusterId=" + service.getCluster().getClusterId()
-            + ", serviceName=" + service.getName()
-            + ", serviceComponentName=" + getName()
-            + ", hostname=" + hostName);
-      }
-      if (hostComponents.containsKey(hostName)) {
-        throw new AmbariException("Cannot add duplicate ServiceComponentHost"
-            + ", clusterName=" + service.getCluster().getClusterName()
-            + ", clusterId=" + service.getCluster().getClusterId()
-            + ", serviceName=" + service.getName()
-            + ", serviceComponentName=" + getName()
-            + ", hostname=" + hostName);
-      }
-      ServiceComponentHost hostComponent =
-          serviceComponentHostFactory.createNew(this, hostName, this.isClientComponent());
-      // FIXME need a better approach of caching components by host
-      ClusterImpl clusterImpl = (ClusterImpl) service.getCluster();
-      clusterImpl.addServiceComponentHost(hostComponent);
+      readWriteLock.writeLock().lock();
+      try {
+        // TODO validation
+        // TODO ensure host belongs to cluster
+        if (LOG.isDebugEnabled()) {
+          LOG.debug("Adding a ServiceComponentHost to ServiceComponent"
+              + ", clusterName=" + service.getCluster().getClusterName()
+              + ", clusterId=" + service.getCluster().getClusterId()
+              + ", serviceName=" + service.getName()
+              + ", serviceComponentName=" + getName()
+              + ", hostname=" + hostName);
+        }
+        if (hostComponents.containsKey(hostName)) {
+          throw new AmbariException("Cannot add duplicate ServiceComponentHost"
+              + ", clusterName=" + service.getCluster().getClusterName()
+              + ", clusterId=" + service.getCluster().getClusterId()
+              + ", serviceName=" + service.getName()
+              + ", serviceComponentName=" + getName()
+              + ", hostname=" + hostName);
+        }
+        ServiceComponentHost hostComponent =
+            serviceComponentHostFactory.createNew(this, hostName, this.isClientComponent());
+        // FIXME need a better approach of caching components by host
+        ClusterImpl clusterImpl = (ClusterImpl) service.getCluster();
+        clusterImpl.addServiceComponentHost(hostComponent);
 
-      this.hostComponents.put(hostComponent.getHostName(), hostComponent);
+        this.hostComponents.put(hostComponent.getHostName(), hostComponent);
 
-      return hostComponent;
+        return hostComponent;
+      } finally {
+        readWriteLock.writeLock().unlock();
+      }
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.writeLock().unlock();
     }
 
+
   }
 
   @Override
   public ServiceComponentHost getServiceComponentHost(String hostname)
     throws AmbariException {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      if (!hostComponents.containsKey(hostname)) {
-        throw new ServiceComponentHostNotFoundException(getClusterName(),
-            getServiceName(), getName(), hostname);
+      readWriteLock.readLock().lock();
+      try {
+        if (!hostComponents.containsKey(hostname)) {
+          throw new ServiceComponentHostNotFoundException(getClusterName(),
+              getServiceName(), getName(), hostname);
+        }
+        return this.hostComponents.get(hostname);
+      } finally {
+        readWriteLock.readLock().unlock();
       }
-      return this.hostComponents.get(hostname);
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   public State getDesiredState() {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      return desiredStateEntity.getDesiredState();
+      readWriteLock.readLock().lock();
+      try {
+        return desiredStateEntity.getDesiredState();
+      } finally {
+        readWriteLock.readLock().unlock();
+      }
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   public void setDesiredState(State state) {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.readLock().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);
+      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();
       }
-      desiredStateEntity.setDesiredState(state);
-      saveIfPersisted();
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   public Map<String, Config> getDesiredConfigs() {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      Map<String, Config> map = new HashMap<String, Config>();
-      for (Entry<String, String> entry : desiredConfigs.entrySet()) {
-        Config config = service.getCluster().getConfig(entry.getKey(), entry.getValue());
-        if (null != config) {
-          map.put(entry.getKey(), config);
+      readWriteLock.readLock().lock();
+      try {
+        Map<String, Config> map = new HashMap<String, Config>();
+        for (Entry<String, String> entry : desiredConfigs.entrySet()) {
+          Config config = service.getCluster().getConfig(entry.getKey(), entry.getValue());
+          if (null != config) {
+            map.put(entry.getKey(), config);
+          }
         }
-      }
 
-      Map<String, Config> svcConfigs = service.getDesiredConfigs();
-      for (Entry<String, Config> entry : svcConfigs.entrySet()) {
-        if (!map.containsKey(entry.getKey())) {
-          map.put(entry.getKey(), entry.getValue());
+        Map<String, Config> svcConfigs = service.getDesiredConfigs();
+        for (Entry<String, Config> entry : svcConfigs.entrySet()) {
+          if (!map.containsKey(entry.getKey())) {
+            map.put(entry.getKey(), entry.getValue());
+          }
         }
-      }
 
-      return Collections.unmodifiableMap(map);
+        return Collections.unmodifiableMap(map);
+      } finally {
+        readWriteLock.readLock().unlock();
+      }
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   public void updateDesiredConfigs(Map<String, Config> configs) {
 
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      for (Entry<String, Config> entry : configs.entrySet()) {
-        boolean contains = false;
-
-        for (ComponentConfigMappingEntity componentConfigMappingEntity : desiredStateEntity.getComponentConfigMappingEntities()) {
-          if (entry.getKey().equals(componentConfigMappingEntity.getConfigType())) {
-            contains = true;
-            componentConfigMappingEntity.setTimestamp(new Date().getTime());
-            componentConfigMappingEntity.setVersionTag(entry.getValue().getVersionTag());
-            if (persisted) {
-              componentConfigMappingDAO.merge(componentConfigMappingEntity);
+      readWriteLock.writeLock().lock();
+      try {
+        for (Entry<String, Config> entry : configs.entrySet()) {
+          boolean contains = false;
+
+          for (ComponentConfigMappingEntity componentConfigMappingEntity : desiredStateEntity.getComponentConfigMappingEntities()) {
+            if (entry.getKey().equals(componentConfigMappingEntity.getConfigType())) {
+              contains = true;
+              componentConfigMappingEntity.setTimestamp(new Date().getTime());
+              componentConfigMappingEntity.setVersionTag(entry.getValue().getVersionTag());
+              if (persisted) {
+                componentConfigMappingDAO.merge(componentConfigMappingEntity);
+              }
             }
           }
-        }
 
-        if (!contains) {
-          ComponentConfigMappingEntity newEntity = new ComponentConfigMappingEntity();
-          newEntity.setClusterId(desiredStateEntity.getClusterId());
-          newEntity.setServiceName(desiredStateEntity.getServiceName());
-          newEntity.setComponentName(desiredStateEntity.getComponentName());
-          newEntity.setConfigType(entry.getKey());
-          newEntity.setVersionTag(entry.getValue().getVersionTag());
-          newEntity.setTimestamp(new Date().getTime());
-          newEntity.setServiceComponentDesiredStateEntity(desiredStateEntity);
-          desiredStateEntity.getComponentConfigMappingEntities().add(newEntity);
+          if (!contains) {
+            ComponentConfigMappingEntity newEntity = new ComponentConfigMappingEntity();
+            newEntity.setClusterId(desiredStateEntity.getClusterId());
+            newEntity.setServiceName(desiredStateEntity.getServiceName());
+            newEntity.setComponentName(desiredStateEntity.getComponentName());
+            newEntity.setConfigType(entry.getKey());
+            newEntity.setVersionTag(entry.getValue().getVersionTag());
+            newEntity.setTimestamp(new Date().getTime());
+            newEntity.setServiceComponentDesiredStateEntity(desiredStateEntity);
+            desiredStateEntity.getComponentConfigMappingEntities().add(newEntity);
 
-        }
+          }
 
 
-        this.desiredConfigs.put(entry.getKey(), entry.getValue().getVersionTag());
-      }
+          this.desiredConfigs.put(entry.getKey(), entry.getValue().getVersionTag());
+        }
 
-      saveIfPersisted();
+        saveIfPersisted();
+      } finally {
+        readWriteLock.writeLock().unlock();
+      }
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   public StackId getDesiredStackVersion() {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      return gson.fromJson(desiredStateEntity.getDesiredStackVersion(), StackId.class);
+      readWriteLock.readLock().lock();
+      try {
+        return gson.fromJson(desiredStateEntity.getDesiredStackVersion(), StackId.class);
+      } finally {
+        readWriteLock.readLock().unlock();
+      }
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   public void setDesiredStackVersion(StackId stackVersion) {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.readLock().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);
+      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();
       }
-      desiredStateEntity.setDesiredStackVersion(gson.toJson(stackVersion));
-      saveIfPersisted();
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   public ServiceComponentResponse convertToResponse() {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      ServiceComponentResponse r = new ServiceComponentResponse(
-          getClusterId(), service.getCluster().getClusterName(),
-          service.getName(), getName(), this.desiredConfigs,
-          getDesiredStackVersion().getStackId(),
-          getDesiredState().toString());
-      return r;
+      readWriteLock.readLock().lock();
+      try {
+        ServiceComponentResponse r = new ServiceComponentResponse(
+            getClusterId(), service.getCluster().getClusterName(),
+            service.getName(), getName(), this.desiredConfigs,
+            getDesiredStackVersion().getStackId(),
+            getDesiredState().toString());
+        return r;
+      } finally {
+        readWriteLock.readLock().unlock();
+      }
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   public String getClusterName() {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      return service.getCluster().getClusterName();
+      readWriteLock.readLock().lock();
+      try {
+        return service.getCluster().getClusterName();
+      } finally {
+        readWriteLock.readLock().unlock();
+      }
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   public void debugDump(StringBuilder sb) {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.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(" ");
+      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(" ] }");
+      } finally {
+        readWriteLock.readLock().unlock();
       }
-      sb.append(" ] }");
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   public boolean isPersisted() {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      return persisted;
+      readWriteLock.readLock().lock();
+      try {
+        return persisted;
+      } finally {
+        readWriteLock.readLock().unlock();
+      }
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   public void persist() {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      if (!persisted) {
-        persistEntities();
-        refresh();
-        service.refresh();
-        persisted = true;
-      } else {
-        saveIfPersisted();
+      readWriteLock.writeLock().lock();
+      try {
+        if (!persisted) {
+          persistEntities();
+          refresh();
+          service.refresh();
+          persisted = true;
+        } else {
+          saveIfPersisted();
+        }
+      } finally {
+        readWriteLock.writeLock().unlock();
       }
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Transactional
@@ -543,34 +664,46 @@ public class ServiceComponentImpl implem
   @Override
   @Transactional
   public void refresh() {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.readLock().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);
+      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();
       }
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Transactional
   private void saveIfPersisted() {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      if (isPersisted()) {
-        serviceComponentDesiredStateDAO.merge(desiredStateEntity);
+      readWriteLock.writeLock().lock();
+      try {
+        if (isPersisted()) {
+          serviceComponentDesiredStateDAO.merge(desiredStateEntity);
+        }
+      } finally {
+        readWriteLock.writeLock().unlock();
       }
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
@@ -580,124 +713,154 @@ public class ServiceComponentImpl implem
 
   @Override
   public boolean canBeRemoved() {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      if (!getDesiredState().isRemovableState()) {
-        return false;
-      }
-
-      for (ServiceComponentHost sch : hostComponents.values()) {
-        if (!sch.canBeRemoved()) {
-          LOG.warn("Found non removable hostcomponent when trying to"
-              + " delete service component"
-              + ", clusterName=" + getClusterName()
-              + ", serviceName=" + getServiceName()
-              + ", componentName=" + getName()
-              + ", hostname=" + sch.getHostName());
+      readWriteLock.readLock().lock();
+      try {
+        if (!getDesiredState().isRemovableState()) {
           return false;
         }
+
+        for (ServiceComponentHost sch : hostComponents.values()) {
+          if (!sch.canBeRemoved()) {
+            LOG.warn("Found non removable hostcomponent when trying to"
+                + " delete service component"
+                + ", clusterName=" + getClusterName()
+                + ", serviceName=" + getServiceName()
+                + ", componentName=" + getName()
+                + ", hostname=" + sch.getHostName());
+            return false;
+          }
+        }
+        return true;
+      } finally {
+        readWriteLock.readLock().unlock();
       }
-      return true;
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   @Transactional
   public void deleteAllServiceComponentHosts()
       throws AmbariException {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.writeLock().lock();
     try {
-      LOG.info("Deleting all servicecomponenthosts for component"
-          + ", clusterName=" + getClusterName()
-          + ", serviceName=" + getServiceName()
-          + ", componentName=" + getName());
-      for (ServiceComponentHost sch : hostComponents.values()) {
-        if (!sch.canBeRemoved()) {
-          throw new AmbariException("Found non removable hostcomponent "
-              + " when trying to delete"
-              + " all hostcomponents from servicecomponent"
-              + ", clusterName=" + getClusterName()
-              + ", serviceName=" + getServiceName()
-              + ", componentName=" + getName()
-              + ", hostname=" + sch.getHostName());
+      readWriteLock.writeLock().lock();
+      try {
+        LOG.info("Deleting all servicecomponenthosts for component"
+            + ", clusterName=" + getClusterName()
+            + ", serviceName=" + getServiceName()
+            + ", componentName=" + getName());
+        for (ServiceComponentHost sch : hostComponents.values()) {
+          if (!sch.canBeRemoved()) {
+            throw new AmbariException("Found non removable hostcomponent "
+                + " when trying to delete"
+                + " all hostcomponents from servicecomponent"
+                + ", clusterName=" + getClusterName()
+                + ", serviceName=" + getServiceName()
+                + ", componentName=" + getName()
+                + ", hostname=" + sch.getHostName());
+          }
         }
-      }
 
-      for (ServiceComponentHost serviceComponentHost : hostComponents.values()) {
-        serviceComponentHost.delete();
-      }
+        for (ServiceComponentHost serviceComponentHost : hostComponents.values()) {
+          serviceComponentHost.delete();
+        }
 
-      hostComponents.clear();
+        hostComponents.clear();
+      } finally {
+        readWriteLock.writeLock().unlock();
+      }
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.writeLock().unlock();
     }
 
+
   }
 
   @Override
   public void deleteServiceComponentHosts(String hostname)
       throws AmbariException {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.writeLock().lock();
     try {
-      ServiceComponentHost sch = getServiceComponentHost(hostname);
-      LOG.info("Deleting servicecomponenthost for cluster"
-          + ", clusterName=" + getClusterName()
-          + ", serviceName=" + getServiceName()
-          + ", componentName=" + getName()
-          + ", hostname=" + sch.getHostName());
-      if (!sch.canBeRemoved()) {
-        throw new AmbariException("Could not delete hostcomponent from cluster"
+      readWriteLock.writeLock().lock();
+      try {
+        ServiceComponentHost sch = getServiceComponentHost(hostname);
+        LOG.info("Deleting servicecomponenthost for cluster"
             + ", clusterName=" + getClusterName()
             + ", serviceName=" + getServiceName()
             + ", componentName=" + getName()
             + ", hostname=" + sch.getHostName());
-      }
-      sch.delete();
-      hostComponents.remove(hostname);
+        if (!sch.canBeRemoved()) {
+          throw new AmbariException("Could not delete hostcomponent from cluster"
+              + ", clusterName=" + getClusterName()
+              + ", serviceName=" + getServiceName()
+              + ", componentName=" + getName()
+              + ", hostname=" + sch.getHostName());
+        }
+        sch.delete();
+        hostComponents.remove(hostname);
 
-      // FIXME need a better approach of caching components by host
-      ClusterImpl clusterImpl = (ClusterImpl) service.getCluster();
-      clusterImpl.removeServiceComponentHost(sch);
+        // FIXME need a better approach of caching components by host
+        ClusterImpl clusterImpl = (ClusterImpl) service.getCluster();
+        clusterImpl.removeServiceComponentHost(sch);
+      } finally {
+        readWriteLock.writeLock().unlock();
+      }
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.writeLock().unlock();
     }
 
+
   }
 
   @Override
   public void deleteDesiredConfigs(Set<String> configTypes) {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      componentConfigMappingDAO.removeByType(configTypes);
-      for (String configType : configTypes) {
-        desiredConfigs.remove(configType);
+      readWriteLock.writeLock().lock();
+      try {
+        componentConfigMappingDAO.removeByType(configTypes);
+        for (String configType : configTypes) {
+          desiredConfigs.remove(configType);
+        }
+      } finally {
+        readWriteLock.writeLock().unlock();
       }
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   @Transactional
   public void delete() throws AmbariException {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.writeLock().lock();
     try {
-      deleteAllServiceComponentHosts();
+      readWriteLock.writeLock().lock();
+      try {
+        deleteAllServiceComponentHosts();
+
+        if (persisted) {
+          removeEntities();
+          persisted = false;
+        }
 
-      if (persisted) {
-        removeEntities();
-        persisted = false;
+        desiredConfigs.clear();
+      } finally {
+        readWriteLock.writeLock().unlock();
       }
-
-      desiredConfigs.clear();
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.writeLock().unlock();
     }
 
+
   }
 
   @Transactional

Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java?rev=1489550&r1=1489549&r2=1489550&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java Tue Jun  4 18:33:30 2013
@@ -41,6 +41,7 @@ import com.google.inject.persist.Transac
 
 
 public class ServiceImpl implements Service {
+  private final ReadWriteLock clusterGlobalLock;
   private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
 
   private ClusterServiceEntity serviceEntity;
@@ -83,6 +84,7 @@ public class ServiceImpl implements Serv
   public ServiceImpl(@Assisted Cluster cluster, @Assisted String serviceName,
       Injector injector) throws AmbariException {
     injector.injectMembers(this);
+    clusterGlobalLock = cluster.getClusterGlobalLock();
     serviceEntity = new ClusterServiceEntity();
     serviceEntity.setServiceName(serviceName);
     serviceDesiredStateEntity = new ServiceDesiredStateEntity();
@@ -109,6 +111,7 @@ public class ServiceImpl implements Serv
   public ServiceImpl(@Assisted Cluster cluster, @Assisted ClusterServiceEntity
       serviceEntity, Injector injector) throws AmbariException {
     injector.injectMembers(this);
+    clusterGlobalLock = cluster.getClusterGlobalLock();
     this.serviceEntity = serviceEntity;
     this.cluster = cluster;
 
@@ -143,254 +146,335 @@ public class ServiceImpl implements Serv
   }
 
   @Override
+  public ReadWriteLock getClusterGlobalLock() {
+    return clusterGlobalLock;
+  }
+
+  @Override
   public String getName() {
-    return serviceEntity.getServiceName();
+    clusterGlobalLock.readLock().lock();
+    try {
+      readWriteLock.readLock().lock();
+      try {
+        return serviceEntity.getServiceName();
+      } finally {
+        readWriteLock.readLock().unlock();
+      }
+    } finally {
+      clusterGlobalLock.readLock().unlock();
+    }
   }
 
   @Override
   public long getClusterId() {
-    return cluster.getClusterId();
+    clusterGlobalLock.readLock().lock();
+    try {
+      readWriteLock.readLock().lock();
+      try {
+        return cluster.getClusterId();
+      } finally {
+        readWriteLock.readLock().unlock();
+      }
+    } finally {
+      clusterGlobalLock.readLock().unlock();
+    }
   }
 
   @Override
   public Map<String, ServiceComponent> getServiceComponents() {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      return Collections.unmodifiableMap(components);
+      readWriteLock.readLock().lock();
+      try {
+        return Collections.unmodifiableMap(components);
+      } finally {
+        readWriteLock.readLock().unlock();
+      }
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
-
   }
 
   @Override
   public void addServiceComponents(
       Map<String, ServiceComponent> components) throws AmbariException {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.writeLock().lock();
     try {
-      for (ServiceComponent sc : components.values()) {
-        addServiceComponent(sc);
+      readWriteLock.writeLock().lock();
+      try {
+        for (ServiceComponent sc : components.values()) {
+          addServiceComponent(sc);
+        }
+      } finally {
+        readWriteLock.writeLock().unlock();
       }
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.writeLock().unlock();
     }
-
   }
 
   @Override
   public void addServiceComponent(ServiceComponent component)
       throws AmbariException {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.writeLock().lock();
     try {
-      // TODO validation
-      if (LOG.isDebugEnabled()) {
-        LOG.debug("Adding a ServiceComponent to Service"
-            + ", clusterName=" + cluster.getClusterName()
-            + ", clusterId=" + cluster.getClusterId()
-            + ", serviceName=" + getName()
-            + ", serviceComponentName=" + component.getName());
-      }
-      if (components.containsKey(component.getName())) {
-        throw new AmbariException("Cannot add duplicate ServiceComponent"
-            + ", clusterName=" + cluster.getClusterName()
-            + ", clusterId=" + cluster.getClusterId()
-            + ", serviceName=" + getName()
-            + ", serviceComponentName=" + component.getName());
+      readWriteLock.writeLock().lock();
+      try {
+        // TODO validation
+        if (LOG.isDebugEnabled()) {
+          LOG.debug("Adding a ServiceComponent to Service"
+              + ", clusterName=" + cluster.getClusterName()
+              + ", clusterId=" + cluster.getClusterId()
+              + ", serviceName=" + getName()
+              + ", serviceComponentName=" + component.getName());
+        }
+        if (components.containsKey(component.getName())) {
+          throw new AmbariException("Cannot add duplicate ServiceComponent"
+              + ", clusterName=" + cluster.getClusterName()
+              + ", clusterId=" + cluster.getClusterId()
+              + ", serviceName=" + getName()
+              + ", serviceComponentName=" + component.getName());
+        }
+        this.components.put(component.getName(), component);
+      } finally {
+        readWriteLock.writeLock().unlock();
       }
-      this.components.put(component.getName(), component);
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.writeLock().unlock();
     }
-
   }
 
   @Override
   public ServiceComponent addServiceComponent(
       String serviceComponentName) throws AmbariException {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.writeLock().lock();
     try {
-      if (LOG.isDebugEnabled()) {
-        LOG.debug("Adding a ServiceComponent to Service"
-            + ", clusterName=" + cluster.getClusterName()
-            + ", clusterId=" + cluster.getClusterId()
-            + ", serviceName=" + getName()
-            + ", serviceComponentName=" + serviceComponentName);
-      }
-      if (components.containsKey(serviceComponentName)) {
-        throw new AmbariException("Cannot add duplicate ServiceComponent"
-            + ", clusterName=" + cluster.getClusterName()
-            + ", clusterId=" + cluster.getClusterId()
-            + ", serviceName=" + getName()
-            + ", serviceComponentName=" + serviceComponentName);
+      readWriteLock.writeLock().lock();
+      try {
+        if (LOG.isDebugEnabled()) {
+          LOG.debug("Adding a ServiceComponent to Service"
+              + ", clusterName=" + cluster.getClusterName()
+              + ", clusterId=" + cluster.getClusterId()
+              + ", serviceName=" + getName()
+              + ", serviceComponentName=" + serviceComponentName);
+        }
+        if (components.containsKey(serviceComponentName)) {
+          throw new AmbariException("Cannot add duplicate ServiceComponent"
+              + ", clusterName=" + cluster.getClusterName()
+              + ", clusterId=" + cluster.getClusterId()
+              + ", serviceName=" + getName()
+              + ", serviceComponentName=" + serviceComponentName);
+        }
+        ServiceComponent component = serviceComponentFactory.createNew(this, serviceComponentName);
+        this.components.put(component.getName(), component);
+        return component;
+      } finally {
+        readWriteLock.writeLock().unlock();
       }
-      ServiceComponent component = serviceComponentFactory.createNew(this, serviceComponentName);
-      this.components.put(component.getName(), component);
-      return component;
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.writeLock().unlock();
     }
 
+
   }
 
   @Override
   public ServiceComponent getServiceComponent(String componentName)
       throws AmbariException {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      if (!components.containsKey(componentName)) {
-        throw new ServiceComponentNotFoundException(cluster.getClusterName(),
-            getName(),
-            componentName);
+      readWriteLock.readLock().lock();
+      try {
+        if (!components.containsKey(componentName)) {
+          throw new ServiceComponentNotFoundException(cluster.getClusterName(),
+              getName(),
+              componentName);
+        }
+        return this.components.get(componentName);
+      } finally {
+        readWriteLock.readLock().unlock();
       }
-      return this.components.get(componentName);
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   public State getDesiredState() {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      return this.serviceDesiredStateEntity.getDesiredState();
+      readWriteLock.readLock().lock();
+      try {
+        return this.serviceDesiredStateEntity.getDesiredState();
+      } finally {
+        readWriteLock.readLock().unlock();
+      }
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   public void setDesiredState(State state) {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      if (LOG.isDebugEnabled()) {
-        LOG.debug("Setting DesiredState of Service"
-            + ", clusterName=" + cluster.getClusterName()
-            + ", clusterId=" + cluster.getClusterId()
-            + ", serviceName=" + getName()
-            + ", oldDesiredState=" + this.getDesiredState()
-            + ", newDesiredState=" + state);
+      readWriteLock.writeLock().lock();
+      try {
+        if (LOG.isDebugEnabled()) {
+          LOG.debug("Setting DesiredState of Service"
+              + ", clusterName=" + cluster.getClusterName()
+              + ", clusterId=" + cluster.getClusterId()
+              + ", serviceName=" + getName()
+              + ", oldDesiredState=" + this.getDesiredState()
+              + ", newDesiredState=" + state);
+        }
+        this.serviceDesiredStateEntity.setDesiredState(state);
+        saveIfPersisted();
+      } finally {
+        readWriteLock.writeLock().unlock();
       }
-      this.serviceDesiredStateEntity.setDesiredState(state);
-      saveIfPersisted();
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
-
   }
 
   @Override
   public Map<String, Config> getDesiredConfigs() {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      Map<String, Config> map = new HashMap<String, Config>();
-      for (Entry<String, String> entry : desiredConfigs.entrySet()) {
-        Config config = cluster.getConfig(entry.getKey(), entry.getValue());
-        if (null != config) {
-          map.put(entry.getKey(), config);
-        } else {
-          // FIXME this is an error - should throw a proper exception
-          throw new RuntimeException("Found an invalid config"
-              + ", clusterName=" + getCluster().getClusterName()
-              + ", serviceName=" + getName()
-              + ", configType=" + entry.getKey()
-              + ", configVersionTag=" + entry.getValue());
+      readWriteLock.readLock().lock();
+      try {
+        Map<String, Config> map = new HashMap<String, Config>();
+        for (Entry<String, String> entry : desiredConfigs.entrySet()) {
+          Config config = cluster.getConfig(entry.getKey(), entry.getValue());
+          if (null != config) {
+            map.put(entry.getKey(), config);
+          } else {
+            // FIXME this is an error - should throw a proper exception
+            throw new RuntimeException("Found an invalid config"
+                + ", clusterName=" + getCluster().getClusterName()
+                + ", serviceName=" + getName()
+                + ", configType=" + entry.getKey()
+                + ", configVersionTag=" + entry.getValue());
+          }
         }
+        return Collections.unmodifiableMap(map);
+      } finally {
+        readWriteLock.readLock().unlock();
       }
-      return Collections.unmodifiableMap(map);
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
-
   }
 
   @Override
   public void updateDesiredConfigs(Map<String, Config> configs) {
-
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      for (Entry<String, Config> entry : configs.entrySet()) {
-        boolean contains = false;
+      readWriteLock.writeLock().lock();
+      try {
+        for (Entry<String, Config> entry : configs.entrySet()) {
+          boolean contains = false;
+
+          for (ServiceConfigMappingEntity serviceConfigMappingEntity : serviceEntity.getServiceConfigMappings()) {
+            if (entry.getKey().equals(serviceConfigMappingEntity.getConfigType())) {
+              contains = true;
+              serviceConfigMappingEntity.setTimestamp(new Date().getTime());
+              serviceConfigMappingEntity.setVersionTag(entry.getValue().getVersionTag());
+            }
+          }
+
+          if (!contains) {
+            ServiceConfigMappingEntity newEntity = new ServiceConfigMappingEntity();
+            newEntity.setClusterId(serviceEntity.getClusterId());
+            newEntity.setServiceName(serviceEntity.getServiceName());
+            newEntity.setConfigType(entry.getKey());
+            newEntity.setVersionTag(entry.getValue().getVersionTag());
+            newEntity.setTimestamp(new Date().getTime());
+            newEntity.setServiceEntity(serviceEntity);
+            serviceEntity.getServiceConfigMappings().add(newEntity);
 
-        for (ServiceConfigMappingEntity serviceConfigMappingEntity : serviceEntity.getServiceConfigMappings()) {
-          if (entry.getKey().equals(serviceConfigMappingEntity.getConfigType())) {
-            contains = true;
-            serviceConfigMappingEntity.setTimestamp(new Date().getTime());
-            serviceConfigMappingEntity.setVersionTag(entry.getValue().getVersionTag());
           }
-        }
 
-        if (!contains) {
-          ServiceConfigMappingEntity newEntity = new ServiceConfigMappingEntity();
-          newEntity.setClusterId(serviceEntity.getClusterId());
-          newEntity.setServiceName(serviceEntity.getServiceName());
-          newEntity.setConfigType(entry.getKey());
-          newEntity.setVersionTag(entry.getValue().getVersionTag());
-          newEntity.setTimestamp(new Date().getTime());
-          newEntity.setServiceEntity(serviceEntity);
-          serviceEntity.getServiceConfigMappings().add(newEntity);
 
+          this.desiredConfigs.put(entry.getKey(), entry.getValue().getVersionTag());
         }
 
-
-        this.desiredConfigs.put(entry.getKey(), entry.getValue().getVersionTag());
+        saveIfPersisted();
+      } finally {
+        readWriteLock.writeLock().unlock();
       }
-
-      saveIfPersisted();
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
-
-
   }
 
   @Override
   public StackId getDesiredStackVersion() {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      return gson.fromJson(serviceDesiredStateEntity.getDesiredStackVersion(), StackId.class);
+      readWriteLock.readLock().lock();
+      try {
+        return gson.fromJson(serviceDesiredStateEntity.getDesiredStackVersion(), StackId.class);
+      } finally {
+        readWriteLock.readLock().unlock();
+      }
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   public void setDesiredStackVersion(StackId stackVersion) {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      if (LOG.isDebugEnabled()) {
-        LOG.debug("Setting DesiredStackVersion of Service"
-            + ", clusterName=" + cluster.getClusterName()
-            + ", clusterId=" + cluster.getClusterId()
-            + ", serviceName=" + getName()
-            + ", oldDesiredStackVersion=" + getDesiredStackVersion()
-            + ", newDesiredStackVersion=" + stackVersion);
+      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();
       }
-      serviceDesiredStateEntity.setDesiredStackVersion(gson.toJson(stackVersion));
-      saveIfPersisted();
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   public ServiceResponse convertToResponse() {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      ServiceResponse r = new ServiceResponse(cluster.getClusterId(),
-          cluster.getClusterName(),
-          getName(),
-          desiredConfigs,
-          getDesiredStackVersion().getStackId(),
-          getDesiredState().toString());
-      return r;
+      readWriteLock.readLock().lock();
+      try {
+        ServiceResponse r = new ServiceResponse(cluster.getClusterId(),
+            cluster.getClusterName(),
+            getName(),
+            desiredConfigs,
+            getDesiredStackVersion().getStackId(),
+            getDesiredState().toString());
+        return r;
+      } finally {
+        readWriteLock.readLock().unlock();
+      }
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
-
   }
 
   @Override
@@ -400,69 +484,83 @@ public class ServiceImpl implements Serv
 
   @Override
   public void debugDump(StringBuilder sb) {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      sb.append("Service={ serviceName=" + getName()
-          + ", clusterName=" + cluster.getClusterName()
-          + ", clusterId=" + cluster.getClusterId()
-          + ", desiredStackVersion=" + getDesiredStackVersion()
-          + ", desiredState=" + getDesiredState().toString()
-          + ", configs=[");
-      boolean first = true;
-      if (desiredConfigs != null) {
-        for (Entry<String, String> entry : desiredConfigs.entrySet()) {
+      readWriteLock.readLock().lock();
+      try {
+        sb.append("Service={ serviceName=" + getName()
+            + ", clusterName=" + cluster.getClusterName()
+            + ", clusterId=" + cluster.getClusterId()
+            + ", desiredStackVersion=" + getDesiredStackVersion()
+            + ", desiredState=" + getDesiredState().toString()
+            + ", configs=[");
+        boolean first = true;
+        if (desiredConfigs != null) {
+          for (Entry<String, String> entry : desiredConfigs.entrySet()) {
+            if (!first) {
+              sb.append(" , ");
+            }
+            first = false;
+            sb.append("{ Config type=" + entry.getKey()
+                + ", versionTag=" + entry.getValue() + "}");
+          }
+        }
+        sb.append("], components=[ ");
+
+        first = true;
+        for (ServiceComponent sc : components.values()) {
           if (!first) {
             sb.append(" , ");
           }
           first = false;
-          sb.append("{ Config type=" + entry.getKey()
-              + ", versionTag=" + entry.getValue() + "}");
-        }
-      }
-      sb.append("], components=[ ");
-
-      first = true;
-      for (ServiceComponent sc : components.values()) {
-        if (!first) {
-          sb.append(" , ");
+          sb.append("\n      ");
+          sc.debugDump(sb);
+          sb.append(" ");
         }
-        first = false;
-        sb.append("\n      ");
-        sc.debugDump(sb);
-        sb.append(" ");
+        sb.append(" ] }");
+      } finally {
+        readWriteLock.readLock().unlock();
       }
-      sb.append(" ] }");
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
-
   }
 
   @Override
   public boolean isPersisted() {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      return persisted;
+      readWriteLock.readLock().lock();
+      try {
+        return persisted;
+      } finally {
+        readWriteLock.readLock().unlock();
+      }
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
   }
 
   @Override
   public void persist() {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      if (!persisted) {
-        persistEntities();
-        refresh();
-        cluster.refresh();
-        persisted = true;
-      } else {
-        saveIfPersisted();
+      readWriteLock.writeLock().lock();
+      try {
+        if (!persisted) {
+          persistEntities();
+          refresh();
+          cluster.refresh();
+          persisted = true;
+        } else {
+          saveIfPersisted();
+        }
+      } finally {
+        readWriteLock.writeLock().unlock();
       }
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
   }
@@ -492,101 +590,123 @@ public class ServiceImpl implements Serv
   @Override
   @Transactional
   public void refresh() {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.readLock().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);
+      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();
       }
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   public boolean canBeRemoved() {
-    readWriteLock.readLock().lock();
+    clusterGlobalLock.readLock().lock();
     try {
-      if (!getDesiredState().isRemovableState()) {
-        return false;
-      }
-
-      for (ServiceComponent sc : components.values()) {
-        if (!sc.canBeRemoved()) {
-          LOG.warn("Found non removable component when trying to delete service"
-              + ", clusterName=" + cluster.getClusterName()
-              + ", serviceName=" + getName()
-              + ", componentName=" + sc.getName());
+      readWriteLock.readLock().lock();
+      try {
+        if (!getDesiredState().isRemovableState()) {
           return false;
         }
+
+        for (ServiceComponent sc : components.values()) {
+          if (!sc.canBeRemoved()) {
+            LOG.warn("Found non removable component when trying to delete service"
+                + ", clusterName=" + cluster.getClusterName()
+                + ", serviceName=" + getName()
+                + ", componentName=" + sc.getName());
+            return false;
+          }
+        }
+        return true;
+      } finally {
+        readWriteLock.readLock().unlock();
       }
-      return true;
     } finally {
-      readWriteLock.readLock().unlock();
+      clusterGlobalLock.readLock().unlock();
     }
 
+
   }
 
   @Override
   @Transactional
   public void deleteAllComponents() throws AmbariException {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.writeLock().lock();
     try {
-      LOG.info("Deleting all components for service"
-          + ", clusterName=" + cluster.getClusterName()
-          + ", serviceName=" + getName());
-      // FIXME check dependencies from meta layer
-      for (ServiceComponent component : components.values()) {
-        if (!component.canBeRemoved()) {
-          throw new AmbariException("Found non removable component when trying to"
-              + " delete all components from service"
-              + ", clusterName=" + cluster.getClusterName()
-              + ", serviceName=" + getName()
-              + ", componentName=" + component.getName());
+      readWriteLock.writeLock().lock();
+      try {
+        LOG.info("Deleting all components for service"
+            + ", clusterName=" + cluster.getClusterName()
+            + ", serviceName=" + getName());
+        // FIXME check dependencies from meta layer
+        for (ServiceComponent component : components.values()) {
+          if (!component.canBeRemoved()) {
+            throw new AmbariException("Found non removable component when trying to"
+                + " delete all components from service"
+                + ", clusterName=" + cluster.getClusterName()
+                + ", serviceName=" + getName()
+                + ", componentName=" + component.getName());
+          }
         }
-      }
 
-      for (ServiceComponent serviceComponent : components.values()) {
-        serviceComponent.delete();
-      }
+        for (ServiceComponent serviceComponent : components.values()) {
+          serviceComponent.delete();
+        }
 
-      components.clear();
+        components.clear();
+      } finally {
+        readWriteLock.writeLock().unlock();
+      }
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.writeLock().unlock();
     }
-
   }
 
   @Override
   public void deleteServiceComponent(String componentName)
       throws AmbariException {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.writeLock().lock();
     try {
-      ServiceComponent component = getServiceComponent(componentName);
-      LOG.info("Deleting servicecomponent for cluster"
-          + ", clusterName=" + cluster.getClusterName()
-          + ", serviceName=" + getName()
-          + ", componentName=" + componentName);
-      // FIXME check dependencies from meta layer
-      if (!component.canBeRemoved()) {
-        throw new AmbariException("Could not delete component from cluster"
+      readWriteLock.writeLock().lock();
+      try {
+        ServiceComponent component = getServiceComponent(componentName);
+        LOG.info("Deleting servicecomponent for cluster"
             + ", clusterName=" + cluster.getClusterName()
             + ", serviceName=" + getName()
             + ", componentName=" + componentName);
-      }
+        // FIXME check dependencies from meta layer
+        if (!component.canBeRemoved()) {
+          throw new AmbariException("Could not delete component from cluster"
+              + ", clusterName=" + cluster.getClusterName()
+              + ", serviceName=" + getName()
+              + ", componentName=" + componentName);
+        }
 
-      component.delete();
-      components.remove(componentName);
+        component.delete();
+        components.remove(componentName);
+      } finally {
+        readWriteLock.writeLock().unlock();
+      }
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.writeLock().unlock();
     }
 
+
   }
 
   @Override
@@ -597,20 +717,26 @@ public class ServiceImpl implements Serv
   @Override
   @Transactional
   public void delete() throws AmbariException {
-    readWriteLock.writeLock().lock();
+    clusterGlobalLock.writeLock().lock();
     try {
-      deleteAllComponents();
+      readWriteLock.writeLock().lock();
+      try {
+        deleteAllComponents();
+
+        if (persisted) {
+          removeEntities();
+          persisted = false;
+        }
 
-      if (persisted) {
-        removeEntities();
-        persisted = false;
+        desiredConfigs.clear();
+      } finally {
+        readWriteLock.writeLock().unlock();
       }
-
-      desiredConfigs.clear();
     } finally {
-      readWriteLock.writeLock().unlock();
+      clusterGlobalLock.writeLock().unlock();
     }
 
+
   }
 
   @Transactional