You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jl...@apache.org on 2015/11/05 19:29:40 UTC
ambari git commit: AMBARI-13730: Express Upgrade: Add max degree of
parallelism to control number of tasks run in parallel (jluniya)
Repository: ambari
Updated Branches:
refs/heads/trunk b3a562c63 -> 625e4ff29
AMBARI-13730: Express Upgrade: Add max degree of parallelism to control number of tasks run in parallel (jluniya)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/625e4ff2
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/625e4ff2
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/625e4ff2
Branch: refs/heads/trunk
Commit: 625e4ff293f36b83a2b03ac9cc48d746f692e4ee
Parents: b3a562c
Author: Jayush Luniya <jl...@hortonworks.com>
Authored: Thu Nov 5 10:28:26 2015 -0800
Committer: Jayush Luniya <jl...@hortonworks.com>
Committed: Thu Nov 5 10:28:26 2015 -0800
----------------------------------------------------------------------
.../ambari/server/state/UpgradeHelper.java | 14 +--
.../state/stack/upgrade/ClusterGrouping.java | 2 +-
.../state/stack/upgrade/ColocatedGrouping.java | 2 +-
.../server/state/stack/upgrade/Grouping.java | 26 +++--
.../state/stack/upgrade/ParallelScheduler.java | 31 ++++++
.../stack/upgrade/ServiceCheckGrouping.java | 2 +-
.../stack/upgrade/StageWrapperBuilder.java | 15 ++-
.../apache/ambari/server/utils/SetUtils.java | 62 ++++++++++++
.../HDP/2.1/upgrades/nonrolling-upgrade-2.3.xml | 12 +++
.../HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml | 17 ++++
.../HDP/2.2/upgrades/nonrolling-upgrade-2.3.xml | 19 +++-
.../HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml | 21 +++-
.../server/state/stack/UpgradePackTest.java | 15 +++
.../stack/upgrade/StageWrapperBuilderTest.java | 2 +-
.../ambari/server/utils/SetUtilsTest.java | 101 +++++++++++++++++++
.../2.1.1/upgrades/upgrade_test_nonrolling.xml | 6 ++
16 files changed, 322 insertions(+), 25 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/625e4ff2/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 360573d..1b59b94 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
@@ -289,7 +289,6 @@ public class UpgradeHelper {
// Attempt to get the function of the group, during a NonRolling Upgrade
Task.Type functionName = null;
- boolean scheduleInParallel = false;
// NonRolling defaults to not performing service checks on a group.
// Of course, a Service Check Group does indeed run them.
if (upgradePack.getType() == UpgradeType.NON_ROLLING) {
@@ -297,15 +296,12 @@ public class UpgradeHelper {
if (RestartGrouping.class.isInstance(group)) {
functionName = ((RestartGrouping) group).getFunction();
- scheduleInParallel = true;
}
if (StartGrouping.class.isInstance(group)) {
functionName = ((StartGrouping) group).getFunction();
- scheduleInParallel = true;
}
if (StopGrouping.class.isInstance(group)) {
functionName = ((StopGrouping) group).getFunction();
- scheduleInParallel = true;
}
}
@@ -410,7 +406,7 @@ public class UpgradeHelper {
hostsType.hosts = order;
builder.add(context, hostsType, service.serviceName,
- svc.isClientOnlyService(), pc, null, false);
+ svc.isClientOnlyService(), pc, null);
}
break;
case NON_ROLLING:
@@ -435,21 +431,21 @@ public class UpgradeHelper {
builder.add(context, ht1, service.serviceName,
- svc.isClientOnlyService(), pc, h1Params, false);
+ svc.isClientOnlyService(), pc, h1Params);
builder.add(context, ht2, service.serviceName,
- svc.isClientOnlyService(), pc, h2Params, false);
+ svc.isClientOnlyService(), pc, h2Params);
} else {
// If no NameNode HA, then don't need to change hostsType.hosts since there should be exactly one.
builder.add(context, hostsType, service.serviceName,
- svc.isClientOnlyService(), pc, null, false);
+ svc.isClientOnlyService(), pc, null);
}
break;
}
} else {
builder.add(context, hostsType, service.serviceName,
- svc.isClientOnlyService(), pc, null, scheduleInParallel);
+ svc.isClientOnlyService(), pc, null);
}
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/625e4ff2/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java
index d3af7ac..f710580 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java
@@ -108,7 +108,7 @@ public class ClusterGrouping extends Grouping {
@Override
public void add(UpgradeContext ctx, HostsType hostsType, String service,
- boolean clientOnly, ProcessingComponent pc, Map<String, String> params, boolean scheduleInParallel) {
+ boolean clientOnly, ProcessingComponent pc, Map<String, String> params) {
// !!! no-op in this case
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/625e4ff2/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ColocatedGrouping.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ColocatedGrouping.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ColocatedGrouping.java
index 8218162..11e9267 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ColocatedGrouping.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ColocatedGrouping.java
@@ -81,7 +81,7 @@ public class ColocatedGrouping extends Grouping {
@Override
public void add(UpgradeContext ctx, HostsType hostsType, String service,
- boolean clientOnly, ProcessingComponent pc, Map<String, String> params, boolean scheduleInParallel) {
+ boolean clientOnly, ProcessingComponent pc, Map<String, String> params) {
boolean forUpgrade = ctx.getDirection().isUpgrade();
http://git-wip-us.apache.org/repos/asf/ambari/blob/625e4ff2/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/Grouping.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/Grouping.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/Grouping.java
index fd54ed8..4ef14a6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/Grouping.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/Grouping.java
@@ -32,6 +32,7 @@ import org.apache.ambari.server.stack.HostsType;
import org.apache.ambari.server.state.UpgradeContext;
import org.apache.ambari.server.state.stack.UpgradePack;
import org.apache.ambari.server.state.stack.UpgradePack.ProcessingComponent;
+import org.apache.ambari.server.utils.SetUtils;
import org.apache.commons.lang.StringUtils;
/**
@@ -61,6 +62,9 @@ public class Grouping {
@XmlElement(name="direction")
public Direction intendedDirection = null;
+ @XmlElement(name="parallel-scheduler")
+ public ParallelScheduler parallelScheduler;
+
/**
* Gets the default builder.
*/
@@ -89,7 +93,7 @@ public class Grouping {
*/
@Override
public void add(UpgradeContext ctx, HostsType hostsType, String service,
- boolean clientOnly, ProcessingComponent pc, Map<String, String> params, boolean scheduleInParallel) {
+ boolean clientOnly, ProcessingComponent pc, Map<String, String> params) {
boolean forUpgrade = ctx.getDirection().isUpgrade();
@@ -112,14 +116,18 @@ public class Grouping {
// Add the processing component
if (null != pc.tasks && 1 == pc.tasks.size()) {
Task t = pc.tasks.get(0);
- if(scheduleInParallel) {
- // Create single stage for all
- StageWrapper stage = new StageWrapper(
- t.getStageWrapperType(),
- getStageText(t.getActionVerb(), ctx.getComponentDisplay(service, pc.name), hostsType.hosts),
- params,
- new TaskWrapper(service, pc.name, hostsType.hosts, params, t));
- m_stages.add(stage);
+ if(m_grouping.parallelScheduler != null) {
+ List<Set<String>> hostSets = SetUtils.split(hostsType.hosts, m_grouping.parallelScheduler.maxDegreeOfParallelism);
+ int batchNum = 1;
+ for(Set<String> hosts : hostSets) {
+ // Create single stage for all
+ StageWrapper stage = new StageWrapper(
+ t.getStageWrapperType(),
+ getStageText(t.getActionVerb(), ctx.getComponentDisplay(service, pc.name), hosts, batchNum++, hostSets.size()),
+ params,
+ new TaskWrapper(service, pc.name, hosts, params, t));
+ m_stages.add(stage);
+ }
} else {
for (String hostName : hostsType.hosts) {
StageWrapper stage = new StageWrapper(
http://git-wip-us.apache.org/repos/asf/ambari/blob/625e4ff2/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ParallelScheduler.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ParallelScheduler.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ParallelScheduler.java
new file mode 100644
index 0000000..6004a12
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ParallelScheduler.java
@@ -0,0 +1,31 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.state.stack.upgrade;
+
+import javax.xml.bind.annotation.XmlElement;
+
+/**
+ * Identifies if component instances should be upgraded in parallel (optional)
+ */
+public class ParallelScheduler {
+
+ public static int DEFAULT_MAX_DEGREE_OF_PARALLELISM = 100;
+
+ @XmlElement(name="max-degree-of-parallelism")
+ public int maxDegreeOfParallelism = DEFAULT_MAX_DEGREE_OF_PARALLELISM;
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/625e4ff2/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ServiceCheckGrouping.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ServiceCheckGrouping.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ServiceCheckGrouping.java
index 7a182e2..5cda422 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ServiceCheckGrouping.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ServiceCheckGrouping.java
@@ -103,7 +103,7 @@ public class ServiceCheckGrouping extends Grouping {
*/
@Override
public void add(UpgradeContext ctx, HostsType hostsType, String service,
- boolean clientOnly, ProcessingComponent pc, Map<String, String> params, boolean scheduleInParallel) {
+ boolean clientOnly, ProcessingComponent pc, Map<String, String> params) {
// !!! nothing to do here
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/625e4ff2/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilder.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilder.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilder.java
index 587ce55..7497c23 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilder.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilder.java
@@ -71,7 +71,7 @@ public abstract class StageWrapperBuilder {
* additional parameters
*/
public abstract void add(UpgradeContext upgradeContext, HostsType hostsType, String service,
- boolean clientOnly, ProcessingComponent pc, Map<String, String> params, boolean scheduleInParallel);
+ boolean clientOnly, ProcessingComponent pc, Map<String, String> params);
/**
* Builds the stage wrappers, including any pre- and post-procesing that needs
@@ -160,6 +160,19 @@ public abstract class StageWrapperBuilder {
return stageWrappers;
}
+ /**
+ * Consistently formats a string.
+ * @param prefix
+ * @param component
+ * @param batchNum
+ * @param totalBatches
+ * @return the prepared string
+ */
+ protected String getStageText(String prefix, String component, Set<String> hosts, int batchNum, int totalBatches) {
+ String stageText = getStageText(prefix, component, hosts);
+ String batchText = 1 == totalBatches? "" : String.format(" ( Batch %s of %s )", batchNum, totalBatches);
+ return stageText + batchText;
+ }
/**
* Consistently formats a string.
http://git-wip-us.apache.org/repos/asf/ambari/blob/625e4ff2/ambari-server/src/main/java/org/apache/ambari/server/utils/SetUtils.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/utils/SetUtils.java b/ambari-server/src/main/java/org/apache/ambari/server/utils/SetUtils.java
new file mode 100644
index 0000000..192647c
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/utils/SetUtils.java
@@ -0,0 +1,62 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.utils;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.Collections;
+
+/**
+ * Static Helper methods for sets
+ */
+public class SetUtils {
+
+ /**
+ * Split a set into subsets
+ * @param original The original set to be split
+ * @param subsetSize Size of the subset (except for final subset)
+ * @param <T> Data type of set elements
+ * @return List of subsets
+ */
+ public static <T> List<Set<T>> split(Set<T> original, int subsetSize) {
+
+ if(subsetSize <= 0) {
+ throw new IllegalArgumentException("Incorrect max size");
+ }
+
+ if(original == null || original.isEmpty()) {
+ return Collections.emptyList();
+ }
+
+ int subsetCount = (int) (Math.ceil((double)original.size() / subsetSize));
+ ArrayList<Set<T>> subsets = new ArrayList<Set<T>>(subsetCount);
+ Iterator<T> iterator = original.iterator();
+
+ for(int i = 0; i < subsetCount; i++) {
+ Set<T> subset = new LinkedHashSet<T>(subsetSize);
+ for(int j = 0; j < subsetSize && iterator.hasNext(); j++) {
+ subset.add(iterator.next());
+ }
+ subsets.add(subset);
+ }
+ return subsets;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/625e4ff2/ambari-server/src/main/resources/stacks/HDP/2.1/upgrades/nonrolling-upgrade-2.3.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.1/upgrades/nonrolling-upgrade-2.3.xml b/ambari-server/src/main/resources/stacks/HDP/2.1/upgrades/nonrolling-upgrade-2.3.xml
index cacaf8d..0f96d03 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.1/upgrades/nonrolling-upgrade-2.3.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.1/upgrades/nonrolling-upgrade-2.3.xml
@@ -58,6 +58,7 @@
<direction>UPGRADE</direction>
<skippable>true</skippable>
<service-check>false</service-check>
+ <parallel-scheduler></parallel-scheduler>
<service name="FLUME">
<component>FLUME_HANDLER</component>
@@ -130,6 +131,7 @@
<direction>UPGRADE</direction>
<skippable>true</skippable>
<service-check>false</service-check>
+ <parallel-scheduler></parallel-scheduler>
<service name="HBASE">
<component>HBASE_REGIONSERVER</component>
@@ -328,6 +330,7 @@
<group xsi:type="restart" name="ZOOKEEPER" title="ZooKeeper">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="ZOOKEEPER">
<service-check>false</service-check>
<component>ZOOKEEPER_SERVER</component>
@@ -338,6 +341,7 @@
<group xsi:type="restart" name="HDFS" title="HDFS">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="HDFS">
<component>JOURNALNODE</component>
<component>ZKFC</component>
@@ -364,6 +368,7 @@
<group xsi:type="restart" name="YARN and MapReduce2" title="YARN and MapReduce2">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="MAPREDUCE2">
<component>HISTORYSERVER</component>
<component>MAPREDUCE2_CLIENT</component>
@@ -379,6 +384,7 @@
<group xsi:type="restart" name="HBASE" title="HBASE">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="HBASE">
<component>HBASE_MASTER</component>
<component>HBASE_REGIONSERVER</component>
@@ -389,6 +395,7 @@
<group xsi:type="restart" name="CLIENTS" title="Tez, Pig, Sqoop Clients">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="TEZ">
<component>TEZ_CLIENT</component>
</service>
@@ -416,6 +423,7 @@
<group xsi:type="restart" name="HIVE" title="Hive">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="HIVE">
<component>HIVE_METASTORE</component>
<component>HIVE_SERVER</component>
@@ -428,6 +436,7 @@
<group xsi:type="restart" name="OOZIE" title="Oozie">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="OOZIE">
<component>OOZIE_SERVER</component>
<component>OOZIE_CLIENT</component>
@@ -437,6 +446,7 @@
<group xsi:type="restart" name="FALCON" title="Falcon">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="FALCON">
<component>FALCON_SERVER</component>
<component>FALCON_CLIENT</component>
@@ -446,6 +456,7 @@
<group xsi:type="restart" name="STORM" title="Storm">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="STORM">
<component>NIMBUS</component>
<component>STORM_REST_API</component>
@@ -464,6 +475,7 @@
<group xsi:type="restart" name="FLUME" title="Flume">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="FLUME">
<component>FLUME_HANDLER</component>
</service>
http://git-wip-us.apache.org/repos/asf/ambari/blob/625e4ff2/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml
index b8477b2..3a518cf 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml
@@ -57,6 +57,7 @@
<direction>UPGRADE</direction>
<skippable>true</skippable>
<service-check>false</service-check>
+ <parallel-scheduler></parallel-scheduler>
<service name="FLUME">
<component>FLUME_HANDLER</component>
@@ -151,6 +152,7 @@
<group xsi:type="stop" name="STOP_LOW_LEVEL_SERVICE_COMPONENTS" title="Stop Components for Core Services">
<direction>UPGRADE</direction>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service-check>false</service-check>
<service name="HBASE">
@@ -235,6 +237,7 @@
<group xsi:type="restart" name="ZOOKEEPER" title="ZooKeeper">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="ZOOKEEPER">
<service-check>false</service-check> <!-- TODO, enable service-check once done testing -->
<component>ZOOKEEPER_SERVER</component>
@@ -245,6 +248,7 @@
<group xsi:type="restart" name="RANGER" title="Ranger">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="RANGER">
<component>RANGER_ADMIN</component>
<component>RANGER_USERSYNC</component>
@@ -254,6 +258,7 @@
<group xsi:type="restart" name="HDFS" title="HDFS">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="HDFS">
<component>JOURNALNODE</component>
<component>ZKFC</component>
@@ -280,6 +285,7 @@
<group xsi:type="restart" name="YARN and MapReduce2" title="YARN and MapReduce2">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="MAPREDUCE2">
<component>HISTORYSERVER</component>
<component>MAPREDUCE2_CLIENT</component> <!-- TODO, parallelize -->
@@ -295,6 +301,7 @@
<group xsi:type="restart" name="HBASE" title="HBASE">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="HBASE">
<component>HBASE_MASTER</component>
<component>HBASE_REGIONSERVER</component> <!-- TODO, parallelize -->
@@ -305,6 +312,7 @@
<group xsi:type="restart" name="CLIENTS" title="Tez, Pig, Sqoop Clients"> <!-- TODO, parallelize -->
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="TEZ">
<component>TEZ_CLIENT</component>
</service>
@@ -333,6 +341,7 @@
<group xsi:type="restart" name="HIVE" title="Hive">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="HIVE">
<component>HIVE_METASTORE</component>
<component>HIVE_SERVER</component>
@@ -345,6 +354,7 @@
<group xsi:type="restart" name="SPARK" title="Spark">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="SPARK">
<component>SPARK_JOBHISTORYSERVER</component>
<component>SPARK_CLIENT</component> <!-- TODO, parallelize -->
@@ -378,6 +388,7 @@
<group xsi:type="restart" name="OOZIE" title="Oozie">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="OOZIE">
<component>OOZIE_SERVER</component>
<component>OOZIE_CLIENT</component> <!-- TODO, parallelize -->
@@ -387,6 +398,7 @@
<group xsi:type="restart" name="FALCON" title="Falcon">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="FALCON">
<component>FALCON_SERVER</component>
<component>FALCON_CLIENT</component> <!-- TODO, parallelize -->
@@ -396,6 +408,7 @@
<group xsi:type="restart" name="KAFKA" title="Kafka">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="KAFKA">
<component>KAFKA_BROKER</component>
</service>
@@ -404,6 +417,7 @@
<group xsi:type="restart" name="KNOX" title="Knox">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="KNOX">
<component>KNOX_GATEWAY</component>
</service>
@@ -412,6 +426,7 @@
<group xsi:type="restart" name="STORM" title="Storm">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="STORM">
<component>NIMBUS</component>
<component>SUPERVISOR</component>
@@ -430,6 +445,7 @@
<group xsi:type="restart" name="SLIDER" title="Slider">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="SLIDER">
<component>SLIDER</component>
</service>
@@ -438,6 +454,7 @@
<group xsi:type="restart" name="FLUME" title="Flume">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="FLUME">
<component>FLUME_HANDLER</component>
</service>
http://git-wip-us.apache.org/repos/asf/ambari/blob/625e4ff2/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.3.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.3.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.3.xml
index e4df228..d6328dc 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.3.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.3.xml
@@ -79,6 +79,7 @@
<direction>UPGRADE</direction>
<skippable>true</skippable>
<service-check>false</service-check>
+ <parallel-scheduler></parallel-scheduler>
<service name="FLUME">
<component>FLUME_HANDLER</component>
@@ -183,6 +184,7 @@
<direction>UPGRADE</direction>
<skippable>true</skippable>
<service-check>false</service-check>
+ <parallel-scheduler></parallel-scheduler>
<service name="HBASE">
<component>HBASE_REGIONSERVER</component>
@@ -495,6 +497,7 @@
<group xsi:type="restart" name="ZOOKEEPER" title="ZooKeeper">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="ZOOKEEPER">
<service-check>false</service-check>
<component>ZOOKEEPER_SERVER</component>
@@ -505,6 +508,7 @@
<group xsi:type="restart" name="RANGER" title="Ranger">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="RANGER">
<component>RANGER_ADMIN</component>
<component>RANGER_USERSYNC</component>
@@ -514,6 +518,7 @@
<group xsi:type="restart" name="HDFS" title="HDFS">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="HDFS">
<component>JOURNALNODE</component>
<component>ZKFC</component>
@@ -540,6 +545,7 @@
<group xsi:type="restart" name="YARN and MapReduce2" title="YARN and MapReduce2">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="MAPREDUCE2">
<component>HISTORYSERVER</component>
<component>MAPREDUCE2_CLIENT</component>
@@ -555,6 +561,7 @@
<group xsi:type="restart" name="HBASE" title="HBASE">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="HBASE">
<component>HBASE_MASTER</component>
<component>HBASE_REGIONSERVER</component>
@@ -565,7 +572,7 @@
<group xsi:type="restart" name="CLIENTS" title="Tez, Pig, Sqoop Clients">
<service-check>false</service-check>
<skippable>true</skippable>
-
+ <parallel-scheduler></parallel-scheduler>
<service name="TEZ">
<component>TEZ_CLIENT</component>
</service>
@@ -593,6 +600,7 @@
<group xsi:type="restart" name="HIVE" title="Hive">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="HIVE">
<component>HIVE_METASTORE</component>
<component>HIVE_SERVER</component>
@@ -605,6 +613,7 @@
<group xsi:type="restart" name="SPARK" title="Spark">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="SPARK">
<component>SPARK_JOBHISTORYSERVER</component>
<component>SPARK_CLIENT</component> <!-- TODO, parallelize -->
@@ -638,6 +647,7 @@
<group xsi:type="restart" name="OOZIE" title="Oozie">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="OOZIE">
<component>OOZIE_SERVER</component>
<component>OOZIE_CLIENT</component>
@@ -647,6 +657,7 @@
<group xsi:type="restart" name="FALCON" title="Falcon">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="FALCON">
<component>FALCON_SERVER</component>
<component>FALCON_CLIENT</component>
@@ -656,6 +667,7 @@
<group xsi:type="restart" name="KAFKA" title="Kafka">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="KAFKA">
<component>KAFKA_BROKER</component>
</service>
@@ -664,6 +676,7 @@
<group xsi:type="restart" name="KNOX" title="Knox">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="KNOX">
<component>KNOX_GATEWAY</component>
</service>
@@ -672,6 +685,7 @@
<group xsi:type="restart" name="STORM" title="Storm">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="STORM">
<component>NIMBUS</component>
<component>SUPERVISOR</component>
@@ -689,6 +703,7 @@
<group xsi:type="restart" name="SLIDER" title="Slider">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="SLIDER">
<component>SLIDER</component>
</service>
@@ -697,6 +712,7 @@
<group xsi:type="restart" name="FLUME" title="Flume">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="FLUME">
<component>FLUME_HANDLER</component>
</service>
@@ -705,6 +721,7 @@
<group xsi:type="restart" name="ACCUMULO" title="Accumulo">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="ACCUMULO">
<component>ACCUMULO_MASTER</component>
<component>ACCUMULO_TSERVER</component>
http://git-wip-us.apache.org/repos/asf/ambari/blob/625e4ff2/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
index 2ec4797..2f807fd 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
@@ -56,6 +56,7 @@
<group xsi:type="stop" name="STOP_HIGH_LEVEL_SERVICE_COMPONENTS" title="Stop Components for High-Level Services">
<direction>UPGRADE</direction>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service-check>false</service-check>
<service name="ATLAS">
@@ -171,6 +172,7 @@
<direction>UPGRADE</direction>
<skippable>true</skippable>
<service-check>false</service-check>
+ <parallel-scheduler></parallel-scheduler>
<service name="HBASE">
<component>HBASE_REGIONSERVER</component>
@@ -266,6 +268,7 @@
<group xsi:type="restart" name="ZOOKEEPER" title="ZooKeeper">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="ZOOKEEPER">
<service-check>false</service-check> <!-- TODO (Alejandro), enable service-check once done testing -->
<component>ZOOKEEPER_SERVER</component>
@@ -276,6 +279,7 @@
<group xsi:type="restart" name="RANGER" title="Ranger">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="RANGER">
<component>RANGER_ADMIN</component>
<component>RANGER_USERSYNC</component>
@@ -285,6 +289,7 @@
<group xsi:type="restart" name="RANGER_KMS" title="Ranger KMS">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="RANGER_KMS">
<component>RANGER_KMS_SERVER</component>
</service>
@@ -293,6 +298,7 @@
<group xsi:type="restart" name="HDFS" title="HDFS">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="HDFS">
<component>JOURNALNODE</component>
<component>ZKFC</component>
@@ -320,6 +326,7 @@
<group xsi:type="restart" name="YARN and MapReduce2" title="YARN and MapReduce2">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="MAPREDUCE2">
<component>HISTORYSERVER</component>
<component>MAPREDUCE2_CLIENT</component>
@@ -335,6 +342,7 @@
<group xsi:type="restart" name="HBASE" title="HBASE">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="HBASE">
<component>HBASE_MASTER</component>
<component>HBASE_REGIONSERVER</component>
@@ -346,7 +354,7 @@
<group xsi:type="restart" name="CLIENTS" title="Tez, Pig, Sqoop Clients">
<service-check>false</service-check>
<skippable>true</skippable>
-
+ <parallel-scheduler></parallel-scheduler>
<service name="TEZ">
<component>TEZ_CLIENT</component>
</service>
@@ -378,6 +386,7 @@
<group xsi:type="restart" name="HIVE" title="Hive">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="HIVE">
<component>HIVE_METASTORE</component>
<component>HIVE_SERVER</component>
@@ -390,6 +399,7 @@
<group xsi:type="restart" name="SPARK" title="Spark">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="SPARK">
<component>SPARK_JOBHISTORYSERVER</component>
<component>SPARK_CLIENT</component>
@@ -399,6 +409,7 @@
<group xsi:type="restart" name="ATLAS" title="Atlas">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="ATLAS">
<component>ATLAS_SERVER</component>
</service>
@@ -431,6 +442,7 @@
<group xsi:type="restart" name="OOZIE" title="Oozie">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="OOZIE">
<component>OOZIE_SERVER</component>
<component>OOZIE_CLIENT</component>
@@ -440,6 +452,7 @@
<group xsi:type="restart" name="FALCON" title="Falcon">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="FALCON">
<component>FALCON_SERVER</component>
<component>FALCON_CLIENT</component>
@@ -449,6 +462,7 @@
<group xsi:type="restart" name="KAFKA" title="Kafka">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="KAFKA">
<component>KAFKA_BROKER</component>
</service>
@@ -457,6 +471,7 @@
<group xsi:type="restart" name="KNOX" title="Knox">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="KNOX">
<component>KNOX_GATEWAY</component>
</service>
@@ -465,6 +480,7 @@
<group xsi:type="restart" name="STORM" title="Storm">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="STORM">
<component>NIMBUS</component>
<component>SUPERVISOR</component>
@@ -483,6 +499,7 @@
<group xsi:type="restart" name="SLIDER" title="Slider">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="SLIDER">
<component>SLIDER</component>
</service>
@@ -491,6 +508,7 @@
<group xsi:type="restart" name="FLUME" title="Flume">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="FLUME">
<component>FLUME_HANDLER</component>
</service>
@@ -499,6 +517,7 @@
<group xsi:type="restart" name="ACCUMULO" title="Accumulo">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="ACCUMULO">
<component>ACCUMULO_MASTER</component>
<component>ACCUMULO_TSERVER</component>
http://git-wip-us.apache.org/repos/asf/ambari/blob/625e4ff2/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java
index eaf31f7..f26ab23 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java
@@ -40,6 +40,7 @@ import org.apache.ambari.server.state.stack.upgrade.ConfigureTask;
import org.apache.ambari.server.state.stack.upgrade.ConfigUpgradeChangeDefinition.Transfer;
import org.apache.ambari.server.state.stack.upgrade.Direction;
import org.apache.ambari.server.state.stack.upgrade.Grouping;
+import org.apache.ambari.server.state.stack.upgrade.ParallelScheduler;
import org.apache.ambari.server.state.stack.upgrade.RestartGrouping;
import org.apache.ambari.server.state.stack.upgrade.RestartTask;
import org.apache.ambari.server.state.stack.upgrade.StopGrouping;
@@ -339,51 +340,65 @@ public class UpgradePackTest {
assertEquals(ClusterGrouping.class, group.getClass());
clusterGroup = (ClusterGrouping) group;
assertEquals("Prepare Upgrade", clusterGroup.title);
+ assertNull(clusterGroup.parallelScheduler);
group = groups.get(1);
assertEquals(StopGrouping.class, group.getClass());
stopGroup = (StopGrouping) group;
assertEquals("Stop Daemons for High-Level Services", stopGroup.title);
+ assertNotNull(stopGroup.parallelScheduler);
+ assertEquals(ParallelScheduler.DEFAULT_MAX_DEGREE_OF_PARALLELISM, stopGroup.parallelScheduler.maxDegreeOfParallelism);
group = groups.get(2);
assertEquals(ClusterGrouping.class, group.getClass());
clusterGroup = (ClusterGrouping) group;
assertEquals("Take Backups", clusterGroup.title);
+ assertNull(clusterGroup.parallelScheduler);
group = groups.get(3);
assertEquals(StopGrouping.class, group.getClass());
stopGroup = (StopGrouping) group;
assertEquals("Stop Daemons for Low-Level Services", stopGroup.title);
+ assertNotNull(stopGroup.parallelScheduler);
+ assertEquals(ParallelScheduler.DEFAULT_MAX_DEGREE_OF_PARALLELISM, stopGroup.parallelScheduler.maxDegreeOfParallelism);
group = groups.get(4);
assertEquals(UpdateStackGrouping.class, group.getClass());
updateStackGroup = (UpdateStackGrouping) group;
assertEquals("Update Desired Stack Id", updateStackGroup.title);
+ assertNull(updateStackGroup.parallelScheduler);
group = groups.get(5);
assertEquals(ClusterGrouping.class, group.getClass());
clusterGroup = (ClusterGrouping) group;
assertEquals("Set Version On All Hosts", clusterGroup.title);
+ assertNull(clusterGroup.parallelScheduler);
group = groups.get(6);
assertEquals(RestartGrouping.class, group.getClass());
restartGroup = (RestartGrouping) group;
assertEquals("Zookeeper", restartGroup.title);
+ assertNull(restartGroup.parallelScheduler);
group = groups.get(7);
assertEquals(RestartGrouping.class, group.getClass());
restartGroup = (RestartGrouping) group;
assertEquals("HDFS", restartGroup.title);
+ assertNotNull(restartGroup.parallelScheduler);
+ assertEquals(2, restartGroup.parallelScheduler.maxDegreeOfParallelism);
group = groups.get(8);
assertEquals(RestartGrouping.class, group.getClass());
restartGroup = (RestartGrouping) group;
assertEquals("MR and YARN", restartGroup.title);
+ assertNotNull(restartGroup.parallelScheduler);
+ assertEquals(ParallelScheduler.DEFAULT_MAX_DEGREE_OF_PARALLELISM, restartGroup.parallelScheduler.maxDegreeOfParallelism);
group = groups.get(9);
assertEquals(ClusterGrouping.class, group.getClass());
clusterGroup = (ClusterGrouping) group;
assertEquals("Finalize {{direction.text.proper}}", clusterGroup.title);
+ assertNull(clusterGroup.parallelScheduler);
}
private int indexOf(Map<String, ?> map, String keyToFind) {
http://git-wip-us.apache.org/repos/asf/ambari/blob/625e4ff2/ambari-server/src/test/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilderTest.java
index 6fcf7ce..94a5336 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilderTest.java
@@ -126,7 +126,7 @@ public class StageWrapperBuilderTest {
*/
@Override
public void add(UpgradeContext upgradeContext, HostsType hostsType, String service,
- boolean clientOnly, ProcessingComponent pc, Map<String, String> params, boolean scheduleInParallel) {
+ boolean clientOnly, ProcessingComponent pc, Map<String, String> params) {
}
/**
http://git-wip-us.apache.org/repos/asf/ambari/blob/625e4ff2/ambari-server/src/test/java/org/apache/ambari/server/utils/SetUtilsTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/utils/SetUtilsTest.java b/ambari-server/src/test/java/org/apache/ambari/server/utils/SetUtilsTest.java
new file mode 100644
index 0000000..2485074
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/utils/SetUtilsTest.java
@@ -0,0 +1,101 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.utils;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.Collections;
+
+import junit.framework.Assert;
+import org.junit.Test;
+
+/**
+ * Tests {@link org.apache.ambari.server.utils.SetUtils}
+ */
+public class SetUtilsTest {
+
+ @Test
+ public void testSplit() {
+
+ try {
+ SetUtils.split(null, 0);
+ Assert.fail("Expected IllegalArgumentException.");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+
+ int size = 10;
+ List<Set<Integer>> subsets = SetUtils.split(null, size);
+ Assert.assertEquals(0, subsets.size());
+
+ subsets = SetUtils.split(Collections.EMPTY_SET, size);
+ Assert.assertEquals(0, subsets.size());
+
+ subsets = SetUtils.split(Collections.singleton(0), size);
+ Assert.assertEquals(1, subsets.size());
+ Assert.assertEquals(1, subsets.get(0).size());
+
+ Set<Integer> set = new LinkedHashSet<Integer>(5);
+ for(int i = 0; i < 5; i++) {
+ set.add(i);
+ }
+ subsets = SetUtils.split(set, size);
+ Assert.assertEquals(1, subsets.size());
+ Assert.assertEquals(5, subsets.get(0).size());
+
+
+ set = new LinkedHashSet<Integer>(10);
+ for(int i = 0; i < 10; i++) {
+ set.add(i);
+ }
+ subsets = SetUtils.split(set, size);
+ Assert.assertEquals(1, subsets.size());
+ Assert.assertEquals(10, subsets.get(0).size());
+
+ set = new LinkedHashSet<Integer>(11);
+ for(int i = 0; i < 11; i++) {
+ set.add(i);
+ }
+ subsets = SetUtils.split(set, size);
+ Assert.assertEquals(2, subsets.size());
+ Assert.assertEquals(10, subsets.get(0).size());
+ Assert.assertEquals(1, subsets.get(1).size());
+
+ set = new LinkedHashSet<Integer>(20);
+ for(int i = 0; i < 20; i++) {
+ set.add(i);
+ }
+ subsets = SetUtils.split(set, size);
+ Assert.assertEquals(2, subsets.size());
+ Assert.assertEquals(10, subsets.get(0).size());
+ Assert.assertEquals(10, subsets.get(1).size());
+
+ set = new LinkedHashSet<Integer>(27);
+ for(int i = 0; i < 27; i++) {
+ set.add(i);
+ }
+ subsets = SetUtils.split(set, size);
+ Assert.assertEquals(3, subsets.size());
+ Assert.assertEquals(10, subsets.get(0).size());
+ Assert.assertEquals(10, subsets.get(1).size());
+ Assert.assertEquals(7, subsets.get(2).size());
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/625e4ff2/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_nonrolling.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_nonrolling.xml b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_nonrolling.xml
index 4c1f472..9f57ca8 100644
--- a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_nonrolling.xml
+++ b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_nonrolling.xml
@@ -48,6 +48,7 @@
<direction>UPGRADE</direction>
<skippable>true</skippable>
<service-check>false</service-check>
+ <parallel-scheduler></parallel-scheduler>
<service name="YARN">
<component>NODEMANAGER</component>
@@ -76,6 +77,7 @@
<direction>UPGRADE</direction>
<skippable>true</skippable>
<service-check>false</service-check>
+ <parallel-scheduler></parallel-scheduler>
<service name="HDFS">
<component>DATANODE</component>
@@ -133,6 +135,9 @@
<group xsi:type="restart" name="HDFS" title="HDFS">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler>
+ <max-degree-of-parallelism>2</max-degree-of-parallelism>
+ </parallel-scheduler>
<service name="HDFS">
<component>JOURNALNODE</component>
<component>ZKFC</component>
@@ -146,6 +151,7 @@
<group xsi:type="restart" name="MR and YARN" title="MR and YARN">
<service-check>false</service-check>
<skippable>true</skippable>
+ <parallel-scheduler></parallel-scheduler>
<service name="MAPREDUCE2">
<component>HISTORYSERVER</component>
<component>MAPREDUCE2_CLIENT</component>