Przeglądaj źródła

AMBARI-9481. RU: overall upgrade process is 100% before upgrade is done (ncole)

Nate Cole 10 lat temu
rodzic
commit
318bf835a3

+ 7 - 6
ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleCommand.java

@@ -17,9 +17,6 @@
  */
 package org.apache.ambari.server.actionmanager;
 
-import com.google.inject.Injector;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
 import org.apache.ambari.server.Role;
 import org.apache.ambari.server.RoleCommand;
 import org.apache.ambari.server.orm.dao.ExecutionCommandDAO;
@@ -27,6 +24,10 @@ import org.apache.ambari.server.orm.entities.ExecutionCommandEntity;
 import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
 import org.apache.ambari.server.state.ServiceComponentHostEvent;
 
+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
  * particular role which action manager needs. It doesn't capture actual
@@ -295,7 +296,7 @@ public class HostRoleCommand {
 
   @Override
   public int hashCode() {
-    return (hostName + role.toString() + roleCommand.toString()).hashCode();
+    return Long.valueOf(taskId).hashCode();
   }
 
   @Override
@@ -304,8 +305,8 @@ public class HostRoleCommand {
       return false;
     }
     HostRoleCommand o = (HostRoleCommand) other;
-    return (this.role.equals(o.role) && this.hostName.equals(o.hostName) && this.roleCommand
-        .equals(o.roleCommand));
+
+    return hashCode() == o.hashCode();
   }
 
   @Override

+ 7 - 0
ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleStatus.java

@@ -124,4 +124,11 @@ public enum HostRoleStatus {
   public static List<HostRoleStatus> getFailedStates() {
     return Collections.unmodifiableList(FAILED_STATES);
   }
+
+  /**
+   * @return {@code true} if this is a status that is in progress
+   */
+  public boolean isInProgress() {
+    return IN_PROGRESS_STATUSES.contains(this);
+  }
 }

+ 7 - 7
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CalculatedStatus.java

@@ -17,18 +17,18 @@
  */
 package org.apache.ambari.server.controller.internal;
 
-import org.apache.ambari.server.actionmanager.HostRoleCommand;
-import org.apache.ambari.server.actionmanager.HostRoleStatus;
-import org.apache.ambari.server.actionmanager.Stage;
-import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
-import org.apache.ambari.server.orm.entities.StageEntity;
-
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.Map;
 
+import org.apache.ambari.server.actionmanager.HostRoleCommand;
+import org.apache.ambari.server.actionmanager.HostRoleStatus;
+import org.apache.ambari.server.actionmanager.Stage;
+import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
+import org.apache.ambari.server.orm.entities.StageEntity;
+
 /**
  * Status of a request resource, calculated from a set of tasks or stages.
  */
