瀏覽代碼

HADOOP-9146. Fix sticky bit regression on branch-trunk-win. Contributed by Chris Nauroth.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-trunk-win@1422288 13f79535-47bb-0310-9956-ffa450edef68
Suresh Srinivas 12 年之前
父節點
當前提交
46c2ed7e13

+ 3 - 0
hadoop-common-project/hadoop-common/CHANGES.branch-trunk-win.txt

@@ -69,3 +69,6 @@ branch-trunk-win changes - unreleased
 
 
   HADOOP-9081. Add TestWinUtils. (Chuan Liu, Ivan Mitic, Chris Nauroth, 
   HADOOP-9081. Add TestWinUtils. (Chuan Liu, Ivan Mitic, Chris Nauroth, 
   and Bikas Saha via suresh)
   and Bikas Saha via suresh)
+
+  HADOOP-9146. Fix sticky bit regression on branch-trunk-win.
+  (Chris Nauroth via suresh)

+ 19 - 2
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java

@@ -36,6 +36,7 @@ import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.classification.InterfaceStability;
 import org.apache.hadoop.classification.InterfaceStability;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.permission.FsPermission;
 import org.apache.hadoop.fs.permission.FsPermission;
+import org.apache.hadoop.io.nativeio.NativeIO;
 import org.apache.hadoop.util.Progressable;
 import org.apache.hadoop.util.Progressable;
 import org.apache.hadoop.util.Shell;
 import org.apache.hadoop.util.Shell;
 import org.apache.hadoop.util.StringUtils;
 import org.apache.hadoop.util.StringUtils;
@@ -592,7 +593,23 @@ public class RawLocalFileSystem extends FileSystem {
    * Use the command chmod to set permission.
    * Use the command chmod to set permission.
    */
    */
   @Override
   @Override
-  public void setPermission(Path p, FsPermission permission) throws IOException {
-    FileUtil.setPermission(pathToFile(p), permission);
+  public void setPermission(Path p, FsPermission permission)
+    throws IOException {
+    if (NativeIO.isAvailable()) {
+      NativeIO.POSIX.chmod(pathToFile(p).getCanonicalPath(),
+                     permission.toShort());
+    } else {
+      execCommand(pathToFile(p), Shell.SET_PERMISSION_COMMAND,
+          String.format("%05o", permission.toShort()));
+    }
   }
   }
+
+  private static String execCommand(File f, String... cmd) throws IOException {
+    String[] args = new String[cmd.length + 1];
+    System.arraycopy(cmd, 0, args, 0, cmd.length);
+    args[cmd.length] = FileUtil.makeShellPath(f, true);
+    String output = Shell.execCommand(args);
+    return output;
+  }
+
 }
 }