|
@@ -44,9 +44,9 @@ public class ServiceComponentImpl implements ServiceComponent {
|
|
|
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 implements ServiceComponent {
|
|
|
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 implements ServiceComponent {
|
|
|
@Assisted ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntity,
|
|
|
Injector injector) throws AmbariException {
|
|
|
injector.injectMembers(this);
|
|
|
+ this.clusterGlobalLock = service.getClusterGlobalLock();
|
|
|
this.service = service;
|
|
|
this.desiredStateEntity = serviceComponentDesiredStateEntity;
|
|
|
|
|
@@ -157,375 +159,494 @@ public class ServiceComponentImpl implements ServiceComponent {
|
|
|
persisted = true;
|
|
|
}
|
|
|
|
|
|
+ @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;
|
|
|
+ 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("\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 implements ServiceComponent {
|
|
|
@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 implements ServiceComponent {
|
|
|
|
|
|
@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());
|
|
|
+ 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);
|
|
|
+ } finally {
|
|
|
+ readWriteLock.writeLock().unlock();
|
|
|
}
|
|
|
- sch.delete();
|
|
|
- hostComponents.remove(hostname);
|
|
|
-
|
|
|
- // FIXME need a better approach of caching components by host
|
|
|
- ClusterImpl clusterImpl = (ClusterImpl) service.getCluster();
|
|
|
- clusterImpl.removeServiceComponentHost(sch);
|
|
|
} 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();
|
|
|
+ desiredConfigs.clear();
|
|
|
+ } finally {
|
|
|
+ readWriteLock.writeLock().unlock();
|
|
|
+ }
|
|
|
} finally {
|
|
|
- readWriteLock.writeLock().unlock();
|
|
|
+ clusterGlobalLock.writeLock().unlock();
|
|
|
}
|
|
|
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Transactional
|