Repository: ambari Updated Branches: refs/heads/trunk a74bc730f -> 4fb40440b
AMBARI-12688. HDFS check fails after move NameNode on NN HA cluster. (Oliver Szabo via rnettleton) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/4fb40440 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/4fb40440 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/4fb40440 Branch: refs/heads/trunk Commit: 4fb40440b77e2c5302d386fff2092a6d1fa6ff3b Parents: a74bc73 Author: Bob Nettleton <rnettle...@hortonworks.com> Authored: Tue Dec 1 17:35:42 2015 -0500 Committer: Bob Nettleton <rnettle...@hortonworks.com> Committed: Tue Dec 1 17:35:58 2015 -0500 ---------------------------------------------------------------------- .../apache/ambari/server/utils/StageUtils.java | 30 +++++++++++++++++--- .../ambari/server/utils/StageUtilsTest.java | 11 +++++++ 2 files changed, 37 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/4fb40440/ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java b/ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java index e51cfb2..30843a4 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java @@ -351,6 +351,8 @@ public class StageUtils { } // add components from topology manager + + Map<String, SortedSet<Integer>> hostRolesInfoFromTopology = new HashMap<String, SortedSet<Integer>>(); for (Map.Entry<String, Collection<String>> entry : pendingHostComponents.entrySet()) { String hostname = entry.getKey(); Collection<String> hostComponents = entry.getValue(); @@ -374,11 +376,11 @@ public class StageUtils { } if (roleName != null) { - SortedSet<Integer> hostsForComponentsHost = hostRolesInfo.get(roleName); + SortedSet<Integer> hostsForComponentsHost = hostRolesInfoFromTopology.get(roleName); if (hostsForComponentsHost == null) { hostsForComponentsHost = new TreeSet<Integer>(); - hostRolesInfo.put(roleName, hostsForComponentsHost); + hostRolesInfoFromTopology.put(roleName, hostsForComponentsHost); } int hostIndex = hostsList.indexOf(hostname); @@ -396,6 +398,13 @@ public class StageUtils { } } + // merge host roles + for (Map.Entry<String, SortedSet<Integer>> entry : hostRolesInfoFromTopology.entrySet()) { + if (isOverrideHostRoleNeeded(entry, hostRolesInfo, allHosts, pendingHostComponents)) { + hostRolesInfo.put(entry.getKey(), entry.getValue()); + } + } + Map<String, Set<String>> clusterHostInfo = new HashMap<String, Set<String>>(); for (Map.Entry<String, SortedSet<Integer>> entry : hostRolesInfo.entrySet()) { @@ -541,6 +550,10 @@ public class StageUtils { return result; } + public static String getHostName() { + return server_hostname; + } + /** * Splits a range to its explicit set of values. * <p/> @@ -578,7 +591,16 @@ public class StageUtils { return rangeItem; } - public static String getHostName() { - return server_hostname; + /** + * It determines to replace host roles if the number of components lower in the cluster than in the blueprint + * or when all of the hosts are not available from {@link Cluster} object. + */ + private static boolean isOverrideHostRoleNeeded(Entry<String, SortedSet<Integer>> hostRoleEntry, + Map<String, SortedSet<Integer>> hostRolesInfo, + Collection<Host> allHosts, + Map<String, Collection<String>> pendingHostComponents) { + Set<Integer> hostRole = hostRolesInfo.get(hostRoleEntry.getKey()); + return (allHosts.size() != pendingHostComponents.size() || (hostRole == null || + (!hostRole.isEmpty() && hostRole.size() < hostRoleEntry.getValue().size()))); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/4fb40440/ambari-server/src/test/java/org/apache/ambari/server/utils/StageUtilsTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/utils/StageUtilsTest.java b/ambari-server/src/test/java/org/apache/ambari/server/utils/StageUtilsTest.java index c78648d..e1c47b9 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/utils/StageUtilsTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/utils/StageUtilsTest.java @@ -17,8 +17,10 @@ */ package org.apache.ambari.server.utils; +import com.google.common.base.Predicate; import com.google.common.collect.ContiguousSet; import com.google.common.collect.DiscreteDomain; +import com.google.common.collect.Maps; import com.google.common.collect.Range; import com.google.gson.Gson; import com.google.inject.AbstractModule; @@ -446,6 +448,12 @@ public class StageUtilsTest extends EasyMockSupport { return hbrsServiceComponentHosts.get((String) args[0]); } }).anyTimes(); + Map<String, ServiceComponentHost> hbrsHosts = Maps.filterKeys(hbrsServiceComponentHosts, new Predicate<String>() { + @Override + public boolean apply(String s) { + return s.equals("h1"); + } + }); expect(hbrsComponent.getServiceComponentHosts()).andReturn(hbrsServiceComponentHosts).anyTimes(); expect(hbrsComponent.isClientComponent()).andReturn(false).anyTimes(); @@ -586,6 +594,9 @@ public class StageUtilsTest extends EasyMockSupport { assertEquals(1, serverHost.size()); assertEquals(StageUtils.getHostName(), serverHost.iterator().next()); + // check host role replacing by the projected topology + assertTrue(getDecompressedSet(info.get("hbase_rs_hosts")).contains(9)); + // Validate substitutions... info = StageUtils.substituteHostIndexes(info);