HADOOP-7110. Implement chmod with JNI. Contributed by Todd Lipcon
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1063090 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
a15d473c46
commit
448f8dbb9f
|
@ -266,6 +266,8 @@ Release 0.22.0 - Unreleased
|
||||||
HADOOP-6056. Use java.net.preferIPv4Stack to force IPv4.
|
HADOOP-6056. Use java.net.preferIPv4Stack to force IPv4.
|
||||||
(Michele Catasta via shv)
|
(Michele Catasta via shv)
|
||||||
|
|
||||||
|
HADOOP-7110. Implement chmod with JNI. (todd)
|
||||||
|
|
||||||
OPTIMIZATIONS
|
OPTIMIZATIONS
|
||||||
|
|
||||||
HADOOP-6884. Add LOG.isDebugEnabled() guard for each LOG.debug(..).
|
HADOOP-6884. Add LOG.isDebugEnabled() guard for each LOG.debug(..).
|
||||||
|
|
|
@ -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;
|
||||||
|
@ -554,8 +555,13 @@ public class RawLocalFileSystem extends FileSystem {
|
||||||
@Override
|
@Override
|
||||||
public void setPermission(Path p, FsPermission permission)
|
public void setPermission(Path p, FsPermission permission)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
execCommand(pathToFile(p), Shell.SET_PERMISSION_COMMAND,
|
if (NativeIO.isAvailable()) {
|
||||||
String.format("%05o", permission.toShort()));
|
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 {
|
private static String execCommand(File f, String... cmd) throws IOException {
|
||||||
|
|
|
@ -74,6 +74,9 @@ public class NativeIO {
|
||||||
public static native FileDescriptor open(String path, int flags, int mode) throws IOException;
|
public static native FileDescriptor open(String path, int flags, int mode) throws IOException;
|
||||||
/** Wrapper around fstat(2) */
|
/** Wrapper around fstat(2) */
|
||||||
public static native Stat fstat(FileDescriptor fd) throws IOException;
|
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 */
|
/** Initialize the JNI method ID and class ID cache */
|
||||||
private static native void initNative();
|
private static native void initNative();
|
||||||
|
|
||||||
|
|
|
@ -82,6 +82,9 @@
|
||||||
/* Define to the one symbol short name of this package. */
|
/* Define to the one symbol short name of this package. */
|
||||||
#undef PACKAGE_TARNAME
|
#undef PACKAGE_TARNAME
|
||||||
|
|
||||||
|
/* Define to the home page for this package. */
|
||||||
|
#undef PACKAGE_URL
|
||||||
|
|
||||||
/* Define to the version of this package. */
|
/* Define to the version of this package. */
|
||||||
#undef PACKAGE_VERSION
|
#undef PACKAGE_VERSION
|
||||||
|
|
||||||
|
|
|
@ -221,6 +221,25 @@ cleanup:
|
||||||
return ret;
|
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.
|
* Throw a java.IO.IOException, generating the message from errno.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -28,7 +28,11 @@ import static org.junit.Assert.*;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.fs.FileUtil;
|
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;
|
import org.apache.hadoop.util.NativeCodeLoader;
|
||||||
|
|
||||||
public class TestNativeIO {
|
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());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue