Jelajahi Sumber

AMBARI-11688. Install services request executes 40 seconds. (mpapirkovskyy)

Myroslav Papirkovskyy 10 tahun lalu
induk
melakukan
fb25e19f69

+ 1 - 1
ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java

@@ -262,7 +262,7 @@ public class ActionDBAccessorImpl implements ActionDBAccessor {
         HostRoleCommandEntity hostRoleCommandEntity = hostRoleCommand.constructNewPersistenceEntity();
         hostRoleCommandEntity.setStage(stageEntity);
 
-        HostEntity hostEntity = hostDAO.findByName(hostRoleCommandEntity.getHostName());
+        HostEntity hostEntity = hostDAO.findById(hostRoleCommandEntity.getHostId());
         if (hostEntity == null) {
           String msg = String.format("Host %s doesn't exist in database", hostRoleCommandEntity.getHostName());
           LOG.error(msg);

+ 14 - 0
ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommand.java

@@ -25,6 +25,7 @@ import org.apache.ambari.server.orm.dao.HostDAO;
 import org.apache.ambari.server.orm.entities.ExecutionCommandEntity;
 import org.apache.ambari.server.orm.entities.HostEntity;
 import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
+import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.ServiceComponentHostEvent;
 
 import com.google.inject.Injector;
@@ -103,6 +104,19 @@ public class HostRoleCommand {
     this.hostEntity = this.hostDAO.findByName(hostName);
   }
 
+  @AssistedInject
+  public HostRoleCommand(Host host, Role role, ServiceComponentHostEvent event, RoleCommand command,
+                         boolean retryAllowed, HostDAO hostDAO, ExecutionCommandDAO executionCommandDAO) {
+    this.hostDAO = hostDAO;
+    this.executionCommandDAO = executionCommandDAO;
+
+    this.role = role;
+    this.event = new ServiceComponentHostEventWrapper(event);
+    this.roleCommand = command;
+    this.retryAllowed = retryAllowed;
+    this.hostEntity = hostDAO.findById(host.getHostId());
+  }
+
   @AssistedInject
   public HostRoleCommand(@Assisted HostRoleCommandEntity hostRoleCommandEntity, HostDAO hostDAO, ExecutionCommandDAO executionCommandDAO) {
     this.hostDAO = hostDAO;

+ 13 - 0
ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommandFactory.java

@@ -21,6 +21,7 @@ package org.apache.ambari.server.actionmanager;
 import org.apache.ambari.server.Role;
 import org.apache.ambari.server.RoleCommand;
 import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
+import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.ServiceComponentHostEvent;
 
 public interface HostRoleCommandFactory {
@@ -46,6 +47,18 @@ public interface HostRoleCommandFactory {
    */
   HostRoleCommand create(String hostName, Role role, ServiceComponentHostEvent event, RoleCommand command, boolean retryAllowed);
 
+  /**
+   * Constructor via factory.
+   * @param host Host object
+   * @param role Action to run
+   * @param event Event on the host and component
+   * @param command Type of command
+   * @param retryAllowed Whether the command can be repeated
+   * @return An instance of a HostRoleCommand.
+   */
+  HostRoleCommand create(Host host, Role role, ServiceComponentHostEvent event, RoleCommand command, boolean
+      retryAllowed);
+
   /**
    * Constructor via factory
    * @param hostRoleCommandEntity Object to copy fields from.

+ 17 - 0
ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommandFactoryImpl.java

@@ -26,6 +26,7 @@ import org.apache.ambari.server.RoleCommand;
 import org.apache.ambari.server.orm.dao.ExecutionCommandDAO;
 import org.apache.ambari.server.orm.dao.HostDAO;
 import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
+import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.ServiceComponentHostEvent;
 
 @Singleton
@@ -71,6 +72,22 @@ public class HostRoleCommandFactoryImpl implements HostRoleCommandFactory {
         this.injector.getInstance(ExecutionCommandDAO.class));
   }
 
+  /**
+   * Constructor via factory.
+   * @param host Host object
+   * @param role Action to run
+   * @param event Event on the host and component
+   * @param command Type of command
+   * @param retryAllowed Whether the command can be repeated
+   * @return An instance of a HostRoleCommand.
+   */
+  @Override
+  public HostRoleCommand create(Host host, Role role, ServiceComponentHostEvent event, RoleCommand command, boolean retryAllowed) {
+    return new HostRoleCommand(host, role, event, command, retryAllowed,
+        this.injector.getInstance(HostDAO.class),
+        this.injector.getInstance(ExecutionCommandDAO.class));
+  }
+
   /**
    * Constructor via factory
    * @param hostRoleCommandEntity Object to copy fields from.

+ 31 - 0
ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Stage.java

@@ -37,7 +37,9 @@ import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
 import org.apache.ambari.server.orm.entities.RoleSuccessCriteriaEntity;
 import org.apache.ambari.server.orm.entities.StageEntity;
 import org.apache.ambari.server.serveraction.ServerAction;
+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.ServiceComponentHostEvent;
 import org.apache.ambari.server.state.svccomphost.ServiceComponentHostServerActionEvent;
 import org.apache.ambari.server.utils.StageUtils;
@@ -270,6 +272,19 @@ public class Stage {
 
     //used on stage creation only, no need to check if wrappers loaded
     HostRoleCommand hrc = hostRoleCommandFactory.create(hostName, role, event, command, retryAllowed);
+    return addGenericExecutionCommand(clusterName, hostName, role, command, event, hrc);
+  }
+
+  private ExecutionCommandWrapper addGenericExecutionCommand(
+      Cluster cluster, Host host, Role role,
+      RoleCommand command, ServiceComponentHostEvent event, boolean retryAllowed) {
+    HostRoleCommand hrc = hostRoleCommandFactory.create(host, role, event, command, retryAllowed);
+    return addGenericExecutionCommand(cluster.getClusterName(), host.getHostName(), role, command, event, hrc);
+
+  }
+
+  //TODO refactor method to use Host object (host_id support)
+  private ExecutionCommandWrapper addGenericExecutionCommand(String clusterName, String hostName, Role role, RoleCommand command, ServiceComponentHostEvent event, HostRoleCommand hrc) {
     ExecutionCommand cmd = new ExecutionCommand();
     ExecutionCommandWrapper wrapper = new ExecutionCommandWrapper(cmd);
     hrc.setExecutionCommandWrapper(wrapper);
@@ -324,6 +339,22 @@ public class Stage {
     commandWrapper.getExecutionCommand().setServiceName(serviceName);
   }
 
+  /**
+   * A new host role command is created for execution.
+   * Creates both ExecutionCommand and HostRoleCommand objects and
+   * adds them to the Stage. This should be called only once for a host-role
+   * for a given stage.
+   */
+  public synchronized void addHostRoleExecutionCommand(Host host, Role role, RoleCommand command,
+                                                       ServiceComponentHostEvent event, Cluster cluster,
+                                                       String serviceName, boolean retryAllowed) {
+
+    ExecutionCommandWrapper commandWrapper =
+        addGenericExecutionCommand(cluster, host, role, command, event, retryAllowed);
+
+    commandWrapper.getExecutionCommand().setServiceName(serviceName);
+  }
+
   /**
    * Creates server-side execution command.
    * <p/>

+ 2 - 2
ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java

@@ -1774,9 +1774,9 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
 
     String serviceName = scHost.getServiceName();
 
-    stage.addHostRoleExecutionCommand(scHost.getHostName(), Role.valueOf(scHost
+    stage.addHostRoleExecutionCommand(scHost.getHost(), Role.valueOf(scHost
       .getServiceComponentName()), roleCommand,
-      event, scHost.getClusterName(),
+      event, cluster,
       serviceName, false);
     String componentName = scHost.getServiceComponentName();
     String hostname = scHost.getHostName();

+ 1 - 2
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java

@@ -168,7 +168,6 @@ public class ServiceResourceProvider extends AbstractControllerResourceProvider
   }
 
   @Override
-  @Transactional
   public Set<Resource> getResources(Request request, Predicate predicate) throws
       SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
 
@@ -484,7 +483,7 @@ public class ServiceResourceProvider extends AbstractControllerResourceProvider
   }
 
   // Get services from the given request.
-  private synchronized Set<ServiceResponse> getServices(ServiceRequest request)
+  private Set<ServiceResponse> getServices(ServiceRequest request)
       throws AmbariException {
     if (request.getClusterName() == null
         || request.getClusterName().isEmpty()) {

+ 4 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java

@@ -196,6 +196,10 @@ public class HostRoleCommandEntity {
     return hostEntity != null ? hostEntity.getHostName() : null;
   }
 
+  public Long getHostId() {
+    return hostEntity != null ? hostEntity.getHostId() : null;
+  }
+
   public Role getRole() {
     return Role.valueOf(role);
   }

+ 5 - 0
ambari-server/src/main/java/org/apache/ambari/server/state/Host.java

@@ -37,6 +37,11 @@ public interface Host {
    */
   public String getHostName();
 
+  /**
+   * @return host id
+   */
+  Long getHostId();
+
   /**
    * @param hostName the hostName to set
    */

+ 6 - 0
ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentHost.java

@@ -58,6 +58,12 @@ public interface ServiceComponentHost {
    */
   public String getHostName();
 
+  /**
+   * Get the Host this object maps to
+   * @return Host Object
+   */
+  Host getHost();
+
   /**
    * Send a ServiceComponentHostState event to the StateMachine
    * @param event Event to handle

+ 5 - 0
ambari-server/src/main/java/org/apache/ambari/server/state/host/HostImpl.java

@@ -598,6 +598,11 @@ public class HostImpl implements Host {
     return hostEntity.getHostName();
   }
 
+  @Override
+  public Long getHostId() {
+    return hostEntity.getHostId();
+  }
+
   @Override
   public void setHostName(String hostName) {
     try {

+ 5 - 0
ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java

@@ -940,6 +940,11 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
     return host.getHostName();
   }
 
+  @Override
+  public Host getHost() {
+    return host;
+  }
+
   /**
    * @return the lastOpStartTime
    */

+ 5 - 5
ambari-server/src/main/resources/stacks/HDPWIN/2.1/services/stack_advisor.py

@@ -209,8 +209,8 @@ class HDPWIN21StackAdvisor(DefaultStackAdvisor):
         putAmsHbaseSiteProperty("hbase.regionserver.global.memstore.lowerLimit", 0.25)
         putAmsHbaseSiteProperty("phoenix.query.maxGlobalMemoryPercentage", 20)
         putTimelineServiceProperty("phoenix.query.maxGlobalMemoryPercentage", 30)
-        putAmsHbaseSiteProperty("hbase_master_xmn_size", "512m")
-        putAmsHbaseSiteProperty("regionserver_xmn_size", "512m")
+        putHbaseEnvProperty("hbase_master_xmn_size", "512m")
+        putHbaseEnvProperty("regionserver_xmn_size", "512m")
       elif totalHostsCount >= 100:
         putHbaseEnvProperty("hbase_regionserver_heapsize", "6144m")
         putAmsEnvProperty("metrics_collector_heapsize", "4096m")
@@ -218,18 +218,18 @@ class HDPWIN21StackAdvisor(DefaultStackAdvisor):
         putAmsHbaseSiteProperty("hbase.regionserver.hlog.blocksize", 134217728)
         putAmsHbaseSiteProperty("hbase.regionserver.maxlogs", 64)
         putAmsHbaseSiteProperty("hbase.hregion.memstore.flush.size", 268435456)
-        putAmsHbaseSiteProperty("hbase_master_xmn_size", "512m")
+        putHbaseEnvProperty("hbase_master_xmn_size", "512m")
       elif totalHostsCount >= 50:
         putHbaseEnvProperty("hbase_regionserver_heapsize", "2048m")
         putHbaseEnvProperty("hbase_master_heapsize", "512m")
         putAmsEnvProperty("metrics_collector_heapsize", "2048m")
-        putAmsHbaseSiteProperty("hbase_master_xmn_size", "256m")
+        putHbaseEnvProperty("hbase_master_xmn_size", "256m")
       else:
         # Embedded mode heap size : master + regionserver
         putHbaseEnvProperty("hbase_regionserver_heapsize", "512m")
         putHbaseEnvProperty("hbase_master_heapsize", "512m")
         putAmsEnvProperty("metrics_collector_heapsize", "512m")
-        putAmsHbaseSiteProperty("hbase_master_xmn_size", "128m")
+        putHbaseEnvProperty("hbase_master_xmn_size", "128m")
       pass
     pass