Return-Path: Delivered-To: apmail-hadoop-common-commits-archive@www.apache.org Received: (qmail 86573 invoked from network); 25 Jan 2011 01:16:07 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 25 Jan 2011 01:16:07 -0000 Received: (qmail 7999 invoked by uid 500); 25 Jan 2011 01:16:07 -0000 Delivered-To: apmail-hadoop-common-commits-archive@hadoop.apache.org Received: (qmail 7300 invoked by uid 500); 25 Jan 2011 01:16:06 -0000 Mailing-List: contact common-commits-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: common-dev@hadoop.apache.org Delivered-To: mailing list common-commits@hadoop.apache.org Received: (qmail 6979 invoked by uid 99); 25 Jan 2011 01:16:06 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 25 Jan 2011 01:16:06 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 25 Jan 2011 01:16:03 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 620BA23889B9; Tue, 25 Jan 2011 01:15:42 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: 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/ Date: Tue, 25 Jan 2011 01:15:42 -0000 To: common-commits@hadoop.apache.org From: todd@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110125011542.620BA23889B9@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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()); + } + }