diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java index 9f8d0b9bd7a..02d9cfa50ca 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java @@ -31,6 +31,7 @@ import java.util.Collections; import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -2391,14 +2392,22 @@ public class RMWebServices extends WebServices implements RMWebServiceProtocol { ((MutableConfScheduler) scheduler).getMutableConfProvider(); Configuration schedulerConf = mutableConfigurationProvider .getConfiguration(); - Configuration newConfig = mutableConfigurationProvider + Configuration newSchedulerConf = mutableConfigurationProvider .applyChanges(schedulerConf, mutationInfo); Configuration yarnConf = ((CapacityScheduler) scheduler).getConf(); + + Configuration newConfig = new Configuration(yarnConf); + Iterator> iter = newSchedulerConf.iterator(); + Entry e = null; + while (iter.hasNext()) { + e = iter.next(); + newConfig.set(e.getKey(), e.getValue()); + } CapacitySchedulerConfigValidator.validateCSConfiguration(yarnConf, newConfig, rm.getRMContext()); return Response.status(Status.OK) - .entity(new ConfInfo(newConfig)) + .entity(new ConfInfo(newSchedulerConf)) .build(); } catch (Exception e) { String errorMsg = "CapacityScheduler configuration validation failed:" diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesConfigurationMutation.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesConfigurationMutation.java index e2f82a03031..d12c2fffe94 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesConfigurationMutation.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesConfigurationMutation.java @@ -731,6 +731,32 @@ public class TestRMWebServicesConfigurationMutation extends JerseyTestBase { newCSConf.getMaximumSystemApplications()); } + @Test + public void testValidateWithClusterMaxAllocation() throws Exception { + WebResource r = resource(); + int clusterMax = YarnConfiguration. + DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_MB * 2; + conf.setInt(YarnConfiguration.RM_SCHEDULER_MAXIMUM_ALLOCATION_MB, + clusterMax); + + SchedConfUpdateInfo updateInfo = new SchedConfUpdateInfo(); + Map updateParam = new HashMap<>(); + updateParam.put(CapacitySchedulerConfiguration.MAXIMUM_APPLICATIONS_SUFFIX, + "100"); + QueueConfigInfo aUpdateInfo = new QueueConfigInfo("root.a", updateParam); + updateInfo.getUpdateQueueInfo().add(aUpdateInfo); + + ClientResponse response = + r.path("ws").path("v1").path("cluster") + .path(RMWSConsts.SCHEDULER_CONF_VALIDATE) + .queryParam("user.name", userName) + .accept(MediaType.APPLICATION_JSON) + .entity(YarnWebServiceUtils.toJson(updateInfo, + SchedConfUpdateInfo.class), MediaType.APPLICATION_JSON) + .post(ClientResponse.class); + assertEquals(Status.OK.getStatusCode(), response.getStatus()); + } + @Override @After public void tearDown() throws Exception {