You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by sw...@apache.org on 2013/04/11 01:04:32 UTC

svn commit: r1466726 - in /incubator/ambari/trunk: ./ ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ ambari-server/src/main/java/org/apache/ambari/server/controller/ ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ amb...

Author: swagle
Date: Wed Apr 10 23:04:32 2013
New Revision: 1466726

URL: http://svn.apache.org/r1466726
Log:
AMBARI-1867. Processing API requests takes too long. (swagle)

Modified:
    incubator/ambari/trunk/CHANGES.txt
    incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessor.java
    incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java
    incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBInMemoryImpl.java
    incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionManager.java
    incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
    incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/DaoUtils.java
    incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
    incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/StageDAO.java
    incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java

Modified: incubator/ambari/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/CHANGES.txt?rev=1466726&r1=1466725&r2=1466726&view=diff
==============================================================================
--- incubator/ambari/trunk/CHANGES.txt (original)
+++ incubator/ambari/trunk/CHANGES.txt Wed Apr 10 23:04:32 2013
@@ -679,6 +679,8 @@ Trunk (unreleased changes):
 
  BUG FIXES
 
+ AMBARI-1867. Processing API requests takes too long. (swagle)
+
  AMBARI-1856. Queries for metrics to populate the dashboard graphs don't work
  with updated Ganglia. (tbeerbower)
 

Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessor.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessor.java?rev=1466726&r1=1466725&r2=1466726&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessor.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessor.java Wed Apr 10 23:04:32 2013
@@ -19,6 +19,7 @@ package org.apache.ambari.server.actionm
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import org.apache.ambari.server.Role;
@@ -79,4 +80,8 @@ public interface ActionDBAccessor {
   public HostRoleCommand getTask(long taskId);
 
   public List<Long> getRequestsByStatus(RequestStatus status);
+
+  public Map<Long, String> getRequestContext(List<Long> requestIds);
+
+  public String getRequestContext(long requestId);
 }

Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java?rev=1466726&r1=1466725&r2=1466726&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java Wed Apr 10 23:04:32 2013
@@ -341,4 +341,14 @@ public class ActionDBAccessorImpl implem
     }
     return hostRoleCommandDAO.getRequestsByTaskStatus(statuses, match, checkAllTasks);
   }
+
+  @Override
+  public Map<Long, String> getRequestContext(List<Long> requestIds) {
+    return stageDAO.findRequestContext(requestIds);
+  }
+
+  @Override
+  public String getRequestContext(long requestId) {
+    return stageDAO.findRequestContext(requestId);
+  }
 }

Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBInMemoryImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBInMemoryImpl.java?rev=1466726&r1=1466725&r2=1466726&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBInMemoryImpl.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBInMemoryImpl.java Wed Apr 10 23:04:32 2013
@@ -204,4 +204,22 @@ public class ActionDBInMemoryImpl implem
     // TODO
     throw new RuntimeException("Functionality not implemented");
   }
+
+  @Override
+  public Map<Long, String> getRequestContext(List<Long> requestIds) {
+    Map<Long, String> result = new HashMap<Long, String>();
+    for (Long requestId : requestIds) {
+      List<Stage> stages = getAllStages(requestId);
+      result.put(requestId, stages != null && !stages.isEmpty() ? stages.get
+        (0).getRequestContext() : "");
+    }
+    return result;
+  }
+
+  @Override
+  public String getRequestContext(long requestId) {
+    List<Stage> stages = getAllStages(requestId);
+    return stages != null && !stages.isEmpty() ? stages.get(0)
+      .getRequestContext() : "";
+  }
 }

Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionManager.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionManager.java?rev=1466726&r1=1466725&r2=1466726&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionManager.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionManager.java Wed Apr 10 23:04:32 2013
@@ -31,6 +31,7 @@ import org.slf4j.LoggerFactory;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -179,4 +180,11 @@ public class ActionManager {
     return db.getRequestsByStatus(status);
   }
 
+  public Map<Long, String> getRequestContext(List<Long> requestIds) {
+    return db.getRequestContext(requestIds);
+  }
+
+  public String getRequestContext(long requestId) {
+    return db.getRequestContext(requestId);
+  }
 }

Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java?rev=1466726&r1=1466725&r2=1466726&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java Wed Apr 10 23:04:32 2013
@@ -31,6 +31,7 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.TreeMap;
 
+import com.google.inject.persist.Transactional;
 import com.google.gson.Gson;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
@@ -3586,16 +3587,35 @@ public class AmbariManagementControllerI
     return Collections.emptySet();
   }
 
+  @Transactional
+  Collection<RequestStatusResponse> getRequestStatusResponses(List<Long> requestIds) {
+    List<HostRoleCommand> hostRoleCommands = actionManager.getAllTasksByRequestIds(requestIds);
+    Map<Long, String> requestContexts = actionManager.getRequestContext(requestIds);
+    Map<Long, RequestStatusResponse> responseMap = new HashMap<Long, RequestStatusResponse>();
+
+    for (HostRoleCommand hostRoleCommand : hostRoleCommands) {
+      Long requestId = hostRoleCommand.getRequestId();
+      RequestStatusResponse response = responseMap.get(requestId);
+      if (response == null) {
+        response = new RequestStatusResponse(requestId);
+        response.setRequestContext(requestContexts.get(requestId));
+        response.setTasks(new ArrayList<ShortTaskStatus>());
+        responseMap.put(requestId, response);
+      }
+
+      response.getTasks().add(new ShortTaskStatus(hostRoleCommand));
+    }
+
+    return responseMap.values();
+  }
+
+
   private RequestStatusResponse getRequestStatusResponse(long requestId) {
     RequestStatusResponse response = new RequestStatusResponse(requestId);
     List<HostRoleCommand> hostRoleCommands =
         actionManager.getRequestTasks(requestId);
 
-    List<Stage> listStages = actionManager.getActions(requestId);
-    if (listStages != null && !listStages.isEmpty()) {
-      //todo: may not be necessary to check list size.
-      response.setRequestContext(listStages.get(0).getRequestContext());
-    }
+    response.setRequestContext(actionManager.getRequestContext(requestId));
     List<ShortTaskStatus> tasks = new ArrayList<ShortTaskStatus>();
 
     for (HostRoleCommand hostRoleCommand : hostRoleCommands) {
@@ -3621,9 +3641,8 @@ public class AmbariManagementControllerI
             + ", requestStatus=" + requestStatus);
       }
       List<Long> requestIds = actionManager.getRequestsByStatus(requestStatus);
