You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jo...@apache.org on 2016/06/06 16:36:16 UTC

ambari git commit: AMBARI-17036 - Getting JMX Protocol Values On Large Cluster Takes Too Long (jonathanhurley)

Repository: ambari
Updated Branches:
  refs/heads/trunk b0bc550c1 -> 7593acfda


AMBARI-17036 - Getting JMX Protocol Values On Large Cluster Takes Too Long (jonathanhurley)


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

Branch: refs/heads/trunk
Commit: 7593acfdacf9ace292b1adb607eebbb15080469f
Parents: b0bc550
Author: Jonathan Hurley <jh...@hortonworks.com>
Authored: Fri Jun 3 16:05:15 2016 -0400
Committer: Jonathan Hurley <jh...@hortonworks.com>
Committed: Mon Jun 6 11:52:53 2016 -0400

----------------------------------------------------------------------
 .../controller/AmbariManagementController.java  | 10 ++
 .../AmbariManagementControllerImpl.java         | 11 +++
 .../internal/AbstractProviderModule.java        | 98 ++++++++++++--------
 .../controller/jmx/JMXPropertyProvider.java     |  5 +-
 .../events/ClusterConfigChangedEvent.java       |  2 +-
 .../ambari/server/state/ConfigHelper.java       | 33 ++-----
 .../apache/ambari/server/state/ConfigImpl.java  |  9 +-
 .../internal/JMXHostProviderTest.java           | 39 ++++----
 8 files changed, 115 insertions(+), 92 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/7593acfd/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
index 9f221d5..b488af3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
@@ -31,6 +31,8 @@ import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.controller.internal.RequestStageContainer;
 import org.apache.ambari.server.controller.metrics.MetricPropertyProviderFactory;
 import org.apache.ambari.server.controller.metrics.timeline.cache.TimelineMetricCacheProvider;
+import org.apache.ambari.server.events.AmbariEvent;
+import org.apache.ambari.server.events.publishers.AmbariEventPublisher;
 import org.apache.ambari.server.metadata.RoleCommandOrder;
 import org.apache.ambari.server.scheduler.ExecutionScheduleManager;
 import org.apache.ambari.server.security.authorization.AuthorizationException;
@@ -825,5 +827,13 @@ public interface AmbariManagementController {
    */
   CredentialStoreService getCredentialStoreService();
 
+  /**
+   * Gets an {@link AmbariEventPublisher} which can be used to send and receive
+   * {@link AmbariEvent}s.
+   *
+   * @return
+   */
+  AmbariEventPublisher getAmbariEventPublisher();
+
 }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/7593acfd/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index fe9204d..ba93d25 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@ -97,6 +97,7 @@ import org.apache.ambari.server.controller.metrics.MetricPropertyProviderFactory
 import org.apache.ambari.server.controller.metrics.timeline.cache.TimelineMetricCacheProvider;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.customactions.ActionDefinition;
+import org.apache.ambari.server.events.publishers.AmbariEventPublisher;
 import org.apache.ambari.server.metadata.ActionMetadata;
 import org.apache.ambari.server.metadata.RoleCommandOrder;
 import org.apache.ambari.server.orm.dao.ClusterDAO;
@@ -265,6 +266,8 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
   private CredentialStoreService credentialStoreService;
   @Inject
   private ClusterVersionDAO clusterVersionDAO;
+  @Inject
+  private AmbariEventPublisher ambariEventPublisher;
 
   private MaintenanceStateHelper maintenanceStateHelper;
 
