Repository: ambari Updated Branches: refs/heads/branch-2.1 5fb13c9ad -> 64bc2473b
AMBARI-11784. Perf Cluster: Save configurations of Config Group takes 40s. (mpapirkovskyy) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/64bc2473 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/64bc2473 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/64bc2473 Branch: refs/heads/branch-2.1 Commit: 64bc2473bf38a1e4e0a3dfd1b97ec1f91d5e285d Parents: 5fb13c9 Author: Myroslav Papirkovskyy <mpapyrkovs...@hortonworks.com> Authored: Tue Jun 2 23:23:00 2015 +0300 Committer: Myroslav Papirkovskyy <mpapyrkovs...@hortonworks.com> Committed: Wed Jun 3 00:17:26 2015 +0300 ---------------------------------------------------------------------- .../internal/ConfigGroupResourceProvider.java | 4 +- .../orm/dao/ConfigGroupHostMappingDAO.java | 53 ++++++++++++-------- .../state/configgroup/ConfigGroupImpl.java | 10 ++-- .../ConfigGroupResourceProviderTest.java | 12 +++-- 4 files changed, 47 insertions(+), 32 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/64bc2473/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java index 2bbb9e7..30bcc86 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java @@ -582,8 +582,8 @@ public class ConfigGroupResourceProvider extends if (request.getHosts() != null && !request.getHosts().isEmpty()) { for (String hostname : request.getHosts()) { Host host = clusters.getHost(hostname); - HostEntity hostEntity = hostDAO.findByName(hostname); - if (host == null || hostEntity == null) { + HostEntity hostEntity = hostDAO.findById(host.getHostId()); + if (hostEntity == null) { throw new HostNotFoundException(hostname); } hosts.put(hostEntity.getHostId(), host); http://git-wip-us.apache.org/repos/asf/ambari/blob/64bc2473/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ConfigGroupHostMappingDAO.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ConfigGroupHostMappingDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ConfigGroupHostMappingDAO.java index 4628a4c..71d93cc 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ConfigGroupHostMappingDAO.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ConfigGroupHostMappingDAO.java @@ -22,6 +22,7 @@ import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.inject.persist.Transactional; +import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.orm.RequiresSession; import org.apache.ambari.server.orm.cache.ConfigGroupHostMapping; import org.apache.ambari.server.orm.cache.ConfigGroupHostMappingImpl; @@ -30,6 +31,7 @@ import org.apache.ambari.server.orm.entities.ConfigGroupHostMappingEntity; import org.apache.ambari.server.orm.entities.ConfigGroupHostMappingEntityPK; import org.apache.ambari.server.orm.entities.HostEntity; import org.apache.ambari.server.state.Cluster; +import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.Host; import org.apache.ambari.server.state.cluster.ClusterFactory; import org.apache.ambari.server.state.configgroup.ConfigGroup; @@ -45,7 +47,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.WeakHashMap; +import java.util.HashMap; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -61,6 +63,8 @@ public class ConfigGroupHostMappingDAO { private ClusterFactory clusterFactory; @Inject private HostFactory hostFactory; + @Inject + Clusters clusters; private final ReadWriteLock gl = new ReentrantReadWriteLock(); @@ -74,33 +78,35 @@ public class ConfigGroupHostMappingDAO { if (!cacheLoaded) { gl.writeLock().lock(); try { - if (configGroupHostMappingByHost == null) { - configGroupHostMappingByHost = new WeakHashMap<Long, Set<ConfigGroupHostMapping>>(); - - TypedQuery<ConfigGroupHostMappingEntity> query = entityManagerProvider.get().createQuery( - "SELECT entity FROM ConfigGroupHostMappingEntity entity", - ConfigGroupHostMappingEntity.class); + if (!cacheLoaded) { + if (configGroupHostMappingByHost == null) { + configGroupHostMappingByHost = new HashMap<Long, Set<ConfigGroupHostMapping>>(); + + TypedQuery<ConfigGroupHostMappingEntity> query = entityManagerProvider.get().createQuery( + "SELECT entity FROM ConfigGroupHostMappingEntity entity", + ConfigGroupHostMappingEntity.class); + + List<ConfigGroupHostMappingEntity> configGroupHostMappingEntities = daoUtils.selectList(query); - List<ConfigGroupHostMappingEntity> configGroupHostMappingEntities = daoUtils.selectList(query); - - for (ConfigGroupHostMappingEntity configGroupHostMappingEntity : configGroupHostMappingEntities) { + for (ConfigGroupHostMappingEntity configGroupHostMappingEntity : configGroupHostMappingEntities) { - Set<ConfigGroupHostMapping> setByHost = configGroupHostMappingByHost.get((configGroupHostMappingEntity.getHostId())); - - if (setByHost == null) { - setByHost = new HashSet<ConfigGroupHostMapping>(); - configGroupHostMappingByHost.put(configGroupHostMappingEntity.getHostId(), setByHost); + Set<ConfigGroupHostMapping> setByHost = configGroupHostMappingByHost.get((configGroupHostMappingEntity.getHostId())); + + if (setByHost == null) { + setByHost = new HashSet<ConfigGroupHostMapping>(); + configGroupHostMappingByHost.put(configGroupHostMappingEntity.getHostId(), setByHost); + } + + ConfigGroupHostMapping configGroupHostMapping = buildConfigGroupHostMapping(configGroupHostMappingEntity); + setByHost.add(configGroupHostMapping); } - - ConfigGroupHostMapping configGroupHostMapping = buildConfigGroupHostMapping(configGroupHostMappingEntity); - setByHost.add(configGroupHostMapping); - } + } + cacheLoaded = true; } } finally { gl.writeLock().unlock(); } - cacheLoaded = true; } @@ -308,7 +314,12 @@ public class ConfigGroupHostMappingDAO { } private ConfigGroup buildConfigGroup(ConfigGroupEntity configGroupEntity) { - Cluster cluster = clusterFactory.create(configGroupEntity.getClusterEntity()); + Cluster cluster = null; + try { + cluster = clusters.getClusterById(configGroupEntity.getClusterId()); + } catch (AmbariException e) { + //almost impossible + } ConfigGroup configGroup = configGroupFactory.createExisting(cluster, configGroupEntity); return configGroup; http://git-wip-us.apache.org/repos/asf/ambari/blob/64bc2473/ambari-server/src/main/java/org/apache/ambari/server/state/configgroup/ConfigGroupImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/configgroup/ConfigGroupImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/configgroup/ConfigGroupImpl.java index 6bab661..d322735 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/configgroup/ConfigGroupImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/configgroup/ConfigGroupImpl.java @@ -343,7 +343,7 @@ public class ConfigGroupImpl implements ConfigGroup { * @throws Exception */ @Transactional - private void persistEntities() { + void persistEntities() { ClusterEntity clusterEntity = clusterDAO.findById(cluster.getClusterId()); configGroupEntity.setClusterEntity(clusterEntity); configGroupEntity.setTimestamp(System.currentTimeMillis()); @@ -361,7 +361,7 @@ public class ConfigGroupImpl implements ConfigGroup { * @throws Exception */ @Transactional - private void persistHostMapping() { + void persistHostMapping() { if (isPersisted) { // Delete existing mappings and create new ones configGroupHostMappingDAO.removeAllByGroup(configGroupEntity.getGroupId()); @@ -370,7 +370,7 @@ public class ConfigGroupImpl implements ConfigGroup { if (hosts != null && !hosts.isEmpty()) { for (Host host : hosts.values()) { - HostEntity hostEntity = hostDAO.findByName(host.getHostName()); + HostEntity hostEntity = hostDAO.findById(host.getHostId()); if (hostEntity != null) { ConfigGroupHostMappingEntity hostMappingEntity = new ConfigGroupHostMappingEntity(); @@ -398,7 +398,7 @@ public class ConfigGroupImpl implements ConfigGroup { * @throws Exception */ @Transactional - private void persistConfigMapping(ClusterEntity clusterEntity) { + void persistConfigMapping(ClusterEntity clusterEntity) { if (isPersisted) { configGroupConfigMappingDAO.removeAllByGroup(configGroupEntity.getGroupId()); configGroupEntity.getConfigGroupConfigMappingEntities().clear(); @@ -451,7 +451,7 @@ public class ConfigGroupImpl implements ConfigGroup { } @Transactional - private void saveIfPersisted() { + void saveIfPersisted() { ClusterEntity clusterEntity = clusterDAO.findById(cluster.getClusterId()); if (isPersisted) { http://git-wip-us.apache.org/repos/asf/ambari/blob/64bc2473/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProviderTest.java index 5e0debf..753daec 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProviderTest.java @@ -275,10 +275,14 @@ public class ConfigGroupResourceProviderTest { expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes(); expect(clusters.getHost("h1")).andReturn(h1); expect(clusters.getHost("h2")).andReturn(h2); - expect(hostDAO.findByName("h1")).andReturn(hostEntity1).atLeastOnce(); - expect(hostDAO.findByName("h2")).andReturn(hostEntity2).atLeastOnce(); + expect(hostDAO.findByName("h1")).andReturn(hostEntity1).anyTimes(); + expect(hostDAO.findById(1L)).andReturn(hostEntity1).anyTimes(); + expect(hostDAO.findByName("h2")).andReturn(hostEntity2).anyTimes(); + expect(hostDAO.findById(2L)).andReturn(hostEntity2).anyTimes(); expect(hostEntity1.getHostId()).andReturn(1L).atLeastOnce(); expect(hostEntity2.getHostId()).andReturn(2L).atLeastOnce(); + expect(h1.getHostId()).andReturn(1L).anyTimes(); + expect(h2.getHostId()).andReturn(2L).anyTimes(); expect(configGroup.getName()).andReturn("test-1").anyTimes(); expect(configGroup.getId()).andReturn(25L).anyTimes(); @@ -301,7 +305,7 @@ public class ConfigGroupResourceProviderTest { expectLastCall().once(); replay(managementController, clusters, cluster, - configGroup, response, configGroupResponse, configHelper, hostDAO, hostEntity1, hostEntity2); + configGroup, response, configGroupResponse, configHelper, hostDAO, hostEntity1, hostEntity2, h1, h2); ResourceProvider provider = getConfigGroupResourceProvider (managementController); @@ -350,7 +354,7 @@ public class ConfigGroupResourceProviderTest { provider.updateResources(request, predicate); verify(managementController, clusters, cluster, - configGroup, response, configGroupResponse, configHelper, hostDAO, hostEntity1, hostEntity2); + configGroup, response, configGroupResponse, configHelper, hostDAO, hostEntity1, hostEntity2, h1, h2); } @SuppressWarnings("unchecked")