From b31b4bf029acdceaf6723e40ee29224bb5d38895 Mon Sep 17 00:00:00 2001 From: Karthik Kambatla Date: Wed, 5 Nov 2014 10:12:56 -0800 Subject: [PATCH] Fix broken download of directories (cherry picked from commit 745c9a01243b8eefc72d89d1164d7d010b80983b) --- .../org/apache/hadoop/yarn/util/FSDownload.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/FSDownload.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/FSDownload.java index fb37701d5ec..2737cce196b 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/FSDownload.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/FSDownload.java @@ -1,4 +1,4 @@ -/** + /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -28,6 +28,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.regex.Pattern; +import org.apache.commons.io.FileUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.classification.InterfaceAudience.LimitedPrivate; @@ -389,17 +390,22 @@ public class FSDownload implements Callable { */ private void changePermissions(FileSystem fs, final Path path) throws IOException, InterruptedException { - FileStatus fStatus = fs.getFileStatus(path); + File f = new File(path.toUri()); + if (FileUtils.isSymlink(f)) { + // avoid following symlinks when changing permissions + return; + } + boolean isDir = f.isDirectory(); FsPermission perm = cachePerms; // set public perms as 755 or 555 based on dir or file if (resource.getVisibility() == LocalResourceVisibility.PUBLIC) { - perm = fStatus.isDirectory() ? PUBLIC_DIR_PERMS : PUBLIC_FILE_PERMS; + perm = isDir ? PUBLIC_DIR_PERMS : PUBLIC_FILE_PERMS; } // set private perms as 700 or 500 else { // PRIVATE: // APPLICATION: - perm = fStatus.isDirectory() ? PRIVATE_DIR_PERMS : PRIVATE_FILE_PERMS; + perm = isDir ? PRIVATE_DIR_PERMS : PRIVATE_FILE_PERMS; } LOG.debug("Changing permissions for path " + path + " to perm " + perm); @@ -415,8 +421,7 @@ public class FSDownload implements Callable { } }); } - if (fStatus.isDirectory() - && !fStatus.isSymlink()) { + if (isDir) { FileStatus[] statuses = fs.listStatus(path); for (FileStatus status : statuses) { changePermissions(fs, status.getPath());