@@ -4729,6 +4732,14 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
     return injector.getInstance(MetricPropertyProviderFactory.class);
   }
 
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public AmbariEventPublisher getAmbariEventPublisher() {
+    return injector.getInstance(AmbariEventPublisher.class);
+  }
+
   @Override
   public KerberosHelper getKerberosHelper() {
     return kerberosHelper;

http://git-wip-us.apache.org/repos/asf/ambari/blob/7593acfd/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
index 591441b..5ac66d8 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
@@ -63,7 +63,11 @@ import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PredicateBuilder;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.controller.utilities.StreamProvider;
+import org.apache.ambari.server.events.ClusterConfigChangedEvent;
+import org.apache.ambari.server.events.publishers.AmbariEventPublisher;
 import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.ConfigHelper;
 import org.apache.ambari.server.state.DesiredConfig;
 import org.apache.ambari.server.state.HostState;
 import org.apache.ambari.server.state.Service;
@@ -72,6 +76,7 @@ import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.eventbus.Subscribe;
 import com.google.inject.Inject;
 
 /**
@@ -107,7 +112,7 @@ public abstract class AbstractProviderModule implements ProviderModule,
   private static final Map<String, Map<String, String[]>> jmxDesiredRpcSuffixProperties = new ConcurrentHashMap<>();
   private volatile Map<String, Map<String, Map<String, String>>> jmxDesiredRpcSuffixes = new HashMap<String, Map<String, Map<String,String>>>();
   private volatile Map<String, String> clusterHdfsSiteConfigVersionMap = new HashMap<String, String>();
-  private volatile Map<String, String> clusterJmxProtocolMap = new HashMap<String, String>();
+  private volatile Map<String, String> clusterJmxProtocolMap = new ConcurrentHashMap<>();
   private volatile Set<String> metricServerHosts = new HashSet<String>();
   private volatile String clusterMetricServerPort = null;
   private volatile String clusterMetricServerVipPort = null;
@@ -225,6 +230,14 @@ public abstract class AbstractProviderModule implements ProviderModule,
   private MetricPropertyProviderFactory metricPropertyProviderFactory;
 
   /**
+   * Used to respond to the following events:
+   * <ul>
+   * <li>{@link ClusterConfigChangedEvent}
+   */
+  @Inject
+  protected AmbariEventPublisher eventPublisher;
+
+  /**
    * The map of host components.
    */
   private Map<String, Map<String, String>> clusterHostComponentMap;
@@ -268,6 +281,11 @@ public abstract class AbstractProviderModule implements ProviderModule,
     if (metricPropertyProviderFactory == null && managementController != null) {
       metricPropertyProviderFactory = managementController.getMetricPropertyProviderFactory();
     }
+
+    if (null == eventPublisher && null != managementController) {
+      eventPublisher = managementController.getAmbariEventPublisher();
+      eventPublisher.register(this);
+    }
   }
 
 
@@ -964,48 +982,36 @@ public abstract class AbstractProviderModule implements ProviderModule,
       value.substring(value.lastIndexOf(":") + 1, value.length()) : value;
   }
 
