Bladeren bron

AMBARI-3135. Out of memory issues with Request API on large cluster. (Myroslav Papirkovskyy via swagle)

Siddharth Wagle 12 jaren geleden
bovenliggende
commit
3e88cb6faa
32 gewijzigde bestanden met toevoegingen van 267 en 39 verwijderingen
  1. 5 0
      ambari-project/pom.xml
  2. 25 0
      ambari-server/pom.xml
  3. 76 27
      ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java
  4. 21 8
      ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommand.java
  5. 39 0
      ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommandFactoryImpl.java
  6. 17 0
      ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java
  7. 7 1
      ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
  8. 3 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/PropertyHelper.java
  9. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ClusterDAO.java
  10. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ClusterServiceDAO.java
  11. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ClusterStateDAO.java
  12. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ComponentConfigMappingDAO.java
  13. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ExecutionCommandDAO.java
  14. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostComponentConfigMappingDAO.java
  15. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostComponentDesiredConfigMappingDAO.java
  16. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostComponentDesiredStateDAO.java
  17. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostComponentStateDAO.java
  18. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostConfigMappingDAO.java
  19. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostDAO.java
  20. 29 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
  21. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostStateDAO.java
  22. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/KeyValueDAO.java
  23. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/MetainfoDAO.java
  24. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/RoleDAO.java
  25. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/RoleSuccessCriteriaDAO.java
  26. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceComponentDesiredStateDAO.java
  27. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceConfigMappingDAO.java
  28. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceDesiredStateDAO.java
  29. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/StageDAO.java
  30. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/UserDAO.java
  31. 1 2
      ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java
  32. 2 1
      ambari-server/src/main/resources/META-INF/persistence.xml

+ 5 - 0
ambari-project/pom.xml

@@ -198,6 +198,11 @@
         <artifactId>postgresql</artifactId>
         <artifactId>postgresql</artifactId>
         <version>9.1-901.jdbc4</version>
         <version>9.1-901.jdbc4</version>
       </dependency>
       </dependency>
+      <dependency>
+        <groupId>com.google.guava</groupId>
+        <artifactId>guava</artifactId>
+        <version>14.0.1</version>
+      </dependency>
       <dependency>
       <dependency>
         <groupId>org.mockito</groupId>
         <groupId>org.mockito</groupId>
         <artifactId>mockito-core</artifactId>
         <artifactId>mockito-core</artifactId>

+ 25 - 0
ambari-server/pom.xml

@@ -149,6 +149,26 @@
           <!--</execution>-->
           <!--</execution>-->
         <!--</executions>-->
         <!--</executions>-->
       <!--</plugin>-->
       <!--</plugin>-->
+      <plugin>
+        <!--Static -->
+        <artifactId>maven-antrun-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>process-classes</phase>
+            <configuration>
+              <tasks>
+                <java classname="org.eclipse.persistence.tools.weaving.jpa.StaticWeave"
+                      classpathref="maven.runtime.classpath" fork="true">
+                  <arg line="-loglevel FINE -persistenceinfo src/main/resources target/classes target/classes"/>
+                </java>
+              </tasks>
+            </configuration>
+            <goals>
+              <goal>run</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
       <plugin>
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>rpm-maven-plugin</artifactId>
         <artifactId>rpm-maven-plugin</artifactId>
@@ -741,6 +761,11 @@
 	  <artifactId>httpclient</artifactId>
 	  <artifactId>httpclient</artifactId>
 	  <version>4.2.5</version>
 	  <version>4.2.5</version>
     </dependency>
     </dependency>
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+      <version>14.0.1</version>
+    </dependency>
   </dependencies>
   </dependencies>
   <!--<reporting>
   <!--<reporting>
         <plugins>
         <plugins>

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

@@ -18,7 +18,12 @@
 package org.apache.ambari.server.actionmanager;
 package org.apache.ambari.server.actionmanager;
 
 
 import java.util.*;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.collect.ImmutableMap;
+import com.google.inject.name.Named;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.Role;
 import org.apache.ambari.server.Role;
 import org.apache.ambari.server.agent.CommandReport;
 import org.apache.ambari.server.agent.CommandReport;
