From 6526f95bd281fc011f8776d21ff933087c5924de Mon Sep 17 00:00:00 2001 From: Sunil G Date: Wed, 19 Feb 2020 11:17:22 +0530 Subject: [PATCH] YARN-10139. ValidateAndGetSchedulerConfiguration API fails when cluster max allocation > default 8GB. Contributed by Prabhu Joseph. --- .../resourcemanager/webapp/RMWebServices.java | 13 ++++++++-- ...estRMWebServicesConfigurationMutation.java | 26 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) 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 c6858f90f2..dfdaba9e59 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.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; @@ -2639,14 +2640,22 @@ public synchronized Response validateAndGetSchedulerConfiguration( ((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 4bb50eab9c..34b7c1225c 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 @@ -763,6 +763,32 @@ public void testGlobalConfChange() throws Exception { 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 {