Repository: ambari Updated Branches: refs/heads/branch-2.6 16c0beb1c -> 8217f4c1d
AMBARI-21967. Exception was thrown while starting Patch Rolling/Express Upgrade when upgrade failure tolerance option is selected (ncole) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/8217f4c1 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/8217f4c1 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/8217f4c1 Branch: refs/heads/branch-2.6 Commit: 8217f4c1dda8476c917435de81ee39275faa60d9 Parents: 16c0beb Author: Nate Cole <[email protected]> Authored: Fri Sep 15 09:11:31 2017 -0400 Committer: Nate Cole <[email protected]> Committed: Fri Sep 15 09:11:31 2017 -0400 ---------------------------------------------------------------------- .../ambari/server/state/UpgradeHelper.java | 25 ++++++++--- .../ambari/server/state/UpgradeHelperTest.java | 44 ++++++++++++++++++++ 2 files changed, 64 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/8217f4c1/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java index e6ca728..9aa9e31 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java @@ -563,15 +563,29 @@ public class UpgradeHelper { LinkedHashSet<StageWrapper> priority = new LinkedHashSet<>(); LinkedHashSet<StageWrapper> others = new LinkedHashSet<>(); + Set<String> extraKeys = new HashSet<>(); + LinkedHashSet<StageWrapper> extras = new LinkedHashSet<>(); + for (List<StageWrapper> holderItems : new List[] { oldHolder.items, newHolder.items }) { for (StageWrapper stageWrapper : holderItems) { - ServiceCheckStageWrapper wrapper = (ServiceCheckStageWrapper) stageWrapper; - - if (wrapper.priority) { - priority.add(stageWrapper); + if (stageWrapper instanceof ServiceCheckStageWrapper) { + ServiceCheckStageWrapper wrapper = (ServiceCheckStageWrapper) stageWrapper; + if (wrapper.priority) { + priority.add(stageWrapper); + } else { + others.add(stageWrapper); + } } else { - others.add(stageWrapper); + // !!! It's a good chance that back-to-back service check groups are adding the + // same non-service-check wrappers. + // this should be "equal enough" to prevent them from duplicating on merge + String key = stageWrapper.toString(); + if (!extraKeys.contains(key)) { + extras.add(stageWrapper); + extraKeys.add(key); + } } + } } @@ -580,6 +594,7 @@ public class UpgradeHelper { oldHolder.items = Lists.newLinkedList(priority); oldHolder.items.addAll(others); + oldHolder.items.addAll(extras); } /** http://git-wip-us.apache.org/repos/asf/ambari/blob/8217f4c1/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java index 5dfbc53..ac9be66 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java @@ -2536,6 +2536,50 @@ public class UpgradeHelperTest extends EasyMockSupport { } @Test + public void testSequentialServiceChecksWithServiceCheckFailure() throws Exception { + Map<String, UpgradePack> upgrades = ambariMetaInfo.getUpgradePacks("HDP", "2.1.1"); + assertTrue(upgrades.containsKey("upgrade_test_checks")); + UpgradePack upgrade = upgrades.get("upgrade_test_checks"); + assertNotNull(upgrade); + + // !!! fake skippable so we don't affect other tests + for (Grouping g : upgrade.getAllGroups()) { + if (g.name.equals("SERVICE_CHECK_1") || g.name.equals("SERVICE_CHECK_2")) { + g.skippable = true; + } + } + + Cluster cluster = makeCluster(); + cluster.deleteService("HDFS"); + cluster.deleteService("YARN"); + + UpgradeContext context = getMockUpgradeContext(cluster, Direction.UPGRADE, UpgradeType.ROLLING, repositoryVersion2110, + RepositoryType.STANDARD, cluster.getServices().keySet(), m_masterHostResolver, false); + expect(context.isServiceCheckFailureAutoSkipped()).andReturn(Boolean.TRUE).atLeastOnce(); + + replay(context); + + List<UpgradeGroupHolder> groups = m_upgradeHelper.createSequence(upgrade, context); + assertEquals(5, groups.size()); + + UpgradeGroupHolder serviceCheckGroup = groups.get(2); + assertEquals(ServiceCheckGrouping.class, serviceCheckGroup.groupClass); + assertEquals(4, serviceCheckGroup.items.size()); + + StageWrapper wrapper = serviceCheckGroup.items.get(0); + assertEquals(ServiceCheckGrouping.ServiceCheckStageWrapper.class, wrapper.getClass()); + assertTrue(wrapper.getText().contains("ZooKeeper")); + + wrapper = serviceCheckGroup.items.get(serviceCheckGroup.items.size()-1); + assertTrue(wrapper.getText().equals("Verifying Skipped Failures")); + + // Do stacks cleanup + stackManagerMock.invalidateCurrentPaths(); + ambariMetaInfo.init(); + } + + + @Test public void testPrematureServiceChecks() throws Exception { Map<String, UpgradePack> upgrades = ambariMetaInfo.getUpgradePacks("HDP", "2.1.1"); assertTrue(upgrades.containsKey("upgrade_test_checks"));
