Author: mattf
Date: Tue Jul 19 23:01:45 2011
New Revision: 1148579
URL: http://svn.apache.org/viewvc?rev=1148579&view=rev
Log:
HADOOP-7432. Back-port HADOOP-7110 to 0.20-security: Implement chmod in
NativeIO library. Contributed by Sherry Chen.
Modified:
hadoop/common/branches/branch-0.20-security/CHANGES.txt
hadoop/common/branches/branch-0.20-security/src/core/org/apache/hadoop/fs/RawLocalFileSystem.java
hadoop/common/branches/branch-0.20-security/src/core/org/apache/hadoop/io/nativeio/NativeIO.java
hadoop/common/branches/branch-0.20-security/src/native/config.h.in
hadoop/common/branches/branch-0.20-security/src/native/src/org/apache/hadoop/io/nativeio/NativeIO.c
hadoop/common/branches/branch-0.20-security/src/test/org/apache/hadoop/io/nativeio/TestNativeIO.java
Modified: hadoop/common/branches/branch-0.20-security/CHANGES.txt
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security/CHANGES.txt?rev=1148579&r1=1148578&r2=1148579&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.20-security/CHANGES.txt (original)
+++ hadoop/common/branches/branch-0.20-security/CHANGES.txt Tue Jul 19 23:01:45
2011
@@ -20,6 +20,9 @@ Release 0.20.205.0 - unreleased
HDFS-1836. Thousand of CLOSE_WAIT socket. Contributed by Todd Lipcon,
ported to security branch by Bharath Mundlapudi. (via mattf)
+ HADOOP-7432. Back-port HADOOP-7110 to 0.20-security: Implement chmod
+ in NativeIO library. (Sherry Chen via mattf)
+
Release 0.20.204.0 - unreleased
NEW FEATURES
Modified:
hadoop/common/branches/branch-0.20-security/src/core/org/apache/hadoop/fs/RawLocalFileSystem.java
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security/src/core/org/apache/hadoop/fs/RawLocalFileSystem.java?rev=1148579&r1=1148578&r2=1148579&view=diff
==============================================================================
---
hadoop/common/branches/branch-0.20-security/src/core/org/apache/hadoop/fs/RawLocalFileSystem.java
(original)
+++
hadoop/common/branches/branch-0.20-security/src/core/org/apache/hadoop/fs/RawLocalFileSystem.java
Tue Jul 19 23:01:45 2011
@@ -26,6 +26,7 @@ import java.util.*;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.permission.*;
+import org.apache.hadoop.io.nativeio.NativeIO;
import org.apache.hadoop.util.Progressable;
import org.apache.hadoop.util.StringUtils;
import org.apache.hadoop.util.Shell;
@@ -529,8 +530,13 @@ public class RawLocalFileSystem extends
private void execSetPermission(File f, FsPermission permission)
throws IOException {
- execCommand(f, Shell.SET_PERMISSION_COMMAND,
- String.format("%04o", permission.toShort()));
+ if (NativeIO.isAvailable()) {
+ NativeIO.chmod(f.getCanonicalPath(),
+ permission.toShort());
+ } else {
+ execCommand(f, Shell.SET_PERMISSION_COMMAND,
+ String.format("%04o", permission.toShort()));
+ }
}
private static String execCommand(File f, String... cmd) throws IOException {
Modified:
hadoop/common/branches/branch-0.20-security/src/core/org/apache/hadoop/io/nativeio/NativeIO.java
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security/src/core/org/apache/hadoop/io/nativeio/NativeIO.java?rev=1148579&r1=1148578&r2=1148579&view=diff
==============================================================================
---
hadoop/common/branches/branch-0.20-security/src/core/org/apache/hadoop/io/nativeio/NativeIO.java
(original)
+++
hadoop/common/branches/branch-0.20-security/src/core/org/apache/hadoop/io/nativeio/NativeIO.java
Tue Jul 19 23:01:45 2011
@@ -79,11 +79,13 @@ public class NativeIO {
//TODO: fstat is an old implementation. Doesn't use the cache. This should
be
//changed to use the cache.
public static native Stat fstat(FileDescriptor fd) throws IOException;
+
private static native long getUIDforFDOwnerforOwner(FileDescriptor fd)
throws IOException;
private static native String getUserName(long uid) throws IOException;
/** Initialize the JNI method ID and class ID cache */
private static native void initNative();
-
+ /** Wrapper around chmod(2) */
+ public static native void chmod(String path, int mode) throws IOException;
private static class CachedUid {
final long timestamp;
final String username;
Modified: hadoop/common/branches/branch-0.20-security/src/native/config.h.in
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security/src/native/config.h.in?rev=1148579&r1=1148578&r2=1148579&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.20-security/src/native/config.h.in
(original)
+++ hadoop/common/branches/branch-0.20-security/src/native/config.h.in Tue Jul
19 23:01:45 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.20-security/src/native/src/org/apache/hadoop/io/nativeio/NativeIO.c
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security/src/native/src/org/apache/hadoop/io/nativeio/NativeIO.c?rev=1148579&r1=1148578&r2=1148579&view=diff
==============================================================================
---
hadoop/common/branches/branch-0.20-security/src/native/src/org/apache/hadoop/io/nativeio/NativeIO.c
(original)
+++
hadoop/common/branches/branch-0.20-security/src/native/src/org/apache/hadoop/io/nativeio/NativeIO.c
Tue Jul 19 23:01:45 2011
@@ -266,6 +266,24 @@ cleanup:
return jstr_username;
}
+/**
+ * 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.20-security/src/test/org/apache/hadoop/io/nativeio/TestNativeIO.java
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security/src/test/org/apache/hadoop/io/nativeio/TestNativeIO.java?rev=1148579&r1=1148578&r2=1148579&view=diff
==============================================================================
---
hadoop/common/branches/branch-0.20-security/src/test/org/apache/hadoop/io/nativeio/TestNativeIO.java
(original)
+++
hadoop/common/branches/branch-0.20-security/src/test/org/apache/hadoop/io/nativeio/TestNativeIO.java
Tue Jul 19 23:01:45 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 {
@@ -136,4 +140,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());
+ }
+
}