@@ -218,7 +218,7 @@ public class CalculatedStatus {
    *
    * @return a map of counts of tasks keyed by the task status
    */
-  private static Map<HostRoleStatus, Integer> calculateTaskEntityStatusCounts(Collection<HostRoleCommandEntity> tasks) {
+  public static Map<HostRoleStatus, Integer> calculateTaskEntityStatusCounts(Collection<HostRoleCommandEntity> tasks) {
     Collection<HostRoleStatus> hostRoleStatuses = new LinkedList<HostRoleStatus>();
 
     for (HostRoleCommandEntity hostRoleCommand : tasks) {

+ 37 - 2
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeGroupResourceProvider.java

@@ -17,14 +17,17 @@
  */
 package org.apache.ambari.server.controller.internal;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 
 import org.apache.ambari.server.StaticallyInject;
+import org.apache.ambari.server.actionmanager.HostRoleStatus;
 import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
 import org.apache.ambari.server.controller.spi.NoSuchResourceException;
@@ -37,6 +40,8 @@ import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.orm.dao.StageDAO;
 import org.apache.ambari.server.orm.dao.UpgradeDAO;
+import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
+import org.apache.ambari.server.orm.entities.StageEntity;
 import org.apache.ambari.server.orm.entities.UpgradeEntity;
 import org.apache.ambari.server.orm.entities.UpgradeGroupEntity;
 import org.apache.ambari.server.orm.entities.UpgradeItemEntity;
@@ -57,6 +62,11 @@ public class UpgradeGroupResourceProvider extends AbstractControllerResourceProv
   protected static final String UPGRADE_GROUP_PROGRESS_PERCENT = "UpgradeGroup/progress_percent";
   protected static final String UPGRADE_GROUP_STATUS = "UpgradeGroup/status";
 
+  protected static final String UPGRADE_GROUP_TOTAL_TASKS = "UpgradeGroup/total_task_count";
+  protected static final String UPGRADE_GROUP_IN_PROGRESS_TASKS = "UpgradeGroup/in_progress_task_count";
+  protected static final String UPGRADE_GROUP_COMPLETED_TASKS = "UpgradeGroup/completed_task_count";
+
+
   private static final Set<String> PK_PROPERTY_IDS = new HashSet<String>(
       Arrays.asList(UPGRADE_REQUEST_ID, UPGRADE_GROUP_ID));
   private static final Set<String> PROPERTY_IDS = new HashSet<String>();
@@ -80,6 +90,9 @@ public class UpgradeGroupResourceProvider extends AbstractControllerResourceProv
     PROPERTY_IDS.add(UPGRADE_GROUP_TITLE);
     PROPERTY_IDS.add(UPGRADE_GROUP_PROGRESS_PERCENT);
     PROPERTY_IDS.add(UPGRADE_GROUP_STATUS);
+    PROPERTY_IDS.add(UPGRADE_GROUP_TOTAL_TASKS);
+    PROPERTY_IDS.add(UPGRADE_GROUP_IN_PROGRESS_TASKS);
+    PROPERTY_IDS.add(UPGRADE_GROUP_COMPLETED_TASKS);
 
     // keys
     KEY_PROPERTY_IDS.put(Resource.Type.UpgradeGroup, UPGRADE_GROUP_ID);
@@ -176,15 +189,37 @@ public class UpgradeGroupResourceProvider extends AbstractControllerResourceProv
   }
 
   /**
-   * Aggregates status and percent complete for stages and puts the results on the upgrade group
+   * Aggregates status, percent complete, and count information for stages and
+   * puts the results on the upgrade group
    *
    * @param upgradeGroup  the resource representing an upgrade group
    * @param stageIds      the set of resources ids of the stages
    * @param requestedIds  the ids for the request
    */
   private void aggregate(Resource upgradeGroup, Long requestId, Set<Long> stageIds, Set<String> requestedIds) {
+    List<StageEntity> stages = stageDAO.findByStageIds(requestId, stageIds);
+
+    List<HostRoleCommandEntity> tasks = new ArrayList<HostRoleCommandEntity>();
+    for (StageEntity stage : stages) {
+      tasks.addAll(stage.getHostRoleCommands());
+    }
+
+    Map<HostRoleStatus, Integer> counts = CalculatedStatus.calculateTaskEntityStatusCounts(tasks);
+    Integer inProgress = 0;
+    Integer completed = 0;
+
+    for (Entry<HostRoleStatus, Integer> entry : counts.entrySet()) {
+      if (entry.getKey().isCompletedState()) {
+        completed += entry.getValue();
+      } else if (entry.getKey().isInProgress()) {
+        inProgress += entry.getValue();
+      }
+    }
+    setResourceProperty(upgradeGroup, UPGRADE_GROUP_TOTAL_TASKS, tasks.size(), requestedIds);
+    setResourceProperty(upgradeGroup, UPGRADE_GROUP_IN_PROGRESS_TASKS, inProgress, requestedIds);
+    setResourceProperty(upgradeGroup, UPGRADE_GROUP_COMPLETED_TASKS, completed, requestedIds);
 
-    CalculatedStatus status = CalculatedStatus.statusFromStageEntities(stageDAO.findByStageIds(requestId, stageIds));
+    CalculatedStatus status = CalculatedStatus.statusFromStageEntities(stages);
 
     setResourceProperty(upgradeGroup, UPGRADE_GROUP_STATUS, status.getStatus(), requestedIds);
     setResourceProperty(upgradeGroup, UPGRADE_GROUP_PROGRESS_PERCENT, status.getPercent(), requestedIds);

+ 52 - 31
ambari-server/src/test/java/org/apache/ambari/server/controller/internal/CalculatedStatusTest.java

@@ -17,6 +17,16 @@
  */
 package org.apache.ambari.server.controller.internal;
 
+import static org.junit.Assert.assertEquals;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.ambari.server.Role;
 import org.apache.ambari.server.RoleCommand;
 import org.apache.ambari.server.actionmanager.HostRoleCommand;
@@ -24,15 +34,9 @@ import org.apache.ambari.server.actionmanager.HostRoleStatus;
 import org.apache.ambari.server.actionmanager.Stage;
 import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
 import org.apache.ambari.server.orm.entities.StageEntity;
+import org.junit.Before;
 import org.junit.Test;
 
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import static org.junit.Assert.*;
-
 /**
  * CalculatedStatus tests.
  */
@@ -42,6 +46,14 @@ public class CalculatedStatusTest {
   private static long taskId = 0L;
   private static long stageId = 0L;
 
+  private static Field s_field;
+
+  @Before()
+  public void setup() throws Exception {
+    s_field = HostRoleCommand.class.getDeclaredField("taskId");
+    s_field.setAccessible(true);
+  }
+
 
   @Test
   public void testGetStatus() throws Exception {
@@ -419,12 +431,36 @@ public class CalculatedStatusTest {
     assertEquals(1L, (long) counts.get(HostRoleStatus.ABORTED));
   }
 
+  @Test
+  public void testCountsWithRepeatHosts() throws Exception {
+    List<Stage> stages = new ArrayList<Stage>();
+
+      stages.addAll(getStages(getTaskEntities(
+          HostRoleStatus.COMPLETED, HostRoleStatus.COMPLETED,
+          HostRoleStatus.COMPLETED, HostRoleStatus.COMPLETED)));
+
+    // create 5th stage that is a repeat of an earlier one
+    HostRoleCommandEntity entity = new HostRoleCommandEntity();
+    entity.setTaskId(taskId++);
+    entity.setHostName("h2");
+    entity.setStatus(HostRoleStatus.PENDING);
+    stages.addAll(getStages(Collections.singleton(entity)));
+
+    CalculatedStatus calc = CalculatedStatus.statusFromStages(stages);
+
+    assertEquals(HostRoleStatus.IN_PROGRESS, calc.getStatus());
+    assertEquals(80d, calc.getPercent(), 0.1d);
+  }
+
+
   private Collection<HostRoleCommandEntity> getTaskEntities(HostRoleStatus... statuses) {
     Collection<HostRoleCommandEntity> entities = new LinkedList<HostRoleCommandEntity>();
 
-    for (HostRoleStatus status : statuses) {
+    for (int i = 0; i < statuses.length; i++) {
+      HostRoleStatus status = statuses[i];
       HostRoleCommandEntity entity = new HostRoleCommandEntity();
       entity.setTaskId(taskId++);
+      entity.setHostName("h" + i);
       entity.setStatus(status);
 
       entities.add(entity);
@@ -470,7 +506,7 @@ public class CalculatedStatusTest {
 
     void setHostRoleCommands(Collection<HostRoleCommandEntity> tasks) {
       for (HostRoleCommandEntity task : tasks) {
-        TestCommand command = new TestCommand(taskId++);
+        TestCommand command = new TestCommand(task.getHostName(), taskId++);
         command.setStatus(task.getStatus());
         hostRoleCommands.add(command);
       }
@@ -483,30 +519,15 @@ public class CalculatedStatusTest {
   }
 
   private class TestCommand extends HostRoleCommand {
-    private final long taskId;
-
-    public TestCommand(long taskId) {
-      super("", Role.AMBARI_SERVER_ACTION, null, RoleCommand.START);
-      this.taskId = taskId;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      if (this == o) return true;
-      if (o == null || getClass() != o.getClass()) return false;
-      if (!super.equals(o)) return false;
-
-      TestCommand that = (TestCommand) o;
-
-      return taskId == that.taskId;
 
+    public TestCommand(String host, long taskId) {
+      super(host, Role.AMBARI_SERVER_ACTION, null, RoleCommand.START);
+      try {
+        s_field.set(this, Long.valueOf(taskId));
+      } catch (Exception e) {
+        e.printStackTrace();
+      }
     }
 
-    @Override
-    public int hashCode() {
-      int result = super.hashCode();
-      result = 31 * result + (int) (taskId ^ (taskId >>> 32));
-      return result;
-    }
   }
 }

+ 3 - 0
ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java

@@ -307,6 +307,9 @@ public class UpgradeResourceProviderTest {
     res = resources.iterator().next();
     assertNotNull(res.getPropertyValue("UpgradeGroup/status"));
     assertNotNull(res.getPropertyValue("UpgradeGroup/group_id"));
+    assertNotNull(res.getPropertyValue("UpgradeGroup/total_task_count"));
+    assertNotNull(res.getPropertyValue("UpgradeGroup/in_progress_task_count"));
+    assertNotNull(res.getPropertyValue("UpgradeGroup/completed_task_count"));
 
     // upgrade items
     propertyIds.clear();