+  /**
+   * Gets the desired configuration version tag for the given cluster and config
+   * type.
+   *
+   * @param clusterName
+   *          the cluster name
+   * @param configType
+   *          the configuration type (for example {@value hdfs-site}).
+   * @return
+   */
   private String getDesiredConfigVersion(String clusterName,
-                                         String configType) throws
-      NoSuchParentResourceException, UnsupportedPropertyException,
-      SystemException {
+      String configType) {
 
-    // Get config version tag
-    ResourceProvider clusterResourceProvider = getResourceProvider(Resource.Type.Cluster);
-    Predicate basePredicate = new PredicateBuilder()
-      .property(ClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID).equals(clusterName)
-      .toPredicate();
+    String versionTag = ConfigHelper.FIRST_VERSION_TAG;
 
-    Set<Resource> clusterResource = null;
     try {
+      Clusters clusters = managementController.getClusters();
+      Cluster cluster = clusters.getCluster(clusterName);
+      Map<String, DesiredConfig> desiredConfigs = cluster.getDesiredConfigs();
 
-      Set<String> propertyIds = new HashSet<String>();
-      propertyIds.add(ClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID);
-      propertyIds.add(ClusterResourceProvider.CLUSTER_DESIRED_CONFIGS_PROPERTY_ID);
-
-      Map<String, String> requestInfoProperties = new HashMap<String, String>();
-      requestInfoProperties.put(ClusterResourceProvider.GET_IGNORE_PERMISSIONS_PROPERTY_ID, "true");
-
-      Request readRequest = PropertyHelper.getReadRequest(propertyIds,
-          requestInfoProperties, null, null, null);
-
-      clusterResource = clusterResourceProvider.getResources(readRequest, basePredicate);
-    } catch (NoSuchResourceException e) {
-      LOG.error("Resource for the desired config not found. " + e);
-    }
-
-    String versionTag = "version1";
-    if (clusterResource != null) {
-      for (Resource resource : clusterResource) {
-        Map<String, Object> configs =
-            resource.getPropertiesMap().get(ClusterResourceProvider.CLUSTER_DESIRED_CONFIGS_PROPERTY_ID);
-        if (configs != null) {
-          DesiredConfig config = (DesiredConfig) configs.get(configType);
-          if (config != null) {
-            versionTag = config.getTag();
-          }
-        }
+      DesiredConfig config = desiredConfigs.get(configType);
+      if (config != null) {
+        versionTag = config.getTag();
       }
+    } catch (AmbariException ambariException) {
+      LOG.error(
+          "Unable to lookup the desired configuration tag for {} on cluster {}, defaulting to {}",
+          configType, clusterName, versionTag, ambariException);
     }
+
     return versionTag;
   }
 
@@ -1182,7 +1188,11 @@ public abstract class AbstractProviderModule implements ProviderModule,
 
   @Override
   public String getJMXProtocol(String clusterName, String componentName) {
-    String jmxProtocolString = clusterJmxProtocolMap.get(clusterName);
+    String mapKey = String.format("%s-%s", clusterName, componentName);
+    String jmxProtocolString = clusterJmxProtocolMap.get(mapKey);
+    if (null != jmxProtocolString) {
+      return jmxProtocolString;
+    }
 
     try {
       if (componentName.equals("NAMENODE") || componentName.equals("DATANODE") || componentName.equals("RESOURCEMANAGER") || componentName.equals("NODEMANAGER") || componentName.equals("JOURNALNODE") || componentName.equals("HISTORYSERVER")) {
@@ -1196,7 +1206,6 @@ public abstract class AbstractProviderModule implements ProviderModule,
               newSiteConfigVersion, config,
               jmxDesiredProperties.get(componentName));
           jmxProtocolString = getJMXProtocolString(protocolMap.get(componentName));
-          clusterJmxProtocolMap.put(clusterName, jmxProtocolString);
         }
       } else {
         jmxProtocolString = "http";
@@ -1220,6 +1229,7 @@ public abstract class AbstractProviderModule implements ProviderModule,
       LOG.debug("JMXProtocol = " + jmxProtocolString + ", for clusterName=" + clusterName +
           ", componentName = " + componentName);
     }
+    clusterJmxProtocolMap.put(mapKey, jmxProtocolString);
     return jmxProtocolString;
   }
 
@@ -1289,4 +1299,16 @@ public abstract class AbstractProviderModule implements ProviderModule,
     }
   }
 
