Repository: ambari
Updated Branches:
  refs/heads/trunk 8c278eab0 -> 8ccb1d330


AMBARI-16185. Express Ugrade stuck on getting status on 1600 node cluster 
(ncole)


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

Branch: refs/heads/trunk
Commit: 8ccb1d3300c10be3ee6f267485712aaeb02cbe5f
Parents: 8c278ea
Author: Nate Cole <[email protected]>
Authored: Fri Apr 29 15:27:20 2016 -0400
Committer: Nate Cole <[email protected]>
Committed: Sat Apr 30 11:05:08 2016 -0400

----------------------------------------------------------------------
 .../internal/StageResourceProvider.java         | 36 ++++++++++++++++----
 .../ambari/server/topology/TopologyManager.java |  6 ++--
 .../internal/StageResourceProviderTest.java     | 36 +++++++++++++++++++-
 3 files changed, 69 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/8ccb1d33/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StageResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StageResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StageResourceProvider.java
index d3cb96c..59dd9d9 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StageResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StageResourceProvider.java
@@ -30,7 +30,6 @@ import java.util.Set;
 import javax.inject.Inject;
 import javax.inject.Provider;
 
-import com.google.common.collect.Sets;
 import org.apache.ambari.server.StaticallyInject;
 import org.apache.ambari.server.actionmanager.HostRoleStatus;
 import org.apache.ambari.server.controller.AmbariManagementController;