@@ -67,13 +72,20 @@ public class ActionDBAccessorImpl implements ActionDBAccessor {
   @Inject
   @Inject
   private Clusters clusters;
   private Clusters clusters;
 
 
+  private Cache<Long, HostRoleCommand> hostRoleCommandCache;
+  private long cacheLimit; //may be exceeded to store tasks from one request
+
   private final long requestId;
   private final long requestId;
 
 
   @Inject
   @Inject
-  public ActionDBAccessorImpl(Injector injector) {
+  public ActionDBAccessorImpl(Injector injector, @Named("executionCommandCacheSize") long cacheLimit) {
     injector.injectMembers(this);
     injector.injectMembers(this);
     requestId = stageDAO.getLastRequestId();
     requestId = stageDAO.getLastRequestId();
 
 
+    this.cacheLimit = cacheLimit;
+    hostRoleCommandCache = CacheBuilder.newBuilder().
+        expireAfterAccess(5, TimeUnit.MINUTES).
+        build();
 
 
   }
   }
 
 
@@ -105,7 +117,7 @@ public class ActionDBAccessorImpl implements ActionDBAccessor {
     List<HostRoleCommandEntity> commands =
     List<HostRoleCommandEntity> commands =
         hostRoleCommandDAO.findByRequest(requestId);
         hostRoleCommandDAO.findByRequest(requestId);
     for (HostRoleCommandEntity command : commands) {
     for (HostRoleCommandEntity command : commands) {
-      if(command.getStatus() == HostRoleStatus.QUEUED ||
+      if (command.getStatus() == HostRoleStatus.QUEUED ||
           command.getStatus() == HostRoleStatus.IN_PROGRESS ||
           command.getStatus() == HostRoleStatus.IN_PROGRESS ||
           command.getStatus() == HostRoleStatus.PENDING) {
           command.getStatus() == HostRoleStatus.PENDING) {
         command.setStatus(HostRoleStatus.ABORTED);
         command.setStatus(HostRoleStatus.ABORTED);
@@ -125,7 +137,7 @@ public class ActionDBAccessorImpl implements ActionDBAccessor {
   @Override
   @Override
   @Transactional
   @Transactional
   public void timeoutHostRole(String host, long requestId, long stageId,
   public void timeoutHostRole(String host, long requestId, long stageId,
-      Role role) {
+                              Role role) {
     List<HostRoleCommandEntity> commands =
     List<HostRoleCommandEntity> commands =
         hostRoleCommandDAO.findByHostRole(host, requestId, stageId, role);
         hostRoleCommandDAO.findByHostRole(host, requestId, stageId, role);
     for (HostRoleCommandEntity command : commands) {
     for (HostRoleCommandEntity command : commands) {
@@ -179,7 +191,7 @@ public class ActionDBAccessorImpl implements ActionDBAccessor {
         HostEntity hostEntity = hostDAO.findByName(hostRoleCommandEntity.getHostName());
         HostEntity hostEntity = hostDAO.findByName(hostRoleCommandEntity.getHostName());
         if (hostEntity == null) {
         if (hostEntity == null) {
           LOG.error("Host {} doesn't exists in database" + hostRoleCommandEntity.getHostName());
           LOG.error("Host {} doesn't exists in database" + hostRoleCommandEntity.getHostName());
-          throw new RuntimeException("Host '"+hostRoleCommandEntity.getHostName()+"' doesn't exists in database");
+          throw new RuntimeException("Host '" + hostRoleCommandEntity.getHostName() + "' doesn't exists in database");
         }
         }
         hostRoleCommandEntity.setHost(hostEntity);
         hostRoleCommandEntity.setHost(hostEntity);
         hostRoleCommandDAO.create(hostRoleCommandEntity);
         hostRoleCommandDAO.create(hostRoleCommandEntity);
@@ -208,7 +220,7 @@ public class ActionDBAccessorImpl implements ActionDBAccessor {
   @Override
   @Override
   @Transactional
   @Transactional
   public void updateHostRoleState(String hostname, long requestId,
   public void updateHostRoleState(String hostname, long requestId,
-      long stageId, String role, CommandReport report) {
+                                  long stageId, String role, CommandReport report) {
     if (LOG.isDebugEnabled()) {
     if (LOG.isDebugEnabled()) {
       LOG.debug("Update HostRoleState: "
       LOG.debug("Update HostRoleState: "
           + "HostName " + hostname + " requestId " + requestId + " stageId "
           + "HostName " + hostname + " requestId " + requestId + " stageId "
@@ -260,10 +272,14 @@ public class ActionDBAccessorImpl implements ActionDBAccessor {
   @Override
   @Override
   public List<HostRoleCommand> getRequestTasks(long requestId) {
   public List<HostRoleCommand> getRequestTasks(long requestId) {
     List<HostRoleCommand> tasks = new ArrayList<HostRoleCommand>();
     List<HostRoleCommand> tasks = new ArrayList<HostRoleCommand>();
-    for (HostRoleCommandEntity hostRoleCommandEntity : hostRoleCommandDAO.findByRequest(requestId)) {
-      tasks.add(hostRoleCommandFactory.createExisting(hostRoleCommandEntity));
-    }
-    return tasks;
+    return getTasks(
+        hostRoleCommandDAO.findTaskIdsByRequest(requestId)
+    );
+
+//    for (HostRoleCommandEntity hostRoleCommandEntity : hostRoleCommandDAO.findByRequest(requestId)) {
+//      tasks.add(hostRoleCommandFactory.createExisting(hostRoleCommandEntity));
+//    }
+//    return tasks;
   }
   }
 
 
   @Override
   @Override
@@ -271,24 +287,31 @@ public class ActionDBAccessorImpl implements ActionDBAccessor {
     if (requestIds.isEmpty()) {
     if (requestIds.isEmpty()) {
       return Collections.emptyList();
       return Collections.emptyList();
     }
     }
-    List<HostRoleCommand> tasks = new ArrayList<HostRoleCommand>();
-    for (HostRoleCommandEntity hostRoleCommandEntity : hostRoleCommandDAO.findByRequestIds(requestIds)) {
-      tasks.add(hostRoleCommandFactory.createExisting(hostRoleCommandEntity));
-    }
-    return tasks;
+
+    return getTasks(
+        hostRoleCommandDAO.findTaskIdsByRequestIds(requestIds)
+    );
+
+//    List<HostRoleCommand> tasks = new ArrayList<HostRoleCommand>();
+//    for (HostRoleCommandEntity hostRoleCommandEntity : hostRoleCommandDAO.findByRequestIds(requestIds)) {
+//      tasks.add(hostRoleCommandFactory.createExisting(hostRoleCommandEntity));
+//    }
+//    return tasks;
   }
   }
 
 
   @Override
   @Override
   public List<HostRoleCommand> getTasksByRequestAndTaskIds(Collection<Long> requestIds, Collection<Long> taskIds) {
   public List<HostRoleCommand> getTasksByRequestAndTaskIds(Collection<Long> requestIds, Collection<Long> taskIds) {
     if (!requestIds.isEmpty() && !taskIds.isEmpty()) {
     if (!requestIds.isEmpty() && !taskIds.isEmpty()) {
-      List<HostRoleCommand> tasks = new ArrayList<HostRoleCommand>();
-      for (HostRoleCommandEntity hostRoleCommandEntity : hostRoleCommandDAO.findByRequestAndTaskIds(requestIds, taskIds)) {
-        tasks.add(hostRoleCommandFactory.createExisting(hostRoleCommandEntity));
-      }
-      return tasks;
-    }else if (requestIds.isEmpty()) {
+      return getTasks(hostRoleCommandDAO.findTaskIdsByRequestAndTaskIds(requestIds, taskIds));
+
+//      List<HostRoleCommand> tasks = new ArrayList<HostRoleCommand>();
+//      for (HostRoleCommandEntity hostRoleCommandEntity : hostRoleCommandDAO.findByRequestAndTaskIds(requestIds, taskIds)) {
+//        tasks.add(hostRoleCommandFactory.createExisting(hostRoleCommandEntity));
+//      }
+//      return tasks;
+    } else if (requestIds.isEmpty()) {
       return getTasks(taskIds);
       return getTasks(taskIds);
-    }else if (taskIds.isEmpty()) {
+    } else if (taskIds.isEmpty()) {
       return getAllTasksByRequestIds(requestIds);
       return getAllTasksByRequestIds(requestIds);
     } else {
     } else {
       return Collections.emptyList();
       return Collections.emptyList();
@@ -300,10 +323,36 @@ public class ActionDBAccessorImpl implements ActionDBAccessor {
     if (taskIds.isEmpty()) {
     if (taskIds.isEmpty()) {
       return Collections.emptyList();
       return Collections.emptyList();
     }
     }
+
     List<HostRoleCommand> commands = new ArrayList<HostRoleCommand>();
     List<HostRoleCommand> commands = new ArrayList<HostRoleCommand>();
-    for (HostRoleCommandEntity commandEntity : hostRoleCommandDAO.findByPKs(taskIds)) {
-      commands.add(hostRoleCommandFactory.createExisting(commandEntity));
+
+    Map<Long, HostRoleCommand> cached = hostRoleCommandCache.getAllPresent(taskIds);
+    commands.addAll(cached.values());
+
+    List<Long> absent = new ArrayList<Long>();
+    absent.addAll(taskIds);
+    absent.removeAll(cached.keySet());
+
+    if (!absent.isEmpty()) {
+      boolean allowStore = hostRoleCommandCache.size() <= cacheLimit;
+//      LOG.info("Cache size {}, enable = {}", hostRoleCommandCache.size(), allowStore);
+
+      for (HostRoleCommandEntity commandEntity : hostRoleCommandDAO.findByPKs(absent)) {
+        HostRoleCommand hostRoleCommand = hostRoleCommandFactory.createExisting(commandEntity);
+        commands.add(hostRoleCommand);
+        if (allowStore) {
+          switch (hostRoleCommand.getStatus()) {
+            case ABORTED:
+            case COMPLETED:
+            case TIMEDOUT:
+            case FAILED:
+              hostRoleCommandCache.put(hostRoleCommand.getTaskId(), hostRoleCommand);
+              break;
+          }
+        }
+      }
     }
     }
+
     return commands;
     return commands;
   }
   }
 
 
@@ -322,7 +371,7 @@ public class ActionDBAccessorImpl implements ActionDBAccessor {
   }
   }
 
 
   public HostRoleCommand getTask(long taskId) {
   public HostRoleCommand getTask(long taskId) {
-    HostRoleCommandEntity commandEntity = hostRoleCommandDAO.findByPK((int)taskId);
+    HostRoleCommandEntity commandEntity = hostRoleCommandDAO.findByPK((int) taskId);
     if (commandEntity == null) {
     if (commandEntity == null) {
       return null;
       return null;
     }
     }
@@ -335,17 +384,17 @@ public class ActionDBAccessorImpl implements ActionDBAccessor {
     boolean checkAllTasks = false;
     boolean checkAllTasks = false;
     Set<HostRoleStatus> statuses = new HashSet<HostRoleStatus>();
     Set<HostRoleStatus> statuses = new HashSet<HostRoleStatus>();
     if (status == RequestStatus.IN_PROGRESS) {
     if (status == RequestStatus.IN_PROGRESS) {
-      statuses.addAll( Arrays.asList(HostRoleStatus.PENDING,
+      statuses.addAll(Arrays.asList(HostRoleStatus.PENDING,
           HostRoleStatus.IN_PROGRESS, HostRoleStatus.QUEUED));
           HostRoleStatus.IN_PROGRESS, HostRoleStatus.QUEUED));
     } else if (status == RequestStatus.COMPLETED) {
     } else if (status == RequestStatus.COMPLETED) {
       match = false;
       match = false;
       checkAllTasks = true;
       checkAllTasks = true;
-      statuses.addAll( Arrays.asList(HostRoleStatus.PENDING,
+      statuses.addAll(Arrays.asList(HostRoleStatus.PENDING,
           HostRoleStatus.IN_PROGRESS, HostRoleStatus.QUEUED,
           HostRoleStatus.IN_PROGRESS, HostRoleStatus.QUEUED,
           HostRoleStatus.ABORTED, HostRoleStatus.FAILED,
           HostRoleStatus.ABORTED, HostRoleStatus.FAILED,
           HostRoleStatus.TIMEDOUT));
           HostRoleStatus.TIMEDOUT));
     } else if (status == RequestStatus.FAILED) {
     } else if (status == RequestStatus.FAILED) {
-      statuses.addAll( Arrays.asList(HostRoleStatus.ABORTED,
+      statuses.addAll(Arrays.asList(HostRoleStatus.ABORTED,
           HostRoleStatus.FAILED, HostRoleStatus.TIMEDOUT));
           HostRoleStatus.FAILED, HostRoleStatus.TIMEDOUT));
     }
     }
     return hostRoleCommandDAO.getRequestsByTaskStatus(statuses, match, checkAllTasks);
     return hostRoleCommandDAO.getRequestsByTaskStatus(statuses, match, checkAllTasks);

+ 21 - 8
ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommand.java

@@ -19,6 +19,7 @@ package org.apache.ambari.server.actionmanager;
 
 
 import org.apache.ambari.server.Role;
 import org.apache.ambari.server.Role;
 import org.apache.ambari.server.RoleCommand;
 import org.apache.ambari.server.RoleCommand;
+import org.apache.ambari.server.orm.dao.ExecutionCommandDAO;
 import org.apache.ambari.server.orm.entities.ExecutionCommandEntity;
 import org.apache.ambari.server.orm.entities.ExecutionCommandEntity;
 import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
 import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
 import org.apache.ambari.server.state.ServiceComponentHostEvent;
 import org.apache.ambari.server.state.ServiceComponentHostEvent;
@@ -26,8 +27,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 
 
 import com.google.inject.Injector;
 import com.google.inject.Injector;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
 
 
 /**
 /**
  * This class encapsulates the information for an task on a host for a
  * This class encapsulates the information for an task on a host for a
@@ -56,6 +55,8 @@ public class HostRoleCommand {
 
 
   private ExecutionCommandWrapper executionCommandWrapper;
   private ExecutionCommandWrapper executionCommandWrapper;
 
 
+  private ExecutionCommandDAO executionCommandDAO;
+
   public HostRoleCommand(String host, Role role,
   public HostRoleCommand(String host, Role role,
       ServiceComponentHostEvent event, RoleCommand command) {
       ServiceComponentHostEvent event, RoleCommand command) {
     this.hostName = host;
     this.hostName = host;
@@ -64,8 +65,7 @@ public class HostRoleCommand {
     this.roleCommand = command;
     this.roleCommand = command;
   }
   }
 
 
-  @AssistedInject
-  public HostRoleCommand(@Assisted HostRoleCommandEntity hostRoleCommandEntity, Injector injector) {
+  public HostRoleCommand(HostRoleCommandEntity hostRoleCommandEntity, Injector injector) {
     taskId = hostRoleCommandEntity.getTaskId();
     taskId = hostRoleCommandEntity.getTaskId();
     stageId = hostRoleCommandEntity.getStage().getStageId();
     stageId = hostRoleCommandEntity.getStage().getStageId();
     requestId = hostRoleCommandEntity.getStage().getRequestId();
     requestId = hostRoleCommandEntity.getStage().getRequestId();
@@ -80,10 +80,13 @@ public class HostRoleCommand {
     attemptCount = hostRoleCommandEntity.getAttemptCount();
     attemptCount = hostRoleCommandEntity.getAttemptCount();
     roleCommand = hostRoleCommandEntity.getRoleCommand();
     roleCommand = hostRoleCommandEntity.getRoleCommand();
     event = new ServiceComponentHostEventWrapper(hostRoleCommandEntity.getEvent());
     event = new ServiceComponentHostEventWrapper(hostRoleCommandEntity.getEvent());
-    executionCommandWrapper = new ExecutionCommandWrapper(new String(
-        hostRoleCommandEntity
-            .getExecutionCommand().getCommand()
-    ));
+    //make use of lazy loading
+
+    executionCommandDAO = injector.getInstance(ExecutionCommandDAO.class);
+//    executionCommandWrapper = new ExecutionCommandWrapper(new String(
+//        hostRoleCommandEntity
+//            .getExecutionCommand().getCommand()
+//    ));
   }
   }
 
 
   HostRoleCommandEntity constructNewPersistenceEntity() {
   HostRoleCommandEntity constructNewPersistenceEntity() {
@@ -198,6 +201,16 @@ public class HostRoleCommand {
   }
   }
 
 
   public ExecutionCommandWrapper getExecutionCommandWrapper() {
   public ExecutionCommandWrapper getExecutionCommandWrapper() {
+    if (taskId != -1 && executionCommandWrapper == null) {
+      ExecutionCommandEntity commandEntity = executionCommandDAO.findByPK(taskId);
+      if (commandEntity == null) {
+        throw new RuntimeException("Invalid DB state, broken one-to-one relation for taskId=" + taskId);
+      }
+      executionCommandWrapper = new ExecutionCommandWrapper(new String(
+          commandEntity.getCommand()
+      ));
+    }
+
     return executionCommandWrapper;
     return executionCommandWrapper;
   }
   }
 
 

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

@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.actionmanager;
+
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Singleton;
+import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
+
+@Singleton
+public class HostRoleCommandFactoryImpl implements HostRoleCommandFactory {
+  private Injector injector;
+
+  @Inject
+  public HostRoleCommandFactoryImpl(Injector injector) {
+    this.injector = injector;
+  }
+
+  @Override
+  public HostRoleCommand createExisting(HostRoleCommandEntity hostRoleCommandEntity) {
+    return new HostRoleCommand(hostRoleCommandEntity, injector);
+  }
+}

+ 17 - 0
ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java

@@ -129,6 +129,9 @@ public class Configuration {
   public static final String ADMIN_ROLE_NAME_KEY =
   public static final String ADMIN_ROLE_NAME_KEY =
       "authorization.adminRoleName";
       "authorization.adminRoleName";
 
 
+  public static final String SERVER_EC_CACHE_SIZE = "server.ecCacheSize";
+  private static final long SERVER_EC_CACHE_SIZE_DEFAULT = 10000L;
+
   public static final String SERVER_PERSISTENCE_TYPE_KEY = "server.persistence.type";
   public static final String SERVER_PERSISTENCE_TYPE_KEY = "server.persistence.type";
   public static final String SERVER_JDBC_USER_NAME_KEY = "server.jdbc.user.name";
   public static final String SERVER_JDBC_USER_NAME_KEY = "server.jdbc.user.name";
   public static final String SERVER_JDBC_USER_PASSWD_KEY = "server.jdbc.user.passwd";
   public static final String SERVER_JDBC_USER_PASSWD_KEY = "server.jdbc.user.passwd";
@@ -805,4 +808,18 @@ public class Configuration {
     return ambariPropertiesMap;
     return ambariPropertiesMap;
   }
   }
 
 
+  public long getExecutionCommandsCacheSize() {
+    String stringValue = properties.getProperty(SERVER_EC_CACHE_SIZE);
+    long value = SERVER_EC_CACHE_SIZE_DEFAULT;
+    if (stringValue != null) {
+      try {
+        value = Long.getLong(stringValue);
+      } catch (NumberFormatException ignored) {
+      }
+
+    }
+
+    return value;
+  }
+
 }
 }

+ 7 - 1
ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java

@@ -79,6 +79,12 @@ public class ControllerModule extends AbstractModule {
     bind(ActionDBAccessor.class).to(ActionDBAccessorImpl.class);
     bind(ActionDBAccessor.class).to(ActionDBAccessorImpl.class);
     bindConstant().annotatedWith(Names.named("schedulerSleeptime")).to(10000L);
     bindConstant().annotatedWith(Names.named("schedulerSleeptime")).to(10000L);
     bindConstant().annotatedWith(Names.named("actionTimeout")).to(600000L);
     bindConstant().annotatedWith(Names.named("actionTimeout")).to(600000L);
+
+    //ExecutionCommands cache size
+
+    bindConstant().annotatedWith(Names.named("executionCommandCacheSize")).
+        to(configuration.getExecutionCommandsCacheSize());
+
     bind(AmbariManagementController.class)
     bind(AmbariManagementController.class)
         .to(AmbariManagementControllerImpl.class);
         .to(AmbariManagementControllerImpl.class);
     bind(AbstractRootServiceResponseFactory.class).to(RootServiceResponseFactory.class);
     bind(AbstractRootServiceResponseFactory.class).to(RootServiceResponseFactory.class);
@@ -158,7 +164,7 @@ public class ControllerModule extends AbstractModule {
     install(new FactoryModuleBuilder().implement(
     install(new FactoryModuleBuilder().implement(
         Config.class, ConfigImpl.class).build(ConfigFactory.class));
         Config.class, ConfigImpl.class).build(ConfigFactory.class));
     install(new FactoryModuleBuilder().build(StageFactory.class));
     install(new FactoryModuleBuilder().build(StageFactory.class));
-    install(new FactoryModuleBuilder().build(HostRoleCommandFactory.class));
+    bind(HostRoleCommandFactory.class).to(HostRoleCommandFactoryImpl.class);
   }
   }
 
 
 }
 }

+ 3 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/PropertyHelper.java

@@ -191,6 +191,9 @@ public class PropertyHelper {
    * @return true if the given property id contains any replacement arguments
    * @return true if the given property id contains any replacement arguments
    */
    */
   public static boolean containsArguments(String propertyId) {
   public static boolean containsArguments(String propertyId) {
+    if (!propertyId.contains("$")) {
+      return false;
+    }
     Matcher matcher = CHECK_FOR_METRIC_ARGUMENTS_REGEX.matcher(propertyId);
     Matcher matcher = CHECK_FOR_METRIC_ARGUMENTS_REGEX.matcher(propertyId);
     return matcher.find();
     return matcher.find();
   }
   }

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ClusterDAO.java

@@ -24,6 +24,7 @@ import javax.persistence.EntityManager;
 import javax.persistence.NoResultException;
 import javax.persistence.NoResultException;
 import javax.persistence.TypedQuery;
 import javax.persistence.TypedQuery;
 
 
+import com.google.inject.Singleton;
 import org.apache.ambari.server.orm.entities.ClusterConfigEntity;
 import org.apache.ambari.server.orm.entities.ClusterConfigEntity;
 import org.apache.ambari.server.orm.entities.ClusterEntity;
 import org.apache.ambari.server.orm.entities.ClusterEntity;
 
 
@@ -31,6 +32,7 @@ import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 
 
+@Singleton
 public class ClusterDAO {
 public class ClusterDAO {
 
 
   @Inject
   @Inject

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ClusterServiceDAO.java

@@ -20,6 +20,7 @@ package org.apache.ambari.server.orm.dao;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.orm.entities.ClusterServiceEntity;
 import org.apache.ambari.server.orm.entities.ClusterServiceEntity;
 import org.apache.ambari.server.orm.entities.ClusterServiceEntityPK;
 import org.apache.ambari.server.orm.entities.ClusterServiceEntityPK;
@@ -28,6 +29,7 @@ import javax.persistence.EntityManager;
 import javax.persistence.NoResultException;
 import javax.persistence.NoResultException;
 import javax.persistence.TypedQuery;
 import javax.persistence.TypedQuery;
 
 
+@Singleton
 public class ClusterServiceDAO {
 public class ClusterServiceDAO {
   @Inject
   @Inject
   Provider<EntityManager> entityManagerProvider;
   Provider<EntityManager> entityManagerProvider;

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ClusterStateDAO.java

@@ -20,11 +20,13 @@ package org.apache.ambari.server.orm.dao;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.orm.entities.ClusterStateEntity;
 import org.apache.ambari.server.orm.entities.ClusterStateEntity;
 
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManager;
 
 
+@Singleton
 public class ClusterStateDAO {
 public class ClusterStateDAO {
   @Inject
   @Inject
   Provider<EntityManager> entityManagerProvider;
   Provider<EntityManager> entityManagerProvider;

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ComponentConfigMappingDAO.java

@@ -24,6 +24,7 @@ import java.util.List;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManager;
@@ -31,6 +32,7 @@ import javax.persistence.TypedQuery;
 
 
 import org.apache.ambari.server.orm.entities.ComponentConfigMappingEntity;
 import org.apache.ambari.server.orm.entities.ComponentConfigMappingEntity;
 
 
+@Singleton
 public class ComponentConfigMappingDAO {
 public class ComponentConfigMappingDAO {
 
 
   @Inject
   @Inject

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ExecutionCommandDAO.java

@@ -20,11 +20,13 @@ package org.apache.ambari.server.orm.dao;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.orm.entities.ExecutionCommandEntity;
 import org.apache.ambari.server.orm.entities.ExecutionCommandEntity;
 
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManager;
 
 
+@Singleton
 public class ExecutionCommandDAO {
 public class ExecutionCommandDAO {
 
 
   @Inject
   @Inject

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostComponentConfigMappingDAO.java

@@ -24,6 +24,7 @@ import java.util.List;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManager;
@@ -31,6 +32,7 @@ import javax.persistence.TypedQuery;
 
 
 import org.apache.ambari.server.orm.entities.HostComponentConfigMappingEntity;
 import org.apache.ambari.server.orm.entities.HostComponentConfigMappingEntity;
 
 
+@Singleton
 public class HostComponentConfigMappingDAO {
 public class HostComponentConfigMappingDAO {
 
 
   @Inject
   @Inject

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostComponentDesiredConfigMappingDAO.java

@@ -24,6 +24,7 @@ import java.util.List;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManager;
@@ -31,6 +32,7 @@ import javax.persistence.TypedQuery;
 
 
 import org.apache.ambari.server.orm.entities.HostComponentDesiredConfigMappingEntity;
 import org.apache.ambari.server.orm.entities.HostComponentDesiredConfigMappingEntity;
 
 
+@Singleton
 public class HostComponentDesiredConfigMappingDAO {
 public class HostComponentDesiredConfigMappingDAO {
 
 
   @Inject
   @Inject

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostComponentDesiredStateDAO.java

@@ -20,12 +20,14 @@ package org.apache.ambari.server.orm.dao;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntityPK;
 import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntityPK;
 
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManager;
 
 
+@Singleton
 public class HostComponentDesiredStateDAO {
 public class HostComponentDesiredStateDAO {
   @Inject
   @Inject
   Provider<EntityManager> entityManagerProvider;
   Provider<EntityManager> entityManagerProvider;

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostComponentStateDAO.java

@@ -20,12 +20,14 @@ package org.apache.ambari.server.orm.dao;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.orm.entities.HostComponentStateEntity;
 import org.apache.ambari.server.orm.entities.HostComponentStateEntity;
 import org.apache.ambari.server.orm.entities.HostComponentStateEntityPK;
 import org.apache.ambari.server.orm.entities.HostComponentStateEntityPK;
 
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManager;
 
 
+@Singleton
 public class HostComponentStateDAO {
 public class HostComponentStateDAO {
   @Inject
   @Inject
   Provider<EntityManager> entityManagerProvider;
   Provider<EntityManager> entityManagerProvider;

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostConfigMappingDAO.java

@@ -22,6 +22,7 @@ import java.util.*;
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManager;
 import javax.persistence.TypedQuery;
 import javax.persistence.TypedQuery;
 
 
+import com.google.inject.Singleton;
 import org.apache.ambari.server.orm.entities.HostConfigMappingEntity;
 import org.apache.ambari.server.orm.entities.HostConfigMappingEntity;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
@@ -31,6 +32,7 @@ import com.google.inject.persist.Transactional;
 /**
 /**
  * Used for host configuration mapping operations.
  * Used for host configuration mapping operations.
  */
  */
+@Singleton
 public class HostConfigMappingDAO {
 public class HostConfigMappingDAO {
   @Inject
   @Inject
   Provider<EntityManager> entityManagerProvider;
   Provider<EntityManager> entityManagerProvider;

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostDAO.java

@@ -20,6 +20,7 @@ package org.apache.ambari.server.orm.dao;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.orm.entities.HostEntity;
 import org.apache.ambari.server.orm.entities.HostEntity;
 import org.apache.ambari.server.orm.entities.StageEntity;
 import org.apache.ambari.server.orm.entities.StageEntity;
@@ -30,6 +31,7 @@ import javax.persistence.TypedQuery;
 import java.util.Collections;
 import java.util.Collections;
 import java.util.List;
 import java.util.List;
 
 
+@Singleton
 public class HostDAO {
 public class HostDAO {
 
 
   @Inject
   @Inject

+ 29 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java

@@ -20,6 +20,7 @@ package org.apache.ambari.server.orm.dao;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.Role;
 import org.apache.ambari.server.Role;
 import org.apache.ambari.server.actionmanager.HostRoleStatus;
 import org.apache.ambari.server.actionmanager.HostRoleStatus;
@@ -36,6 +37,7 @@ import javax.persistence.TypedQuery;
 import java.util.Collection;
 import java.util.Collection;
 import java.util.List;
 import java.util.List;
 
 
+@Singleton
 public class HostRoleCommandDAO {
 public class HostRoleCommandDAO {
 
 
   @Inject
   @Inject
@@ -68,6 +70,15 @@ public class HostRoleCommandDAO {
     return daoUtils.selectList(query, requestIds);
     return daoUtils.selectList(query, requestIds);
   }
   }
 
 
+  @Transactional
+  public List<Long> findTaskIdsByRequestIds(Collection<Long> requestIds) {
+    TypedQuery<Long> query = entityManagerProvider.get().createQuery(
+        "SELECT task.taskId FROM HostRoleCommandEntity task " +
+            "WHERE task.requestId IN ?1 " +
+            "ORDER BY task.taskId", Long.class);
+    return daoUtils.selectList(query, requestIds);
+  }
+
   @Transactional
   @Transactional
   public List<HostRoleCommandEntity> findByRequestAndTaskIds(Collection<Long> requestIds, Collection<Long> taskIds) {
   public List<HostRoleCommandEntity> findByRequestAndTaskIds(Collection<Long> requestIds, Collection<Long> taskIds) {
     TypedQuery<HostRoleCommandEntity> query = entityManagerProvider.get().createQuery(
     TypedQuery<HostRoleCommandEntity> query = entityManagerProvider.get().createQuery(
@@ -78,6 +89,16 @@ public class HostRoleCommandDAO {
     return daoUtils.selectList(query, requestIds, taskIds);
     return daoUtils.selectList(query, requestIds, taskIds);
   }
   }
 
 
+  @Transactional
+  public List<Long> findTaskIdsByRequestAndTaskIds(Collection<Long> requestIds, Collection<Long> taskIds) {
+    TypedQuery<Long> query = entityManagerProvider.get().createQuery(
+        "SELECT DISTINCT task.taskId FROM HostRoleCommandEntity task " +
+            "WHERE task.requestId IN ?1 AND task.taskId IN ?2 " +
+            "ORDER BY task.taskId", Long.class
+    );
+    return daoUtils.selectList(query, requestIds, taskIds);
+  }
+
   @Transactional
   @Transactional
   public List<HostRoleCommandEntity> findSortedCommandsByStageAndHost(StageEntity stageEntity, HostEntity hostEntity) {
   public List<HostRoleCommandEntity> findSortedCommandsByStageAndHost(StageEntity stageEntity, HostEntity hostEntity) {
     TypedQuery<HostRoleCommandEntity> query = entityManagerProvider.get().createQuery("SELECT hostRoleCommand " +
     TypedQuery<HostRoleCommandEntity> query = entityManagerProvider.get().createQuery("SELECT hostRoleCommand " +
@@ -127,6 +148,14 @@ public class HostRoleCommandDAO {
         "WHERE command.requestId=?1 ORDER BY command.taskId", HostRoleCommandEntity.class);
         "WHERE command.requestId=?1 ORDER BY command.taskId", HostRoleCommandEntity.class);
     return daoUtils.selectList(query, requestId);
     return daoUtils.selectList(query, requestId);
   }
   }
+  
+  @Transactional
+  public List<Long> findTaskIdsByRequest(long requestId) {
+    TypedQuery<Long> query = entityManagerProvider.get().createQuery("SELECT command.taskId " +
+        "FROM HostRoleCommandEntity command " +
+        "WHERE command.requestId=?1 ORDER BY command.taskId", Long.class);
+    return daoUtils.selectList(query, requestId);
+  }
 
 
   @Transactional
   @Transactional
   public void create(HostRoleCommandEntity stageEntity) {
   public void create(HostRoleCommandEntity stageEntity) {

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostStateDAO.java

@@ -20,11 +20,13 @@ package org.apache.ambari.server.orm.dao;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.orm.entities.HostStateEntity;
 import org.apache.ambari.server.orm.entities.HostStateEntity;
 
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManager;
 
 
+@Singleton
 public class HostStateDAO {
 public class HostStateDAO {
   @Inject
   @Inject
   Provider<EntityManager> entityManagerProvider;
   Provider<EntityManager> entityManagerProvider;

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/KeyValueDAO.java

@@ -20,6 +20,7 @@ package org.apache.ambari.server.orm.dao;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.orm.entities.KeyValueEntity;
 import org.apache.ambari.server.orm.entities.KeyValueEntity;
 
 
@@ -27,6 +28,7 @@ import javax.persistence.EntityManager;
 import javax.persistence.TypedQuery;
 import javax.persistence.TypedQuery;
 import java.util.Collection;
 import java.util.Collection;
 
 
+@Singleton
 public class KeyValueDAO {
 public class KeyValueDAO {
 
 
   @Inject
   @Inject

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/MetainfoDAO.java

@@ -20,6 +20,7 @@ package org.apache.ambari.server.orm.dao;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.orm.entities.MetainfoEntity;
 import org.apache.ambari.server.orm.entities.MetainfoEntity;
 
 
@@ -27,6 +28,7 @@ import javax.persistence.EntityManager;
 import javax.persistence.TypedQuery;
 import javax.persistence.TypedQuery;
 import java.util.Collection;
 import java.util.Collection;
 
 
+@Singleton
 public class MetainfoDAO {
 public class MetainfoDAO {
 
 
   @Inject
   @Inject

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/RoleDAO.java

@@ -19,11 +19,13 @@ package org.apache.ambari.server.orm.dao;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.orm.entities.RoleEntity;
 import org.apache.ambari.server.orm.entities.RoleEntity;
 
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManager;
 
 
+@Singleton
 public class RoleDAO {
 public class RoleDAO {
 
 
   @Inject
   @Inject

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/RoleSuccessCriteriaDAO.java

@@ -20,12 +20,14 @@ package org.apache.ambari.server.orm.dao;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.orm.entities.RoleSuccessCriteriaEntity;
 import org.apache.ambari.server.orm.entities.RoleSuccessCriteriaEntity;
 import org.apache.ambari.server.orm.entities.RoleSuccessCriteriaEntityPK;
 import org.apache.ambari.server.orm.entities.RoleSuccessCriteriaEntityPK;
 
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManager;
 
 
+@Singleton
 public class RoleSuccessCriteriaDAO {
 public class RoleSuccessCriteriaDAO {
 
 
   @Inject
   @Inject

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceComponentDesiredStateDAO.java

@@ -20,12 +20,14 @@ package org.apache.ambari.server.orm.dao;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntityPK;
 import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntityPK;
 import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity;
 
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManager;
 
 
+@Singleton
 public class ServiceComponentDesiredStateDAO {
 public class ServiceComponentDesiredStateDAO {
   @Inject
   @Inject
   Provider<EntityManager> entityManagerProvider;
   Provider<EntityManager> entityManagerProvider;

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceConfigMappingDAO.java

@@ -19,6 +19,7 @@ package org.apache.ambari.server.orm.dao;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.orm.entities.ServiceConfigMappingEntity;
 import org.apache.ambari.server.orm.entities.ServiceConfigMappingEntity;
 
 
@@ -28,6 +29,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Collections;
 import java.util.List;
 import java.util.List;
 
 
+@Singleton
 public class ServiceConfigMappingDAO {
 public class ServiceConfigMappingDAO {
   @Inject
   @Inject
   Provider<EntityManager> entityManagerProvider;
   Provider<EntityManager> entityManagerProvider;

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceDesiredStateDAO.java

@@ -20,12 +20,14 @@ package org.apache.ambari.server.orm.dao;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.orm.entities.ServiceDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.ServiceDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.ServiceDesiredStateEntityPK;
 import org.apache.ambari.server.orm.entities.ServiceDesiredStateEntityPK;
 
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManager;
 
 
+@Singleton
 public class ServiceDesiredStateDAO {
 public class ServiceDesiredStateDAO {
   @Inject
   @Inject
   Provider<EntityManager> entityManagerProvider;
   Provider<EntityManager> entityManagerProvider;

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/StageDAO.java

@@ -20,6 +20,7 @@ package org.apache.ambari.server.orm.dao;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.actionmanager.HostRoleStatus;
 import org.apache.ambari.server.actionmanager.HostRoleStatus;
 import org.apache.ambari.server.orm.entities.StageEntity;
 import org.apache.ambari.server.orm.entities.StageEntity;
@@ -32,6 +33,7 @@ import java.util.List;
 import java.util.Collection;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Map;
 
 
+@Singleton
 public class StageDAO {
 public class StageDAO {
 
 
   @Inject
   @Inject

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/UserDAO.java

@@ -19,6 +19,7 @@ package org.apache.ambari.server.orm.dao;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.orm.entities.UserEntity;
 import org.apache.ambari.server.orm.entities.UserEntity;
 
 
@@ -27,6 +28,7 @@ import javax.persistence.NoResultException;
 import javax.persistence.TypedQuery;
 import javax.persistence.TypedQuery;
 import java.util.List;
 import java.util.List;
 
 
+@Singleton
 public class UserDAO {
 public class UserDAO {
 
 
   @Inject
   @Inject

+ 1 - 2
ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java

@@ -30,7 +30,6 @@ import static org.apache.commons.lang.StringUtils.defaultString;
 
 
 @Table(name = "host_role_command")
 @Table(name = "host_role_command")
 @Entity
 @Entity
-@Cacheable(false)
 @TableGenerator(name = "host_role_command_id_generator",
 @TableGenerator(name = "host_role_command_id_generator",
     table = "ambari_sequences", pkColumnName = "sequence_name", valueColumnName = "value"
     table = "ambari_sequences", pkColumnName = "sequence_name", valueColumnName = "value"
     , pkColumnValue = "host_role_command_id_seq"
     , pkColumnValue = "host_role_command_id_seq"
@@ -100,7 +99,7 @@ public class HostRoleCommandEntity {
   @Enumerated(EnumType.STRING)
   @Enumerated(EnumType.STRING)
   private RoleCommand roleCommand;
   private RoleCommand roleCommand;
 
 
-  @OneToOne(mappedBy = "hostRoleCommand", cascade = CascadeType.REMOVE)
+  @OneToOne(mappedBy = "hostRoleCommand", cascade = CascadeType.REMOVE, fetch = FetchType.LAZY)
   private ExecutionCommandEntity executionCommand;
   private ExecutionCommandEntity executionCommand;
 
 
   @ManyToOne(cascade = {CascadeType.MERGE})
   @ManyToOne(cascade = {CascadeType.MERGE})

+ 2 - 1
ambari-server/src/main/resources/META-INF/persistence.xml

@@ -42,8 +42,9 @@
     <properties>
     <properties>
       <!--<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/ambari" />-->
       <!--<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/ambari" />-->
       <!--<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />-->
       <!--<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />-->
-      <property name="eclipselink.cache.size.default" value="3000" />
+      <property name="eclipselink.cache.size.default" value="10000" />
       <property name="eclipselink.jdbc.batch-writing" value="JDBC"/>
       <property name="eclipselink.jdbc.batch-writing" value="JDBC"/>
+      <property name="eclipselink.weaving" value="static" />
     </properties>
     </properties>
   </persistence-unit>
   </persistence-unit>