+  /**
+   * Handles {@link ClusterConfigChangedEvent} which means that some caches
+   * should invalidate.
+   *
+   * @param event
+   *          the change event.
+   */
+  @Subscribe
+  public void onConfigurationChangedEvent(ClusterConfigChangedEvent event) {
+    clusterJmxProtocolMap.clear();
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/7593acfd/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXPropertyProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXPropertyProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXPropertyProvider.java
index e1a5e22..a315e5c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXPropertyProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXPropertyProvider.java
@@ -218,7 +218,7 @@ public class JMXPropertyProvider extends ThreadPoolEnabledPropertyProvider {
 
     String clusterName = (String) resource.getPropertyValue(clusterNamePropertyId);
 
-    String protocol = getJMXProtocol(clusterName, componentName);
+    String protocol = jmxHostProvider.getJMXProtocol(clusterName, componentName);
 
     boolean httpsEnabled = false;
 
@@ -398,9 +398,6 @@ public class JMXPropertyProvider extends ThreadPoolEnabledPropertyProvider {
     return port;
   }
 
-  private String getJMXProtocol(String clusterName, String componentName) {
-    return jmxHostProvider.getJMXProtocol(clusterName, componentName);
-  }
 
   private Set<String> getHosts(Resource resource, String clusterName, String componentName) {
     return hostNamePropertyId == null ?

http://git-wip-us.apache.org/repos/asf/ambari/blob/7593acfd/ambari-server/src/main/java/org/apache/ambari/server/events/ClusterConfigChangedEvent.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/ClusterConfigChangedEvent.java b/ambari-server/src/main/java/org/apache/ambari/server/events/ClusterConfigChangedEvent.java
index dd37ff9..3ca4900 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/ClusterConfigChangedEvent.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/ClusterConfigChangedEvent.java
@@ -77,7 +77,7 @@ public class ClusterConfigChangedEvent extends AmbariEvent {
    */
   @Override
   public String toString() {
-    StringBuilder buffer = new StringBuilder("ClusterEnvConfigChangedEvent{");
+    StringBuilder buffer = new StringBuilder("ClusterConfigChangedEvent{");
     buffer.append("clusterName=").append(getClusterName());
     buffer.append(", configType=").append(getConfigType());
     buffer.append(", versionTag=").append(getVersionTag());

http://git-wip-us.apache.org/repos/asf/ambari/blob/7593acfd/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
index a3a2bda..1bd0ba9 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
@@ -38,32 +38,12 @@ import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.AmbariManagementController;
-import org.apache.ambari.server.controller.ConfigurationRequest;
 import org.apache.ambari.server.orm.TransactionalLocks;
 import org.apache.ambari.server.orm.dao.ClusterDAO;
 import org.apache.ambari.server.orm.entities.ClusterConfigEntity;
 import org.apache.ambari.server.state.PropertyInfo.PropertyType;
 import org.apache.ambari.server.state.configgroup.ConfigGroup;
 import org.apache.ambari.server.upgrade.UpgradeCatalog170;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.collect.Maps;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.persist.Transactional;
-
-import org.apache.ambari.server.AmbariException;
-import org.apache.ambari.server.api.services.AmbariMetaInfo;
-import org.apache.ambari.server.configuration.Configuration;
-import org.apache.ambari.server.controller.AmbariManagementController;
-import org.apache.ambari.server.orm.dao.ClusterDAO;
-import org.apache.ambari.server.orm.entities.ClusterConfigEntity;
-import org.apache.ambari.server.state.PropertyInfo.PropertyType;
-import org.apache.ambari.server.state.configgroup.ConfigGroup;
-import org.apache.ambari.server.upgrade.UpgradeCatalog170;
 import org.apache.ambari.server.utils.SecretReference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -112,6 +92,11 @@ public class ConfigHelper {
   public static final String HTTPS_ONLY = "HTTPS_ONLY";
 
   /**
+   * The tag given to newly created versions.
+   */
+  public static final String FIRST_VERSION_TAG = "version1";
+
+  /**
    * Used to ensure that methods which rely on the completion of
    * {@link Transactional} can detect when they are able to run.
    *
@@ -831,10 +816,9 @@ public class ConfigHelper {
                                String authenticatedUserName,
                                String serviceVersionNote) throws AmbariException {
 
-    String tag = "version1";
-
     // create the configuration history entry
-    Config baseConfig = createConfig(cluster, controller, configType, tag, properties, propertyAttributes);
+    Config baseConfig = createConfig(cluster, controller, configType, FIRST_VERSION_TAG, properties,
+        propertyAttributes);
 
     if (baseConfig != null) {
       cluster.addDesiredConfig(authenticatedUserName,
@@ -888,10 +872,9 @@ public class ConfigHelper {
 
     for (Map.Entry<String, Map<String, String>> entry : batchProperties.entrySet()) {
       String type = entry.getKey();
-      String tag = "version1";
       Map<String, String> properties = entry.getValue();
 
-      Config baseConfig = createConfig(cluster, controller, type, tag, properties,
+      Config baseConfig = createConfig(cluster, controller, type, FIRST_VERSION_TAG, properties,
         Collections.<String, Map<String,String>>emptyMap());
 
       if (null != baseConfig) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/7593acfd/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigImpl.java
index 726e49f..b590c56 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigImpl.java
@@ -33,7 +33,6 @@ import org.apache.ambari.server.orm.dao.ClusterDAO;
 import org.apache.ambari.server.orm.dao.ServiceConfigDAO;
 import org.apache.ambari.server.orm.entities.ClusterConfigEntity;
 import org.apache.ambari.server.orm.entities.ClusterEntity;
-import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -423,12 +422,10 @@ public class ConfigImpl implements Config {
       cluster.getClusterGlobalLock().writeLock().unlock();
     }
 
-    // broadcast the change event for cluster-env config type
-    if (StringUtils.equals(getType(), ConfigHelper.CLUSTER_ENV)) {
-      ClusterConfigChangedEvent event = new ClusterConfigChangedEvent(cluster.getClusterName(),
-          getType(), getTag(), getVersion());
+    // broadcast the change event for the configuration
+    ClusterConfigChangedEvent event = new ClusterConfigChangedEvent(cluster.getClusterName(),
+        getType(), getTag(), getVersion());
 
       eventPublisher.publish(event);
-    }
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/7593acfd/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java
index 58975f7..9f610f9 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java
@@ -58,11 +58,11 @@ import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
+import org.springframework.security.core.context.SecurityContextHolder;
 
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.persist.PersistService;
-import org.springframework.security.core.context.SecurityContextHolder;
 
 public class JMXHostProviderTest {
   private Injector injector;
@@ -228,7 +228,7 @@ public class JMXHostProviderTest {
     String serviceName = "HDFS";
     String serviceName2 = "YARN";
     String serviceName3 = "MAPREDUCE2";
-    
+
     createService(clusterName, serviceName, null);
     createService(clusterName, serviceName2, null);
     createService(clusterName, serviceName3, null);
@@ -309,7 +309,7 @@ public class JMXHostProviderTest {
     yarnConfigs.put(RESOURCEMANAGER_HTTPS_PORT, "8090");
     yarnConfigs.put(NODEMANAGER_HTTPS_PORT, "8044");
     yarnConfigs.put(YARN_HTTPS_POLICY, "HTTPS_ONLY");
-    
+
     Map<String, String> mapreduceConfigs = new HashMap<String, String>();
     mapreduceConfigs.put(MAPREDUCE_HTTPS_PORT, "19889");
     mapreduceConfigs.put(MAPREDUCE_HTTPS_POLICY, "HTTPS_ONLY");
@@ -328,7 +328,7 @@ public class JMXHostProviderTest {
       "yarn-site", "versionN", yarnConfigs, null);
     crReq.setDesiredConfig(Collections.singletonList(cr2));
     controller.updateClusters(Collections.singleton(crReq), null);
-    
+
     ConfigurationRequest cr3 = new ConfigurationRequest(clusterName,
         "mapred-site", "versionN", mapreduceConfigs, null);
       crReq.setDesiredConfig(Collections.singletonList(cr3));
@@ -418,7 +418,7 @@ public class JMXHostProviderTest {
 
     createHDFSServiceConfigs(true);
 
-    JMXHostProviderModule providerModule = new JMXHostProviderModule();
+    JMXHostProviderModule providerModule = new JMXHostProviderModule(controller);
     providerModule.registerResourceProvider(Resource.Type.Service);
     providerModule.registerResourceProvider(Resource.Type.Configuration);
     // Non default port addresses
@@ -438,7 +438,7 @@ public class JMXHostProviderTest {
 
     createHDFSServiceConfigs(false);
 
-    JMXHostProviderModule providerModule = new JMXHostProviderModule();
+    JMXHostProviderModule providerModule = new JMXHostProviderModule(controller);
     providerModule.registerResourceProvider(Resource.Type.Service);
     providerModule.registerResourceProvider(Resource.Type.Configuration);
     // Non default port addresses
@@ -458,7 +458,7 @@ public class JMXHostProviderTest {
 
     createConfigsNameNodeHa();
 
-    JMXHostProviderModule providerModule = new JMXHostProviderModule();
+    JMXHostProviderModule providerModule = new JMXHostProviderModule(controller);
     providerModule.registerResourceProvider(Resource.Type.Service);
     providerModule.registerResourceProvider(Resource.Type.Configuration);
 
@@ -475,7 +475,7 @@ public class JMXHostProviderTest {
 
     createConfigs();
 
-    JMXHostProviderModule providerModule = new JMXHostProviderModule();
+    JMXHostProviderModule providerModule = new JMXHostProviderModule(controller);
     providerModule.registerResourceProvider(Resource.Type.Cluster);
     providerModule.registerResourceProvider(Resource.Type.Configuration);
     // Non default port addresses
@@ -489,10 +489,9 @@ public class JMXHostProviderTest {
 
   @Test
   public void testGetHostNames() throws AmbariException {
-    JMXHostProviderModule providerModule = new JMXHostProviderModule();
-
-
     AmbariManagementController managementControllerMock = createNiceMock(AmbariManagementController.class);
+    JMXHostProviderModule providerModule = new JMXHostProviderModule(managementControllerMock);
+
     Clusters clustersMock = createNiceMock(Clusters.class);
     Cluster clusterMock = createNiceMock(Cluster.class);
     Service serviceMock = createNiceMock(Service.class);
@@ -509,7 +508,6 @@ public class JMXHostProviderTest {
     expect(serviceComponentMock.getServiceComponentHosts()).andReturn(hostComponents).anyTimes();
 
     replay(managementControllerMock, clustersMock, clusterMock, serviceMock, serviceComponentMock);
-    providerModule.managementController = managementControllerMock;
 
     Set<String> result = providerModule.getHostNames("c1", "DATANODE");
     Assert.assertTrue(result.iterator().next().equals("host1"));
@@ -522,7 +520,7 @@ public class JMXHostProviderTest {
     ResourceAlreadyExistsException, UnsupportedPropertyException,
     SystemException, AmbariException, NoSuchResourceException {
     createConfigs();
-    JMXHostProviderModule providerModule = new JMXHostProviderModule();
+    JMXHostProviderModule providerModule = new JMXHostProviderModule(controller);
     providerModule.registerResourceProvider(Resource.Type.Cluster);
     providerModule.registerResourceProvider(Resource.Type.Configuration);
     Assert.assertEquals("https", providerModule.getJMXProtocol("c1", "RESOURCEMANAGER"));
@@ -530,14 +528,14 @@ public class JMXHostProviderTest {
     Assert.assertEquals("https", providerModule.getJMXProtocol("c1", "NODEMANAGER"));
     Assert.assertEquals("8044", providerModule.getPort("c1", "NODEMANAGER", "localhost", true));
   }
-  
+
   @Test
   public void testJMXHistoryServerHttpsPort() throws
     NoSuchParentResourceException,
     ResourceAlreadyExistsException, UnsupportedPropertyException,
     SystemException, AmbariException, NoSuchResourceException {
     createConfigs();
-    JMXHostProviderModule providerModule = new JMXHostProviderModule();
+    JMXHostProviderModule providerModule = new JMXHostProviderModule(controller);
     providerModule.registerResourceProvider(Resource.Type.Cluster);
     providerModule.registerResourceProvider(Resource.Type.Configuration);
     Assert.assertEquals("https", providerModule.getJMXProtocol("c1", "HISTORYSERVER"));
@@ -551,7 +549,7 @@ public class JMXHostProviderTest {
     ResourceAlreadyExistsException, UnsupportedPropertyException,
     SystemException, AmbariException, NoSuchResourceException {
     createConfigs();
-    JMXHostProviderModule providerModule = new JMXHostProviderModule();
+    JMXHostProviderModule providerModule = new JMXHostProviderModule(controller);
     providerModule.registerResourceProvider(Resource.Type.Cluster);
     providerModule.registerResourceProvider(Resource.Type.Configuration);
     Assert.assertEquals("https", providerModule.getJMXProtocol("c1", "JOURNALNODE"));
@@ -564,7 +562,7 @@ public class JMXHostProviderTest {
     ResourceAlreadyExistsException, UnsupportedPropertyException,
     SystemException, AmbariException, NoSuchResourceException {
     createConfigs();
-    JMXHostProviderModule providerModule = new JMXHostProviderModule();
+    JMXHostProviderModule providerModule = new JMXHostProviderModule(controller);
     providerModule.registerResourceProvider(Resource.Type.Cluster);
     providerModule.registerResourceProvider(Resource.Type.Configuration);
     Assert.assertEquals("https", providerModule.getJMXProtocol("c1", "DATANODE"));
@@ -579,7 +577,7 @@ public class JMXHostProviderTest {
 
     createConfigs();
 
-    JMXHostProviderModule providerModule = new JMXHostProviderModule();
+    JMXHostProviderModule providerModule = new JMXHostProviderModule(controller);
     providerModule.registerResourceProvider(Resource.Type.Cluster);
     providerModule.registerResourceProvider(Resource.Type.Configuration);
     // Non default port addresses
@@ -630,6 +628,11 @@ public class JMXHostProviderTest {
     ResourceProvider configResourceProvider = new ConfigurationResourceProvider(
         controller);
 
+    JMXHostProviderModule(AmbariManagementController ambariManagementController) {
+      super();
+      managementController = ambariManagementController;
+    }
+
     @Override
     protected ResourceProvider createResourceProvider(Resource.Type type) {
       if (type == Resource.Type.Cluster) {