You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by to...@apache.org on 2011/01/26 08:03:53 UTC

svn commit: r1063615 - in /hadoop/common/branches/branch-0.22: ./ src/java/org/apache/hadoop/fs/ src/java/org/apache/hadoop/io/nativeio/ src/native/ src/native/src/org/apache/hadoop/io/nativeio/ src/test/core/org/apache/hadoop/io/nativeio/

Author: todd
Date: Wed Jan 26 07:03:52 2011
New Revision: 1063615

URL: http://svn.apache.org/viewvc?rev=1063615&view=rev
Log:
HADOOP-7110. Implement chmod with JNI. Contributed by Todd Lipcon

Modified:
    hadoop/common/branches/branch-0.22/CHANGES.txt
    hadoop/common/branches/branch-0.22/src/java/org/apache/hadoop/fs/RawLocalFileSystem.java
    hadoop/common/branches/branch-0.22/src/java/org/apache/hadoop/io/nativeio/NativeIO.java
    hadoop/common/branches/branch-0.22/src/native/config.h.in
    hadoop/common/branches/branch-0.22/src/native/src/org/apache/hadoop/io/nativeio/NativeIO.c
    hadoop/common/branches/branch-0.22/src/test/core/org/apache/hadoop/io/nativeio/TestNativeIO.java

Modified: hadoop/common/branches/branch-0.22/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.22/CHANGES.txt?rev=1063615&r1=1063614&r2=1063615&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.22/CHANGES.txt (original)
+++ hadoop/common/branches/branch-0.22/CHANGES.txt Wed Jan 26 07:03:52 2011
@@ -207,6 +207,8 @@ Release 0.22.0 - Unreleased
     HADOOP-6056. Use java.net.preferIPv4Stack to force IPv4.
     (Michele Catasta via shv)
 
+    HADOOP-7110. Implement chmod with JNI. (todd)
+
   OPTIMIZATIONS
 
     HADOOP-6884. Add LOG.isDebugEnabled() guard for each LOG.debug(..).

Modified: hadoop/common/branches/branch-0.22/src/java/org/apache/hadoop/fs/RawLocalFileSystem.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.22/src/java/org/apache/hadoop/fs/RawLocalFileSystem.java?rev=1063615&r1=1063614&r2=1063615&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.22/src/java/org/apache/hadoop/fs/RawLocalFileSystem.java (original)
+++ hadoop/common/branches/branch-0.22/src/java/org/apache/hadoop/fs/RawLocalFileSystem.java Wed Jan 26 07:03:52 2011
@@ -35,6 +35,7 @@ import org.apache.hadoop.classification.
 import org.apache.hadoop.classification.InterfaceStability;
 import org.apache.hadoop.conf.Configuration;
 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.Shell;
 import org.apache.hadoop.util.StringUtils;
