Repository: incubator-slider Updated Branches: refs/heads/feature/SLIDER-1107_AM_config_generation 41de54d76 -> d3923d889
SLIDER-1107 address suggestions from gour Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/d3923d88 Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/d3923d88 Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/d3923d88 Branch: refs/heads/feature/SLIDER-1107_AM_config_generation Commit: d3923d88915997f62b35ec43bbe86b232c9bcccf Parents: 41de54d Author: Billie Rinaldi <billie.rina...@gmail.com> Authored: Wed Aug 3 14:16:09 2016 -0700 Committer: Billie Rinaldi <billie.rina...@gmail.com> Committed: Wed Aug 3 14:16:09 2016 -0700 ---------------------------------------------------------------------- .../org/apache/slider/client/SliderClient.java | 5 ++- .../slider/common/params/SliderActions.java | 2 +- .../slider/common/tools/CoreFileSystem.java | 31 ++++++++++---- .../slider/core/conf/ConfTreeOperations.java | 14 ------ .../slider/core/launch/AbstractLauncher.java | 10 ++--- .../providers/agent/AgentClientProvider.java | 45 +++++++++++++------- .../providers/agent/AgentProviderService.java | 26 +++++------ .../agent/TestAgentProviderService.java | 4 ++ 8 files changed, 80 insertions(+), 57 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/d3923d88/slider-core/src/main/java/org/apache/slider/client/SliderClient.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/client/SliderClient.java b/slider-core/src/main/java/org/apache/slider/client/SliderClient.java index eb0630d..af134b3 100644 --- a/slider-core/src/main/java/org/apache/slider/client/SliderClient.java +++ b/slider-core/src/main/java/org/apache/slider/client/SliderClient.java @@ -1112,7 +1112,10 @@ public class SliderClient extends AbstractSliderLaunchedService implements RunSe @Override public int actionResource(ActionResourceArgs resourceInfo) throws YarnException, IOException { - if (resourceInfo.install) { + if (resourceInfo.help) { + actionHelp(ACTION_RESOURCE); + return EXIT_SUCCESS; + } else if (resourceInfo.install) { return actionInstallResource(resourceInfo); } else if (resourceInfo.delete) { return actionDeleteResource(resourceInfo); http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/d3923d88/slider-core/src/main/java/org/apache/slider/common/params/SliderActions.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/common/params/SliderActions.java b/slider-core/src/main/java/org/apache/slider/common/params/SliderActions.java index e209cdc..204ad9a 100644 --- a/slider-core/src/main/java/org/apache/slider/common/params/SliderActions.java +++ b/slider-core/src/main/java/org/apache/slider/common/params/SliderActions.java @@ -107,7 +107,7 @@ public interface SliderActions { " Deprecated, use '" + ACTION_KEYTAB + " " + ClientArgs.ARG_INSTALL + "'."; String DESCRIBE_ACTION_KEYTAB = "Manage a Kerberos keytab file (install, delete, list) in the sub-folder 'keytabs' of the user's Slider base directory"; String DESCRIBE_ACTION_DIAGNOSTIC = "Diagnose the configuration of the running slider application and slider client"; - String DESCRIBE_ACTION_RESOURCE = "Manage a file (install, delete, list) in the sub-folder 'resources' of the user's Slider base directory"; + String DESCRIBE_ACTION_RESOURCE = "Manage a file (install, delete, list) in the 'resources' sub-folder of the user's Slider base directory"; } http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/d3923d88/slider-core/src/main/java/org/apache/slider/common/tools/CoreFileSystem.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/common/tools/CoreFileSystem.java b/slider-core/src/main/java/org/apache/slider/common/tools/CoreFileSystem.java index 0b0f1bc..aa5edf1 100644 --- a/slider-core/src/main/java/org/apache/slider/common/tools/CoreFileSystem.java +++ b/slider-core/src/main/java/org/apache/slider/common/tools/CoreFileSystem.java @@ -830,23 +830,36 @@ public class CoreFileSystem { } public void touch(Path path, boolean overwrite) throws IOException { - FSDataOutputStream out = fileSystem.create(path, overwrite); - out.close(); + FSDataOutputStream out = null; + try { + out = fileSystem.create(path, overwrite); + } finally { + IOUtils.closeStream(out); + } } public void cat(Path path, boolean overwrite, String data) throws IOException { - FSDataOutputStream out = fileSystem.create(path, overwrite); - byte[] bytes = data.getBytes(Charset.forName("UTF-8")); - out.write(bytes); - out.close(); + FSDataOutputStream out = null; + try { + out = fileSystem.create(path, overwrite); + byte[] bytes = data.getBytes(Charset.forName("UTF-8")); + out.write(bytes); + } finally { + IOUtils.closeStream(out); + } } public String cat(Path path) throws IOException { FileStatus status = fileSystem.getFileStatus(path); byte[] b = new byte[(int) status.getLen()]; - FSDataInputStream in = fileSystem.open(path); - int count = in.read(b); - return new String(b, 0, count, UTF_8); + FSDataInputStream in = null; + try { + in = fileSystem.open(path); + int count = in.read(b); + return new String(b, 0, count, UTF_8); + } finally { + IOUtils.closeStream(in); + } } /** http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/d3923d88/slider-core/src/main/java/org/apache/slider/core/conf/ConfTreeOperations.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/core/conf/ConfTreeOperations.java b/slider-core/src/main/java/org/apache/slider/core/conf/ConfTreeOperations.java index d376c72..d24a158 100644 --- a/slider-core/src/main/java/org/apache/slider/core/conf/ConfTreeOperations.java +++ b/slider-core/src/main/java/org/apache/slider/core/conf/ConfTreeOperations.java @@ -347,20 +347,6 @@ public class ConfTreeOperations { } /** - * Load from a json String. The inner conf tree is the loaded data -unresolved - * @param json json string - * @return loaded value - * @throws IOException load failure - */ - public static ConfTreeOperations fromString(String json) throws - IOException { - ConfTreeSerDeser confTreeSerDeser = new ConfTreeSerDeser(); - ConfTreeOperations ops = new ConfTreeOperations( - confTreeSerDeser.fromJson(json) ); - return ops; - } - - /** * Build from an existing instance -which is cloned via JSON ser/deser * @param instance the source instance * @return loaded value http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/d3923d88/slider-core/src/main/java/org/apache/slider/core/launch/AbstractLauncher.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/core/launch/AbstractLauncher.java b/slider-core/src/main/java/org/apache/slider/core/launch/AbstractLauncher.java index efc58b4..5a3eb3d 100644 --- a/slider-core/src/main/java/org/apache/slider/core/launch/AbstractLauncher.java +++ b/slider-core/src/main/java/org/apache/slider/core/launch/AbstractLauncher.java @@ -133,13 +133,13 @@ public abstract class AbstractLauncher extends Configured { return localResources; } - public void addLocalResource(String subpath, LocalResource resource) { - localResources.put(subpath, resource); + public void addLocalResource(String subPath, LocalResource resource) { + localResources.put(subPath, resource); } - public void addLocalResource(String subpath, LocalResource resource, String mountPath) { - localResources.put(subpath, resource); - mountPaths.put(subpath, mountPath); + public void addLocalResource(String subPath, LocalResource resource, String mountPath) { + localResources.put(subPath, resource); + mountPaths.put(subPath, mountPath); } /** http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/d3923d88/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java index 3eef0b0..4c6a50b 100644 --- a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java +++ b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java @@ -27,6 +27,7 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.registry.client.api.RegistryOperations; import org.apache.hadoop.registry.client.binding.RegistryUtils; import org.apache.slider.api.InternalKeys; @@ -335,9 +336,21 @@ public class AgentClientProvider extends AbstractClientProvider extractFile(zipInputStream, filePath); if ("metainfo.xml".equals(zipEntry.getName())) { - metaInfo = new MetainfoParser().fromXmlStream(new FileInputStream(filePath)); + FileInputStream input = null; + try { + input = new FileInputStream(filePath); + metaInfo = new MetainfoParser().fromXmlStream(input); + } finally { + IOUtils.closeStream(input); + } } else if ("metainfo.json".equals(zipEntry.getName())) { - metaInfo = new MetainfoParser().fromJsonStream(new FileInputStream(filePath)); + FileInputStream input = null; + try { + input = new FileInputStream(filePath); + metaInfo = new MetainfoParser().fromJsonStream(input); + } finally { + IOUtils.closeStream(input); + } } else if ("clientInstallConfig-default.json".equals(zipEntry.getName())) { try { defaultConfig = new JSONObject(FileUtils.readFileToString(new File(filePath), Charset.defaultCharset())); @@ -362,22 +375,22 @@ public class AgentClientProvider extends AbstractClientProvider throw new BadConfigException(E_COULD_NOT_READ_METAINFO); } - String client_script = null; + String clientScript = null; String clientComponent = null; for (Component component : metaInfo.getApplication().getComponents()) { if (component.getCategory().equals("CLIENT")) { clientComponent = component.getName(); if (component.getCommandScript() != null) { - client_script = component.getCommandScript().getScript(); + clientScript = component.getCommandScript().getScript(); } break; } } - if (SliderUtils.isUnset(client_script)) { + if (SliderUtils.isUnset(clientScript)) { log.info("Installing CLIENT without script"); List<Package> packages = metaInfo.getApplication().getPackages(); - if (packages != null && packages.size() > 0) { + if (packages.size() > 0) { // retrieve package resources from HDFS and extract for (Package pkg : packages) { Path pkgPath = fileSystem.buildResourcePath(pkg.getName()); @@ -416,20 +429,22 @@ public class AgentClientProvider extends AbstractClientProvider } File confInstallDir; String clientRoot = null; - if (defaultConfig != null) { + if (config != null) { try { - clientRoot = defaultConfig.getJSONObject("global") + clientRoot = config.getJSONObject("global") .getString(AgentKeys.APP_CLIENT_ROOT); } catch (JSONException e) { - e.printStackTrace(); + log.info("Couldn't read {} from provided client config, falling " + + "back on default", AgentKeys.APP_CLIENT_ROOT); } } - if (config != null) { + if (clientRoot == null && defaultConfig != null) { try { - clientRoot = config.getJSONObject("global") + clientRoot = defaultConfig.getJSONObject("global") .getString(AgentKeys.APP_CLIENT_ROOT); } catch (JSONException e) { - e.printStackTrace(); + log.info("Couldn't read {} from default client config, using {}", + AgentKeys.APP_CLIENT_ROOT, clientInstallPath); } } if (clientRoot == null) { @@ -446,7 +461,7 @@ public class AgentClientProvider extends AbstractClientProvider confInstallDir); } } else { - log.info("Installing CLIENT using script {}", client_script); + log.info("Installing CLIENT using script {}", clientScript); expandAgentTar(agentPkgDir); JSONObject commandJson = getCommandJson(defaultConfig, config, metaInfo, clientInstallPath, name); @@ -455,13 +470,13 @@ public class AgentClientProvider extends AbstractClientProvider file.write(commandJson.toString()); } catch (IOException e) { - e.printStackTrace(); + log.error("Couldn't write command.json to file"); } finally { file.flush(); file.close(); } - runCommand(appPkgDir, agentPkgDir, cmdDir, client_script); + runCommand(appPkgDir, agentPkgDir, cmdDir, clientScript); } } catch (IOException ioex) { http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/d3923d88/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java index bc04220..4ffae7c 100644 --- a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java +++ b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java @@ -28,6 +28,7 @@ import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.permission.FsAction; import org.apache.hadoop.fs.permission.FsPermission; +import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.registry.client.binding.RegistryPathUtils; import org.apache.hadoop.registry.client.types.Endpoint; import org.apache.hadoop.registry.client.types.ProtocolTypes; @@ -170,7 +171,6 @@ public class AgentProviderService extends AbstractProviderService implements private AgentClientProvider clientProvider; private AtomicInteger taskId = new AtomicInteger(0); private volatile Metainfo metaInfo = null; - private AggregateConf instanceDefinition = null; private SliderFileSystem fileSystem = null; private Map<String, DefaultConfig> defaultConfigs = null; private ComponentCommandOrder commandOrder = null; @@ -284,7 +284,6 @@ public class AgentProviderService extends AbstractProviderService implements if (metaInfo == null) { synchronized (syncLock) { if (metaInfo == null) { - this.instanceDefinition = instanceDefinition; this.fileSystem = fileSystem; readAndSetHeartbeatMonitoringInterval(instanceDefinition); initializeAgentDebugCommands(instanceDefinition); @@ -702,12 +701,15 @@ public class AgentProviderService extends AbstractProviderService implements } Path destPath = new Path(parentDir, resource.getName()); if (!fileSystem.getFileSystem().exists(destPath)) { - FSDataOutputStream os = fileSystem.getFileSystem().create(destPath); - byte[] contents = FileUtils.readFileToByteArray(resource); - os.write(contents, 0, contents.length); - - os.flush(); - os.close(); + FSDataOutputStream os = null; + try { + os = fileSystem.getFileSystem().create(destPath); + byte[] contents = FileUtils.readFileToByteArray(resource); + os.write(contents, 0, contents.length); + os.flush(); + } finally { + IOUtils.closeStream(os); + } log.info("Uploaded {} to localization path {}", resource, destPath); } else { log.info("Resource {} already existed at localization path {}", resource, @@ -1362,7 +1364,7 @@ public class AgentProviderService extends AbstractProviderService implements // identify client component Component client = null; for (Component component : getMetaInfo().getApplication().getComponents()) { - if (component != null && component.getCategory().equals("CLIENT")) { + if (component.getCategory().equals("CLIENT")) { client = component; break; } @@ -1373,7 +1375,7 @@ public class AgentProviderService extends AbstractProviderService implements } // register AM-generated client configs - ConfTreeOperations appConf = instanceDefinition.getAppConfOperations(); + ConfTreeOperations appConf = getAmState().getAppConfSnapshot(); MapOperations clientOperations = appConf.getOrAddComponent(client.getName()); appConf.resolve(); if (!clientOperations.getOptionBool(AgentKeys.AM_CONFIG_GENERATION, @@ -1765,7 +1767,7 @@ public class AgentProviderService extends AbstractProviderService implements Application application = getMetaInfo().getApplication(); if ((!canAnyMasterPublishConfig() || canPublishConfig(componentGroup)) && - !instanceDefinition.getAppConfOperations().getComponentOptBool( + !getAmState().getAppConfSnapshot().getComponentOptBool( componentGroup, AgentKeys.AM_CONFIG_GENERATION, false)) { // If no Master can explicitly publish then publish if its a master // Otherwise, wait till the master that can publish is ready @@ -1890,7 +1892,7 @@ public class AgentProviderService extends AbstractProviderService implements simpleEntries.put(entry.getKey(), entry.getValue().get(0).getValue()); } } - if (!instanceDefinition.getAppConfOperations().getComponentOptBool( + if (!getAmState().getAppConfSnapshot().getComponentOptBool( groupName, AgentKeys.AM_CONFIG_GENERATION, false)) { publishApplicationInstanceData(groupName, groupName, simpleEntries.entrySet()); http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/d3923d88/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java ---------------------------------------------------------------------- diff --git a/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java b/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java index af1c61f..0d56ff7 100644 --- a/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java +++ b/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java @@ -902,6 +902,8 @@ public class TestAgentProviderService { doReturn(access).when(mockAps).getAmState(); PublishedExportsSet pubExpSet = new PublishedExportsSet(); expect(access.getPublishedExportsSet()).andReturn(pubExpSet).anyTimes(); + expect(access.getAppConfSnapshot()).andReturn(new ConfTreeOperations( + new ConfTree())).anyTimes(); replay(access); Map<String, String> ports = new HashMap<String, String>(); @@ -1016,6 +1018,8 @@ public class TestAgentProviderService { doReturn(access).when(mockAps).getAmState(); PublishedExportsSet pubExpSet = new PublishedExportsSet(); expect(access.getPublishedExportsSet()).andReturn(pubExpSet).anyTimes(); + expect(access.getAppConfSnapshot()).andReturn(new ConfTreeOperations( + new ConfTree())).anyTimes(); replay(access); mockAps.publishConfigAndExportGroups(hb, componentStatus, "HBASE_MASTER");