You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2015/03/09 18:49:24 UTC
ambari git commit: AMBARI-9984. RU: Inconsistent upgrade item
statuses (ncole)
Repository: ambari
Updated Branches:
refs/heads/trunk 59e6b48b5 -> a0910f7f6
AMBARI-9984. RU: Inconsistent upgrade item statuses (ncole)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/a0910f7f
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/a0910f7f
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/a0910f7f
Branch: refs/heads/trunk
Commit: a0910f7f6cb2394adb8daf8e434f40a7eb155515
Parents: 59e6b48
Author: Nate Cole <nc...@hortonworks.com>
Authored: Mon Mar 9 10:59:51 2015 -0400
Committer: Nate Cole <nc...@hortonworks.com>
Committed: Mon Mar 9 13:20:36 2015 -0400
----------------------------------------------------------------------
.../controller/internal/CalculatedStatus.java | 8 +-
.../server/orm/dao/HostRoleCommandDAO.java | 2 +-
.../orm/entities/HostRoleCommandEntity.java | 2 +-
.../ambari/server/orm/dao/RequestDAOTest.java | 151 ++++++++++++++++++-
4 files changed, 151 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/a0910f7f/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CalculatedStatus.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CalculatedStatus.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CalculatedStatus.java
index 99c0a76..9a9bc8a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CalculatedStatus.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CalculatedStatus.java
@@ -281,8 +281,12 @@ public class CalculatedStatus {
}
HostRoleCommandStatusSummaryDTO summary = stageDto.get(stageId);
- HostRoleStatus stageStatus = calculateSummaryStatus(summary.getCounts(),
- summary.getTaskTotal(), summary.isStageSkippable());
+
+ int total = summary.getTaskTotal();
+ boolean skip = summary.isStageSkippable();
+ Map<HostRoleStatus, Integer> counts = calculateStatusCounts(summary.getTaskStatuses());
+
+ HostRoleStatus stageStatus = calculateSummaryStatus(counts, total, skip);
stageStatuses.add(stageStatus);
http://git-wip-us.apache.org/repos/asf/ambari/blob/a0910f7f/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
index c5d447a..f9d21ad 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
@@ -48,9 +48,9 @@ public class HostRoleCommandDAO {
private static final String SUMMARY_DTO = String.format(
"SELECT NEW %s(" +
+ "MAX(hrc.stage.skippable), " +
"MIN(hrc.startTime), " +
"MAX(hrc.endTime), " +
- "MIN(hrc.stage.skippable), " +
"hrc.stageId, " +
"SUM(CASE WHEN hrc.status = :aborted THEN 1 ELSE 0 END), " +
"SUM(CASE WHEN hrc.status = :completed THEN 1 ELSE 0 END), " +
http://git-wip-us.apache.org/repos/asf/ambari/blob/a0910f7f/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java
index 6ab5aac..c9877fb 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java
@@ -160,7 +160,7 @@ public class HostRoleCommandEntity {
@JoinColumns({@JoinColumn(name = "request_id", referencedColumnName = "request_id", nullable = false), @JoinColumn(name = "stage_id", referencedColumnName = "stage_id", nullable = false)})
private StageEntity stage;
- @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
+ @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH})
@JoinColumn(name = "host_name", referencedColumnName = "host_name", nullable = false)
private HostEntity host;
http://git-wip-us.apache.org/repos/asf/ambari/blob/a0910f7f/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/RequestDAOTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/RequestDAOTest.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/RequestDAOTest.java
index ffdcd6e..bae6fd5 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/RequestDAOTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/RequestDAOTest.java
@@ -17,14 +17,28 @@
*/
package org.apache.ambari.server.orm.dao;
+import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.Role;
+import org.apache.ambari.server.RoleCommand;
+import org.apache.ambari.server.actionmanager.HostRoleStatus;
+import org.apache.ambari.server.controller.internal.CalculatedStatus;
import org.apache.ambari.server.orm.GuiceJpaInitializer;
import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
+import org.apache.ambari.server.orm.OrmTestHelper;
+import org.apache.ambari.server.orm.entities.ClusterEntity;
+import org.apache.ambari.server.orm.entities.HostEntity;
+import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
import org.apache.ambari.server.orm.entities.RequestEntity;
+import org.apache.ambari.server.orm.entities.ResourceEntity;
+import org.apache.ambari.server.orm.entities.ResourceTypeEntity;
+import org.apache.ambari.server.orm.entities.StageEntity;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
@@ -40,14 +54,22 @@ import com.google.inject.persist.PersistService;
public class RequestDAOTest {
private Injector injector;
private ClusterDAO clusterDAO;
-
-
+ StageDAO stageDAO;
+ HostRoleCommandDAO hostRoleCommandDAO;
+ HostDAO hostDAO;
+ RequestDAO requestDAO;
+
@Before
public void setup() throws Exception {
injector = Guice.createInjector(new InMemoryDefaultTestModule());
injector.getInstance(GuiceJpaInitializer.class);
clusterDAO = injector.getInstance(ClusterDAO.class);
+ stageDAO = injector.getInstance(StageDAO.class);
+ hostRoleCommandDAO = injector.getInstance(HostRoleCommandDAO.class);
+ hostDAO = injector.getInstance(HostDAO.class);
+ requestDAO = injector.getInstance(RequestDAO.class);
+
}
@After
@@ -55,17 +77,130 @@ public class RequestDAOTest {
injector.getInstance(PersistService.class).stop();
}
-
+
@Test
public void testFindAll() throws Exception {
RequestDAO dao = injector.getInstance(RequestDAO.class);
-
+
Set<Long> set = Collections.emptySet();
-
+
List<RequestEntity> list = dao.findByPks(set);
-
+
Assert.assertEquals(0, list.size());
-
}
-
+
+
+ @Test
+ public void testCalculatedStatus() throws Exception {
+ createGraph();
+
+ RequestEntity requestEntity = requestDAO.findByPK(100L);
+
+ // !!! accepted value
+ CalculatedStatus calc1 = CalculatedStatus.statusFromStageEntities(
+ requestEntity.getStages());
+
+ // !!! aggregated value
+ Map<Long, HostRoleCommandStatusSummaryDTO> map = hostRoleCommandDAO.findAggregateCounts(100L);
+ CalculatedStatus calc2 = CalculatedStatus.statusFromStageSummary(map,
+ map.keySet());
+
+ Assert.assertEquals(HostRoleStatus.IN_PROGRESS, calc1.getStatus());
+ Assert.assertEquals(calc1.getStatus(), calc2.getStatus());
+ Assert.assertEquals(calc1.getPercent(), calc2.getPercent(), 0.01d);
+
+ // !!! simulate an upgrade group
+ Set<Long> group = new HashSet<Long>();
+ group.add(2L);
+ group.add(3L);
+ group.add(4L);
+
+ // !!! accepted
+ List<StageEntity> stages = stageDAO.findByStageIds(requestEntity.getRequestId(), group);
+ CalculatedStatus calc3 = CalculatedStatus.statusFromStageEntities(stages);
+
+ // !!! aggregated
+ CalculatedStatus calc4 = CalculatedStatus.statusFromStageSummary(map, group);
+
+ Assert.assertEquals(100d, calc3.getPercent(), 0.01d);
+ Assert.assertEquals(HostRoleStatus.COMPLETED, calc3.getStatus());
+ Assert.assertEquals(calc3.getPercent(), calc4.getPercent(), 0.01d);
+ Assert.assertEquals(calc3.getStatus(), calc4.getStatus());
+ }
+
+ private void createGraph() {
+ OrmTestHelper helper = injector.getInstance(OrmTestHelper.class);
+ helper.createDefaultData();
+
+
+ Long requestId = Long.valueOf(100L);
+ String hostName = "test_host1";
+
+ ResourceTypeEntity resourceTypeEntity = new ResourceTypeEntity();
+ resourceTypeEntity.setId(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE);
+ resourceTypeEntity.setName(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE_NAME);
+
+ ResourceEntity resourceEntity = new ResourceEntity();
+ resourceEntity.setResourceType(resourceTypeEntity);
+
+ ClusterEntity clusterEntity = clusterDAO.findByName("test_cluster1");
+
+ RequestEntity requestEntity = new RequestEntity();
+ requestEntity.setRequestId(requestId);
+ requestEntity.setClusterId(clusterEntity.getClusterId());
+ requestEntity.setStages(new ArrayList<StageEntity>());
+ requestDAO.create(requestEntity);
+
+ HostEntity host = hostDAO.findByName(hostName);
+ host.setHostRoleCommandEntities(new ArrayList<HostRoleCommandEntity>());
+
+ long stageId = 1L;
+
+ stageId = createStages(stageId, 3, host, requestEntity, HostRoleStatus.COMPLETED, false);
+ stageId = createStages(stageId, 1, host, requestEntity, HostRoleStatus.FAILED, true);
+ stageId = createStages(stageId, 1, host, requestEntity, HostRoleStatus.IN_PROGRESS, false);
+ stageId = createStages(stageId, 3, host, requestEntity, HostRoleStatus.PENDING, false);
+
+ requestDAO.merge(requestEntity);
+ }
+
+ private long createStages(long startStageId, int count,
+ HostEntity he, RequestEntity re, HostRoleStatus status, boolean skipStage) {
+ long stageId = startStageId;
+
+ ClusterEntity clusterEntity = clusterDAO.findByName("test_cluster1");
+
+ for (int i = 0; i < count; i++) {
+ StageEntity stageEntity = new StageEntity();
+ stageEntity.setClusterId(clusterEntity.getClusterId());
+ stageEntity.setRequest(re);
+ stageEntity.setStageId(stageId);
+ stageEntity.setHostRoleCommands(new ArrayList<HostRoleCommandEntity>());
+ stageEntity.setSkippable(skipStage);
+ stageDAO.create(stageEntity);
+
+ re.getStages().add(stageEntity);
+
+ HostRoleCommandEntity commandEntity = new HostRoleCommandEntity();
+ commandEntity.setRequestId(re.getRequestId());
+ commandEntity.setStageId(stageId);
+ commandEntity.setRoleCommand(RoleCommand.INSTALL);
+ commandEntity.setStatus(status);
+ commandEntity.setRole(Role.DATANODE);
+ commandEntity.setHost(he);
+ commandEntity.setStage(stageEntity);
+ hostRoleCommandDAO.create(commandEntity);
+
+ he.getHostRoleCommandEntities().add(commandEntity);
+ he = hostDAO.merge(he);
+
+ stageEntity.getHostRoleCommands().add(commandEntity);
+ stageDAO.merge(stageEntity);
+
+ stageId++;
+ }
+
+ return stageId;
+ }
+
}