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/25 02:15:42 UTC
svn commit: r1063090 - in /hadoop/common/trunk: ./
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: Tue Jan 25 01:15:41 2011
New Revision: 1063090
URL: http://svn.apache.org/viewvc?rev=1063090&view=rev
Log:
HADOOP-7110. Implement chmod with JNI. Contributed by Todd Lipcon
Modified:
hadoop/common/trunk/CHANGES.txt
hadoop/common/trunk/src/java/org/apache/hadoop/fs/RawLocalFileSystem.java
hadoop/common/trunk/src/java/org/apache/hadoop/io/nativeio/NativeIO.java
hadoop/common/trunk/src/native/config.h.in
hadoop/common/trunk/src/native/src/org/apache/hadoop/io/nativeio/NativeIO.c
hadoop/common/trunk/src/test/core/org/apache/hadoop/io/nativeio/TestNativeIO.java
Modified: hadoop/common/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/CHANGES.txt?rev=1063090&r1=1063089&r2=1063090&view=diff
==============================================================================
--- hadoop/common/trunk/CHANGES.txt (original)
+++ hadoop/common/trunk/CHANGES.txt Tue Jan 25 01:15:41 2011
@@ -266,6 +266,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/trunk/src/java/org/apache/hadoop/fs/RawLocalFileSystem.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/src/java/org/apache/hadoop/fs/RawLocalFileSystem.java?rev=1063090&r1=1063089&r2=1063090&view=diff
==============================================================================
--- hadoop/common/trunk/src/java/org/apache/hadoop/fs/RawLocalFileSystem.java (original)
+++ hadoop/common/trunk/src/java/org/apache/hadoop/fs/RawLocalFileSystem.java Tue Jan 25 01:15:41 2011
@@ -36,6 +36,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;
@@ -554,8 +555,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/trunk/src/java/org/apache/hadoop/io/nativeio/NativeIO.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/src/java/org/apache/hadoop/io/nativeio/NativeIO.java?rev=1063090&r1=1063089&r2=1063090&view=diff
==============================================================================
--- hadoop/common/trunk/src/java/org/apache/hadoop/io/nativeio/NativeIO.java (original)
+++ hadoop/common/trunk/src/java/org/apache/hadoop/io/nativeio/NativeIO.java Tue Jan 25 01:15:41 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/trunk/src/native/config.h.in
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/src/native/config.h.in?rev=1063090&r1=1063089&r2=1063090&view=diff
==============================================================================
--- hadoop/common/trunk/src/native/config.h.in (original)
+++ hadoop/common/trunk/src/native/config.h.in Tue Jan 25 01:15:41 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/trunk/src/native/src/org/apache/hadoop/io/nativeio/NativeIO.c
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/src/native/src/org/apache/hadoop/io/nativeio/NativeIO.c?rev=1063090&r1=1063089&r2=1063090&view=diff
==============================================================================
--- hadoop/common/trunk/src/native/src/org/apache/hadoop/io/nativeio/NativeIO.c (original)
+++ hadoop/common/trunk/src/native/src/org/apache/hadoop/io/nativeio/NativeIO.c Tue Jan 25 01:15:41 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/trunk/src/test/core/org/apache/hadoop/io/nativeio/TestNativeIO.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/src/test/core/org/apache/hadoop/io/nativeio/TestNativeIO.java?rev=1063090&r1=1063089&r2=1063090&view=diff
==============================================================================
--- hadoop/common/trunk/src/test/core/org/apache/hadoop/io/nativeio/TestNativeIO.java (original)
+++ hadoop/common/trunk/src/test/core/org/apache/hadoop/io/nativeio/TestNativeIO.java Tue Jan 25 01:15:41 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());
+ }
+
}