From ee08b2384253e1a23a4af9cdc43f8c23ac43754b Mon Sep 17 00:00:00 2001 From: Prabhu Joseph Date: Mon, 14 Oct 2019 17:52:47 +0530 Subject: [PATCH] YARN-9900. Revert Invalid Config and Refresh Support in SchedulerConfig Format. Signed-off-by: Prabhu Joseph --- .../scheduler/MutableConfigurationProvider.java | 2 ++ .../conf/MutableCSConfigurationProvider.java | 16 ++++++++++ .../resourcemanager/webapp/RMWebServices.java | 8 +++++ .../TestRMWebServicesConfigurationMutation.java | 35 ++++++++++++++++++++-- 4 files changed, 58 insertions(+), 3 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/scheduler/MutableConfigurationProvider.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/MutableConfigurationProvider.java index eff8aa8..79c0e6d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/MutableConfigurationProvider.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/MutableConfigurationProvider.java @@ -73,6 +73,8 @@ void logAndApplyMutation(UserGroupInformation user, SchedConfUpdateInfo void formatConfigurationInStore(Configuration conf) throws Exception; + void revertFromOldConfig(Configuration config) throws Exception; + /** * Closes the configuration provider, releasing any required resources. * @throws IOException on failure to close diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/conf/MutableCSConfigurationProvider.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/conf/MutableCSConfigurationProvider.java index f464b2c..a615d17 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/conf/MutableCSConfigurationProvider.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/conf/MutableCSConfigurationProvider.java @@ -166,6 +166,7 @@ public void formatConfigurationInStore(Configuration config) formatLock.writeLock().lock(); try { confStore.format(); + oldConf = new Configuration(schedConf); Configuration initialSchedConf = new Configuration(false); initialSchedConf.addResource(YarnConfiguration.CS_CONFIGURATION_FILE); this.schedConf = new Configuration(false); @@ -185,6 +186,21 @@ public void formatConfigurationInStore(Configuration config) } @Override + public void revertFromOldConfig(Configuration config) throws Exception { + formatLock.writeLock().lock(); + try { + schedConf = oldConf; + confStore.format(); + confStore.initialize(config, oldConf, rmContext); + confStore.checkVersion(); + } catch (Exception e) { + throw new IOException(e); + } finally { + formatLock.writeLock().unlock(); + } + } + + @Override public void confirmPendingMutation(boolean isValid) throws Exception { formatLock.readLock().lock(); try { 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 bb77dbd..5823e94 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 @@ -2582,6 +2582,14 @@ public Response formatSchedulerConfiguration(@Context HttpServletRequest hsr) MutableConfigurationProvider mutableConfigurationProvider = ((MutableConfScheduler) scheduler).getMutableConfProvider(); mutableConfigurationProvider.formatConfigurationInStore(conf); + try { + rm.getRMContext().getRMAdminService().refreshQueues(); + } catch (IOException | YarnException e) { + LOG.error("Exception thrown when formatting configuration.", e); + mutableConfigurationProvider.revertFromOldConfig(conf); + throw e; + } + rm.getRMContext().getRMAdminService().refreshQueues(); return Response.status(Status.OK).entity("Configuration under " + "store successfully formatted.").build(); } catch (Exception e) { 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 c717d8b..773b4bf 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 @@ -191,15 +191,44 @@ public void testGetSchedulerConf() throws Exception { @Test public void testFormatSchedulerConf() throws Exception { - testAddNestedQueue(); + CapacitySchedulerConfiguration newConf = getSchedulerConf(); + assertNotNull(newConf); + assertEquals(3, newConf.getQueues("root").length); + + SchedConfUpdateInfo updateInfo = new SchedConfUpdateInfo(); + Map nearEmptyCapacity = new HashMap<>(); + nearEmptyCapacity.put(CapacitySchedulerConfiguration.CAPACITY, "1E-4"); + QueueConfigInfo d = new QueueConfigInfo("root.formattest", + nearEmptyCapacity); + updateInfo.getAddQueueInfo().add(d); + + Map stoppedParam = new HashMap<>(); + stoppedParam.put(CapacitySchedulerConfiguration.STATE, + QueueState.STOPPED.toString()); + QueueConfigInfo stoppedInfo = new QueueConfigInfo("root.formattest", + stoppedParam); + updateInfo.getUpdateQueueInfo().add(stoppedInfo); + + // Add a queue root.formattest to the existing three queues WebResource r = resource(); ClientResponse response = r.path("ws").path("v1").path("cluster") + .path("scheduler-conf").queryParam("user.name", userName) + .accept(MediaType.APPLICATION_JSON) + .entity(YarnWebServiceUtils.toJson(updateInfo, + SchedConfUpdateInfo.class), MediaType.APPLICATION_JSON) + .put(ClientResponse.class); + newConf = getSchedulerConf(); + assertNotNull(newConf); + assertEquals(4, newConf.getQueues("root").length); + + // Format the scheduler config and validate root.formattest is not present + response = r.path("ws").path("v1").path("cluster") .queryParam("user.name", userName) .path(RMWSConsts.FORMAT_SCHEDULER_CONF) .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); assertEquals(Status.OK.getStatusCode(), response.getStatus()); - CapacitySchedulerConfiguration orgConf = getSchedulerConf(); - assertEquals(3, orgConf.getQueues("root").length); + newConf = getSchedulerConf(); + assertEquals(3, newConf.getQueues("root").length); } private long getConfigVersion() throws Exception { -- 2.7.4 (Apple Git-66)