-      for (Long requestId : requestIds) {
-        response.add(getRequestStatusResponse(requestId.longValue()));
-      }
+      response.addAll(getRequestStatusResponses(requestIds));
+
     } else {
       RequestStatusResponse requestStatusResponse = getRequestStatusResponse(
           request.getRequestId().longValue());

Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/DaoUtils.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/DaoUtils.java?rev=1466726&r1=1466725&r2=1466726&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/DaoUtils.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/DaoUtils.java Wed Apr 10 23:04:32 2013
@@ -47,6 +47,15 @@ class DaoUtils {
     }
   }
 
+  public <T> T selectOne(TypedQuery<T> query, Object... parameters) {
+    setParameters(query, parameters);
+    try {
+      return query.setMaxResults(1).getSingleResult();
+    } catch (NoResultException ignored) {
+      return null;
+    }
+  }
+
   public int executeUpdate(Query query, Object... parameters) {
     setParameters(query, parameters);
     return query.executeUpdate();

Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java?rev=1466726&r1=1466725&r2=1466726&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java Wed Apr 10 23:04:32 2013
@@ -43,6 +43,8 @@ public class HostRoleCommandDAO {
   @Inject
   DaoUtils daoUtils;
   private static Logger LOG = LoggerFactory.getLogger(HostRoleCommandDAO.class);
+  private static final int REQUESTS_RESULT_LIMIT_WITH_FILTER =  20;
+  private static final int REQUESTS_RESULT_LIMIT = 200;
 
   @Transactional
   public HostRoleCommandEntity findByPK(long taskId) {
@@ -173,8 +175,11 @@ public class HostRoleCommandDAO {
         }
         queryStr.append("IN ?1 ");
       }
-      resultsLimit = 20;
+      resultsLimit = REQUESTS_RESULT_LIMIT_WITH_FILTER;
+    } else {
+      resultsLimit = REQUESTS_RESULT_LIMIT;
     }
+
     queryStr.append("ORDER BY command.requestId DESC");
     TypedQuery<Long> query = entityManagerProvider.get().createQuery(queryStr.toString(),
         Long.class);

Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/StageDAO.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/StageDAO.java?rev=1466726&r1=1466725&r2=1466726&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/StageDAO.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/StageDAO.java Wed Apr 10 23:04:32 2013
@@ -25,11 +25,12 @@ import org.apache.ambari.server.actionma
 import org.apache.ambari.server.orm.entities.StageEntity;
 import org.apache.ambari.server.orm.entities.StageEntityPK;
 import org.apache.ambari.server.utils.StageUtils;
-
 import javax.persistence.EntityManager;
 import javax.persistence.TypedQuery;
-import java.util.Collection;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Collection;
+import java.util.Map;
 
 public class StageDAO {
 
@@ -105,4 +106,33 @@ public class StageDAO {
     remove(findByPK(stageEntityPK));
   }
 
+  @Transactional
+  public Map<Long, String> findRequestContext(List<Long> requestIds) {
+    Map<Long, String> resultMap = new HashMap<Long, String>();
+    if (requestIds != null && !requestIds.isEmpty()) {
+      TypedQuery<StageEntity> query = entityManagerProvider.get()
+        .createQuery("SELECT stage FROM StageEntity stage WHERE " +
+          "stage.requestId IN (SELECT DISTINCT s.requestId FROM StageEntity s " +
+          "WHERE s.requestId IN ?1)", StageEntity.class);
+      List<StageEntity> result = daoUtils.selectList(query, requestIds);
+      if (result != null && !result.isEmpty()) {
+        for (StageEntity entity : result) {
+          resultMap.put(entity.getRequestId(), entity.getRequestContext());
+        }
+      }
+    }
+    return resultMap;
+  }
+
+  @Transactional
+  public String findRequestContext(long requestId) {
+    TypedQuery<String> query = entityManagerProvider.get().createQuery(
+      "SELECT stage.requestContext " + "FROM StageEntity stage " +
+        "WHERE stage.requestId=?1", String.class);
+    String result =  daoUtils.selectOne(query, requestId);
+    if (result != null)
+      return result;
+    else
+      return ""; // Since it is defined as empty string in the StageEntity
+  }
 }

Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java?rev=1466726&r1=1466725&r2=1466726&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java Wed Apr 10 23:04:32 2013
@@ -30,7 +30,6 @@ import static org.apache.commons.lang.St
 
 @Table(name = "host_role_command")
 @Entity
-@Cacheable(false)
 @TableGenerator(name = "host_role_command_id_generator",
     table = "ambari_sequences", pkColumnName = "sequence_name", valueColumnName = "value"
     , pkColumnValue = "host_role_command_id_seq"