@@ -543,8 +544,13 @@ public class RawLocalFileSystem extends 
   @Override
   public void setPermission(Path p, FsPermission permission)
     throws IOException {
-    execCommand(pathToFile(p), Shell.SET_PERMISSION_COMMAND,
-        String.format("%05o", permission.toShort()));
+    if (NativeIO.isAvailable()) {
+      NativeIO.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 {

Modified: hadoop/common/branches/branch-0.22/src/java/org/apache/hadoop/io/nativeio/NativeIO.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.22/src/java/org/apache/hadoop/io/nativeio/NativeIO.java?rev=1063615&r1=1063614&r2=1063615&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.22/src/java/org/apache/hadoop/io/nativeio/NativeIO.java (original)
+++ hadoop/common/branches/branch-0.22/src/java/org/apache/hadoop/io/nativeio/NativeIO.java Wed Jan 26 07:03:52 2011
@@ -74,6 +74,9 @@ public class NativeIO {
   public static native FileDescriptor open(String path, int flags, int mode) throws IOException;
   /** Wrapper around fstat(2) */
   public static native Stat fstat(FileDescriptor fd) throws IOException;
+  /** Wrapper around chmod(2) */
+  public static native void chmod(String path, int mode) throws IOException;
+
   /** Initialize the JNI method ID and class ID cache */
   private static native void initNative();
 

Modified: hadoop/common/branches/branch-0.22/src/native/config.h.in
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.22/src/native/config.h.in?rev=1063615&r1=1063614&r2=1063615&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.22/src/native/config.h.in (original)
+++ hadoop/common/branches/branch-0.22/src/native/config.h.in Wed Jan 26 07:03:52 2011
@@ -82,6 +82,9 @@
 /* Define to the one symbol short name of this package. */
 #undef PACKAGE_TARNAME
 
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
 /* Define to the version of this package. */
 #undef PACKAGE_VERSION
 

Modified: hadoop/common/branches/branch-0.22/src/native/src/org/apache/hadoop/io/nativeio/NativeIO.c
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.22/src/native/src/org/apache/hadoop/io/nativeio/NativeIO.c?rev=1063615&r1=1063614&r2=1063615&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.22/src/native/src/org/apache/hadoop/io/nativeio/NativeIO.c (original)
+++ hadoop/common/branches/branch-0.22/src/native/src/org/apache/hadoop/io/nativeio/NativeIO.c Wed Jan 26 07:03:52 2011
@@ -221,6 +221,25 @@ cleanup:
   return ret;
 }
 
+/**
+ * public static native void chmod(String path, int mode) throws IOException;
+ */
+JNIEXPORT void JNICALL
+Java_org_apache_hadoop_io_nativeio_NativeIO_chmod(
+  JNIEnv *env, jclass clazz, jstring j_path,
+  jint mode)
+{
+  const char *path = (*env)->GetStringUTFChars(env, j_path, NULL);
+  if (path == NULL) return; // JVM throws Exception for us
+
+  if (chmod(path, mode) != 0) {
+    throw_ioe(env, errno);
+  }
+
+  (*env)->ReleaseStringUTFChars(env, j_path, path);
+}
+
+
 /*
  * Throw a java.IO.IOException, generating the message from errno.
  */

Modified: hadoop/common/branches/branch-0.22/src/test/core/org/apache/hadoop/io/nativeio/TestNativeIO.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.22/src/test/core/org/apache/hadoop/io/nativeio/TestNativeIO.java?rev=1063615&r1=1063614&r2=1063615&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.22/src/test/core/org/apache/hadoop/io/nativeio/TestNativeIO.java (original)
+++ hadoop/common/branches/branch-0.22/src/test/core/org/apache/hadoop/io/nativeio/TestNativeIO.java Wed Jan 26 07:03:52 2011
@@ -28,7 +28,11 @@ import static org.junit.Assert.*;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileUtil;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.fs.permission.FsPermission;
 import org.apache.hadoop.util.NativeCodeLoader;
 
 public class TestNativeIO {
@@ -134,4 +138,34 @@ public class TestNativeIO {
     }
   }
 
+  /**
+   * Test basic chmod operation
+   */
+  @Test
+  public void testChmod() throws Exception {
+    try {
+      NativeIO.chmod("/this/file/doesnt/exist", 777);
+      fail("Chmod of non-existent file didn't fail");
+    } catch (NativeIOException nioe) {
+      assertEquals(Errno.ENOENT, nioe.getErrno());
+    }
+
+    File toChmod = new File(TEST_DIR, "testChmod");
+    assertTrue("Create test subject",
+               toChmod.exists() || toChmod.mkdir());
+    NativeIO.chmod(toChmod.getAbsolutePath(), 0777);
+    assertPermissions(toChmod, 0777);
+    NativeIO.chmod(toChmod.getAbsolutePath(), 0000);
+    assertPermissions(toChmod, 0000);
+    NativeIO.chmod(toChmod.getAbsolutePath(), 0644);
+    assertPermissions(toChmod, 0644);
+  }
+
+  private void assertPermissions(File f, int expected) throws IOException {
+    FileSystem localfs = FileSystem.getLocal(new Configuration());
+    FsPermission perms = localfs.getFileStatus(
+      new Path(f.getAbsolutePath())).getPermission();
+    assertEquals(expected, perms.toShort());
+  }
+
 }