You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ds...@apache.org on 2016/03/14 19:44:56 UTC

ambari git commit: AMBARI-15397 Rolling Upgrade: incorrect display_status of upgrade groups (dsen)

Repository: ambari
Updated Branches:
  refs/heads/trunk cbd88027a -> b9d06931a


AMBARI-15397 Rolling Upgrade: incorrect display_status of upgrade groups (dsen)


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

Branch: refs/heads/trunk
Commit: b9d06931abf989eb8c6715ff9a4cc4c3f4f25ece
Parents: cbd8802
Author: Dmytro Sen <ds...@apache.org>
Authored: Mon Mar 14 20:42:10 2016 +0200
Committer: Dmytro Sen <ds...@apache.org>
Committed: Mon Mar 14 20:42:27 2016 +0200

----------------------------------------------------------------------
 .../controller/internal/CalculatedStatus.java   | 41 +++++++--------
 .../internal/CalculatedStatusTest.java          | 55 +++++++++++++++++++-
 2 files changed, 74 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/b9d06931/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 a722bc1..1d8df9b 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
@@ -300,10 +300,10 @@ public class CalculatedStatus {
   public static CalculatedStatus statusFromStageSummary(Map<Long, HostRoleCommandStatusSummaryDTO> stageDto,
       Set<Long> stageIds) {
 
-    Collection<HostRoleStatus> stageStatuses = new HashSet<HostRoleStatus>();
-    Collection<HostRoleStatus> taskStatuses = new ArrayList<HostRoleStatus>();
+    Collection<HostRoleStatus> stageStatuses = new HashSet<>();
+    Collection<HostRoleStatus> stageDisplayStatuses = new HashSet<>();
+    Collection<HostRoleStatus> taskStatuses = new ArrayList<>();
 
-    HostRoleStatus displayStatus = null;
 
     for (Long stageId : stageIds) {
       if (!stageDto.containsKey(stageId)) {
@@ -315,20 +315,20 @@ public class CalculatedStatus {
       int total = summary.getTaskTotal();
       boolean skip = summary.isStageSkippable();
       Map<HostRoleStatus, Integer> counts = calculateStatusCounts(summary.getTaskStatuses());
-
       HostRoleStatus stageStatus = calculateSummaryStatus(counts, total, skip);
-      if (null == displayStatus) {
-        displayStatus = stageStatus;
-      }
-
-      displayStatus = calculateDisplayStatus(counts, displayStatus);
+      HostRoleStatus stageDisplayStatus = calculateSummaryDisplayStatus(counts, total, skip);
 
       stageStatuses.add(stageStatus);
+      stageDisplayStatuses.add(stageDisplayStatus);
       taskStatuses.addAll(summary.getTaskStatuses());
     }
 
     // calculate the overall status from the stage statuses
-    HostRoleStatus status = calculateSummaryStatus(calculateStatusCounts(stageStatuses), stageStatuses.size(), false);
+    Map<HostRoleStatus, Integer> counts = calculateStatusCounts(stageStatuses);
+    Map<HostRoleStatus, Integer> displayCounts = calculateStatusCounts(stageDisplayStatuses);
+
+    HostRoleStatus status = calculateSummaryStatus(counts, stageStatuses.size(), false);
+    HostRoleStatus displayStatus = calculateSummaryDisplayStatus(displayCounts, stageDisplayStatuses.size(), false);
 
     double progressPercent = calculateProgressPercent(calculateStatusCounts(taskStatuses), taskStatuses.size());
 
@@ -391,19 +391,18 @@ public class CalculatedStatus {
   }
 
   /**
-   * Calculate a display status for upgrade group. Since we iterate over all
-   * tasks in all stages that belong to group, we have to pass a previous status
-   * from previous stages, so the most severe status is selected
+   * Calculate an overall display status based on the given status counts.
    *
-   * @param counters
-   *          counts of resources that are in various states
-   * @param previousStatus
-   *          previous status (from previous stages)
+   * @param counters   counts of resources that are in various states
+   * @param total      total number of resources in request
+   * @param skippable  true if a single failed status should NOT result in an overall failed status return
    *
-   * @return display status based on statuses of tasks in different states.
+   * @return summary request status based on statuses of tasks in different states.
    */
-  private static HostRoleStatus calculateDisplayStatus(Map<HostRoleStatus, Integer> counters, HostRoleStatus previousStatus) {
-    return previousStatus != null && previousStatus.equals(HostRoleStatus.SKIPPED_FAILED) || counters.get(HostRoleStatus.SKIPPED_FAILED) > 0 ? HostRoleStatus.SKIPPED_FAILED :
-           previousStatus != null && previousStatus.equals(HostRoleStatus.FAILED) || counters.get(HostRoleStatus.FAILED) > 0 ? HostRoleStatus.FAILED : previousStatus;
+  private static HostRoleStatus calculateSummaryDisplayStatus(Map<HostRoleStatus, Integer> counters,
+                                                              int total, boolean skippable) {
+    return counters.get(HostRoleStatus.SKIPPED_FAILED) > 0 ? HostRoleStatus.SKIPPED_FAILED :
+           counters.get(HostRoleStatus.FAILED) > 0 ? HostRoleStatus.FAILED:
+           calculateSummaryStatus(counters, total, skippable);
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/b9d06931/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/CalculatedStatusTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/CalculatedStatusTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/CalculatedStatusTest.java
index 22f43c2..8d80fa6 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/CalculatedStatusTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/CalculatedStatusTest.java
@@ -563,6 +563,59 @@ public class CalculatedStatusTest {
     assertEquals(HostRoleStatus.COMPLETED, calc.getStatus());
   }
 
+  /**
+   * Tests that upgrade group will correctly show status according to all stages.
+   *
+   * Example:
+   *
+   * If first stage have status COMPLETED and second IN_PROGRESS, overall group status should be IN_PROGRESS
+   *
+   * @throws Exception
+   */
+  @Test
+  public void testSummaryStatus_UpgradeGroup() throws Exception {
+
+    final HostRoleCommandStatusSummaryDTO summary1 = createNiceMock(HostRoleCommandStatusSummaryDTO.class);
+    ArrayList<HostRoleStatus> taskStatuses1 = new ArrayList<HostRoleStatus>() {{
+      add(HostRoleStatus.COMPLETED);
+      add(HostRoleStatus.COMPLETED);
+      add(HostRoleStatus.COMPLETED);
+    }};
+
+    final HostRoleCommandStatusSummaryDTO summary2 = createNiceMock(HostRoleCommandStatusSummaryDTO.class);
+    ArrayList<HostRoleStatus> taskStatuses2 = new ArrayList<HostRoleStatus>() {{
+      add(HostRoleStatus.IN_PROGRESS);
+      add(HostRoleStatus.COMPLETED);
+      add(HostRoleStatus.COMPLETED);
+    }};
+
+    Map<Long, HostRoleCommandStatusSummaryDTO> stageDto = new HashMap<Long, HostRoleCommandStatusSummaryDTO>(){{
+      put(1l, summary1);
+      put(2l, summary2);
+    }};
+
+    Set<Long> stageIds = new HashSet<Long>() {{
+      add(1l);
+      add(2l);
+    }};
+
+    expect(summary1.getTaskTotal()).andReturn(taskStatuses1.size()).anyTimes();
+    expect(summary2.getTaskTotal()).andReturn(taskStatuses2.size()).anyTimes();
+
+    expect(summary1.isStageSkippable()).andReturn(true).anyTimes();
+    expect(summary2.isStageSkippable()).andReturn(true).anyTimes();
+
+    expect(summary1.getTaskStatuses()).andReturn(taskStatuses1).anyTimes();
+    expect(summary2.getTaskStatuses()).andReturn(taskStatuses2).anyTimes();
+
+    replay(summary1, summary2);
+
+    CalculatedStatus calc = CalculatedStatus.statusFromStageSummary(stageDto, stageIds);
+
+    assertEquals(HostRoleStatus.IN_PROGRESS, calc.getDisplayStatus());
+    assertEquals(HostRoleStatus.IN_PROGRESS, calc.getStatus());
+  }
+
   private Collection<HostRoleCommandEntity> getTaskEntities(HostRoleStatus... statuses) {
     Collection<HostRoleCommandEntity> entities = new LinkedList<HostRoleCommandEntity>();
 
@@ -639,4 +692,4 @@ public class CalculatedStatusTest {
       return hrc;
     }
   }
-}
\ No newline at end of file
+}