From dfceffa70d54f5aa9cb2fe200653e83227c44f62 Mon Sep 17 00:00:00 2001 From: Eric Yang Date: Thu, 3 Jan 2019 12:54:16 -0500 Subject: [PATCH] YARN-9147. Rmove auxiliary services when manifest file is removed. Contributed by Billie Rinaldi --- .../containermanager/AuxServices.java | 31 +++++++++++++------ .../containermanager/TestAuxServices.java | 13 ++++++++ 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/AuxServices.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/AuxServices.java index 59a76dae11..cde0683814 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/AuxServices.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/AuxServices.java @@ -40,6 +40,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.annotations.VisibleForTesting; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.security.authorize.AccessControlList; import org.apache.hadoop.yarn.server.nodemanager.containermanager.records.AuxServiceConfiguration; @@ -413,6 +414,7 @@ private synchronized void maybeRemoveAuxService(String sName) { serviceRecordMap.remove(sName); serviceMetaData.remove(sName); if (s != null) { + LOG.info("Removing aux service " + sName); stopAuxService(s); } } @@ -557,8 +559,24 @@ private synchronized AuxServiceRecords maybeReadManifestFile() throws * @param startServices if true starts services, otherwise only inits services * @throws IOException */ - private synchronized void loadManifest(Configuration conf, boolean + @VisibleForTesting + protected synchronized void loadManifest(Configuration conf, boolean startServices) throws IOException { + if (manifest == null) { + return; + } + if (!manifestFS.exists(manifest)) { + if (serviceMap.isEmpty()) { + return; + } + LOG.info("Manifest file " + manifest + " doesn't exist, stopping " + + "auxiliary services"); + Set servicesToRemove = new HashSet<>(serviceMap.keySet()); + for (String sName : servicesToRemove) { + maybeRemoveAuxService(sName); + } + return; + } AuxServiceRecords services = maybeReadManifestFile(); if (services == null) { // read did not occur or no changes detected @@ -596,15 +614,10 @@ private synchronized void loadManifest(Configuration conf, boolean } // remove aux services that do not appear in the manifest - List servicesToRemove = new ArrayList<>(); - for (String sName : serviceMap.keySet()) { - if (!loadedAuxServices.contains(sName)) { - foundChanges = true; - servicesToRemove.add(sName); - } - } + Set servicesToRemove = new HashSet<>(serviceMap.keySet()); + servicesToRemove.removeAll(loadedAuxServices); for (String sName : servicesToRemove) { - LOG.info("Removing aux service " + sName); + foundChanges = true; maybeRemoveAuxService(sName); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/TestAuxServices.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/TestAuxServices.java index 1f944b4978..cb8abc79ce 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/TestAuxServices.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/TestAuxServices.java @@ -885,4 +885,17 @@ public void testAuxServicesManifestPermissions() throws IOException { aux.init(conf); assertEquals(2, aux.getServices().size()); } + + @Test + public void testRemoveManifest() throws IOException { + Assume.assumeTrue(useManifest); + Configuration conf = getABConf(); + final AuxServices aux = new AuxServices(MOCK_AUX_PATH_HANDLER, + MOCK_CONTEXT, MOCK_DEL_SERVICE); + aux.init(conf); + assertEquals(2, aux.getServices().size()); + manifest.delete(); + aux.loadManifest(conf, false); + assertEquals(0, aux.getServices().size()); + } }