@@ -45,15 +44,20 @@ import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
+import org.apache.ambari.server.controller.utilities.PredicateHelper;
 import org.apache.ambari.server.orm.dao.HostRoleCommandDAO;
 import org.apache.ambari.server.orm.dao.HostRoleCommandStatusSummaryDTO;
 import org.apache.ambari.server.orm.dao.StageDAO;
 import org.apache.ambari.server.orm.entities.StageEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.topology.LogicalRequest;
 import org.apache.ambari.server.topology.TopologyManager;
 import org.apache.ambari.server.utils.SecretReference;
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.math.NumberUtils;
+
+import com.google.common.collect.Sets;
 
 /**
  * ResourceProvider for Stage
@@ -217,11 +221,31 @@ public class StageResourceProvider extends 
AbstractControllerResourceProvider im
 
     cache.clear();
 
-    Collection<StageEntity> topologyManagerStages = 
topologyManager.getStages();
-    for (StageEntity entity : topologyManagerStages) {
-      Resource stageResource = toResource(entity, propertyIds);
-      if (predicate.evaluate(stageResource)) {
-        results.add(stageResource);
+    // !!! check the id passed to see if it's a LogicalRequest.  This 
safeguards against
+    // iterating all stages for all requests.  That is a problem when the 
request
+    // is for an Upgrade, but was pulling the data anyway.
+    Map<String, Object> map = PredicateHelper.getProperties(predicate);
+
+    if (map.containsKey(STAGE_REQUEST_ID)) {
+      Long requestId = 
NumberUtils.toLong(map.get(STAGE_REQUEST_ID).toString());
+      LogicalRequest lr = topologyManager.getRequest(requestId);
+
+      if (null != lr) {
+        Collection<StageEntity> topologyManagerStages = lr.getStageEntities();
+        for (StageEntity entity : topologyManagerStages) {
+          Resource stageResource = toResource(entity, propertyIds);
+          if (predicate.evaluate(stageResource)) {
+            results.add(stageResource);
+          }
+        }
+      }
+    } else {
+      Collection<StageEntity> topologyManagerStages = 
topologyManager.getStages();
+      for (StageEntity entity : topologyManagerStages) {
+        Resource stageResource = toResource(entity, propertyIds);
+        if (predicate.evaluate(stageResource)) {
+          results.add(stageResource);
+        }
       }
     }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/8ccb1d33/ambari-server/src/main/java/org/apache/ambari/server/topology/TopologyManager.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/TopologyManager.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/TopologyManager.java
index b5d8d5e..e74a5f2 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/TopologyManager.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/TopologyManager.java
@@ -411,8 +411,10 @@ public class TopologyManager {
     }
   }
 
-  // currently we are just returning all stages for all requests
-  //and relying on the StageResourceProvider to convert each to a resource and 
do a predicate eval on each
+  /**
+   * Currently we are just returning all stages for all requests
+   * and relying on the StageResourceProvider to convert each to a resource 
and do a predicate eval on each.
+   */
   public Collection<StageEntity> getStages() {
     ensureInitialized();
     Collection<StageEntity> stages = new ArrayList<StageEntity>();

http://git-wip-us.apache.org/repos/asf/ambari/blob/8ccb1d33/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StageResourceProviderTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StageResourceProviderTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StageResourceProviderTest.java
index 2c187a9..38d72e1 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StageResourceProviderTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StageResourceProviderTest.java
@@ -22,6 +22,7 @@ import static org.easymock.EasyMock.createNiceMock;
 import static org.easymock.EasyMock.createStrictMock;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
 import static org.easymock.EasyMock.verify;
 import static org.junit.Assert.fail;
 
@@ -84,7 +85,7 @@ public class StageResourceProviderTest {
     hrcDao = createStrictMock(HostRoleCommandDAO.class);
     topologyManager = EasyMock.createNiceMock(TopologyManager.class);
 
-    expect(topologyManager.getStages()).andReturn(new 
ArrayList<StageEntity>()).anyTimes();
+    expect(topologyManager.getStages()).andReturn(new 
ArrayList<StageEntity>()).atLeastOnce();
 
     
expect(hrcDao.findAggregateCounts(EasyMock.anyObject(Long.class))).andReturn(
         new HashMap<Long, HostRoleCommandStatusSummaryDTO>() {
@@ -174,6 +175,39 @@ public class StageResourceProviderTest {
     verify(dao, clusters, cluster);
   }
 
+  @Test
+  public void testGetResourcesWithRequest() throws Exception {
+    StageResourceProvider provider = new 
StageResourceProvider(managementController);
+
+    Request request = createNiceMock(Request.class);
+    Predicate predicate = new 
PredicateBuilder().property(StageResourceProvider.STAGE_REQUEST_ID).equals(1L).toPredicate();
+
+    List<StageEntity> entities = getStageEntities(HostRoleStatus.COMPLETED);
+
+    expect(dao.findAll(request, predicate)).andReturn(entities);
+
+    expect(clusters.getClusterById(anyLong())).andReturn(cluster).anyTimes();
+    expect(cluster.getClusterName()).andReturn("c1").anyTimes();
+    reset(topologyManager);
+    
expect(topologyManager.getRequest(EasyMock.anyLong())).andReturn(null).atLeastOnce();
+
+    replay(topologyManager, dao, clusters, cluster, request);
+
+    Set<Resource> resources = provider.getResources(request, predicate);
+
+    Assert.assertEquals(1, resources.size());
+
+    Resource resource = resources.iterator().next();
+
+    Assert.assertEquals(100.0, 
resource.getPropertyValue(StageResourceProvider.STAGE_PROGRESS_PERCENT));
+    Assert.assertEquals(HostRoleStatus.COMPLETED, 
resource.getPropertyValue(StageResourceProvider.STAGE_STATUS));
+    Assert.assertEquals(HostRoleStatus.COMPLETED, 
resource.getPropertyValue(StageResourceProvider.STAGE_DISPLAY_STATUS));
+    Assert.assertEquals(1000L, 
resource.getPropertyValue(StageResourceProvider.STAGE_START_TIME));
+    Assert.assertEquals(2500L, 
resource.getPropertyValue(StageResourceProvider.STAGE_END_TIME));
+
+    verify(topologyManager, dao, clusters, cluster);
+  }
+
   /**
    * Tests getting the display status of a stage which can differ from the 
final
    * status.

Reply via email to