[
https://issues.apache.org/jira/browse/HADOOP-7682?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13257676#comment-13257676
]
Dave Latham commented on HADOOP-7682:
-------------------------------------
Here's my understanding of this issue from digging around a bit in case it's
helpful for others. I could be mistaken on some of the details.
Some time ago, RawLocalFileSystem.setPermission used to use a shell exec
command to fork a process to alter permissions of a file.
Somewhere along the 0.20 branch (I believe in the 0.20.security branch) it was
decided that this was too slow, and instead
java.io.File.set{Readable|Writable|Executable} should be used (see HADOOP-6304
for one such issue. It has a patch with the logic that wound up in FileUtil
though perhaps committed from a different patch). However the java.io.File
methods don't allow one to directly set all the permissions so the code first
has to clear permissions, then build them up again. This resulted in two
problems. First, there is a race condition when the file briefly has no
permissions even for the owner (see MAPREDUCE-2238 for more detail). Second,
Windows doesn't support clearing all permissions on the file (this JIRA).
The first problem was worked around in HADOOP-7110 (HADOOP-7432 backported it
to this branch) by using JNI native code instead. However, if the native code
is not available, then it falls back to the java.io.File methods. So, the
second problem still remains, that FileUtil.setPermission (and thus the
RawLocalFileSystem setPermission) does not work on Windows because Windows does
not have the native code implementation and also fails the java.io.File
fallback.
The issues FKorning ran into in a comment above appear to be wider than this
particular JIRA, though I may have misunderstood what led to his shorn yak.
Windows is listed as a supported platform for Hadoop, and some of our
developers use Windows as a development environment, so it's important for us
that hadoop at least functions on Windows, even if it's not as performant as
our production clusters on Linux. I noted that this is currently the highest
voted open JIRA for hadoop.
In order for it to function on Windows, I added a final fallback in
FileUtil.setPermission to revert to the older behavior of using a shell exec
fork for setPermission when the other methods fail. Perhaps it will be helpful
for others:
{code}
public static void setPermission(File f, FsPermission permission
) throws IOException {
FsAction user = permission.getUserAction();
FsAction group = permission.getGroupAction();
FsAction other = permission.getOtherAction();
// use the native/fork if the group/other permissions are different
// or if the native is available
if (group != other || NativeIO.isAvailable()) {
execSetPermission(f, permission);
return;
}
try
{
boolean rv = true;
// read perms
rv = f.setReadable(group.implies(FsAction.READ), false);
checkReturnValue(rv, f, permission);
if (group.implies(FsAction.READ) != user.implies(FsAction.READ)) {
f.setReadable(user.implies(FsAction.READ), true);
checkReturnValue(rv, f, permission);
}
// write perms
rv = f.setWritable(group.implies(FsAction.WRITE), false);
checkReturnValue(rv, f, permission);
if (group.implies(FsAction.WRITE) != user.implies(FsAction.WRITE)) {
f.setWritable(user.implies(FsAction.WRITE), true);
checkReturnValue(rv, f, permission);
}
// exec perms
rv = f.setExecutable(group.implies(FsAction.EXECUTE), false);
checkReturnValue(rv, f, permission);
if (group.implies(FsAction.EXECUTE) !=
user.implies(FsAction.EXECUTE)) {
f.setExecutable(user.implies(FsAction.EXECUTE), true);
checkReturnValue(rv, f, permission);
}
}
catch (IOException ioe)
{
LOG.warn("Java file permissions failed to set " + f + " to " +
permission + " falling back to fork");
execSetPermission(f, permission);
}
}
{code}
> taskTracker could not start because "Failed to set permissions" to "ttprivate
> to 0700"
> --------------------------------------------------------------------------------------
>
> Key: HADOOP-7682
> URL: https://issues.apache.org/jira/browse/HADOOP-7682
> Project: Hadoop Common
> Issue Type: Bug
> Components: fs
> Affects Versions: 0.20.203.0, 0.20.205.0, 1.0.0
> Environment: OS:WindowsXP SP3 , Filesystem :NTFS, cygwin 1.7.9-1,
> jdk1.6.0_05
> Reporter: Magic Xie
>
> ERROR org.apache.hadoop.mapred.TaskTracker:Can not start task tracker because
> java.io.IOException:Failed to set permissions of
> path:/tmp/hadoop-cyg_server/mapred/local/ttprivate to 0700
> at
> org.apache.hadoop.fs.RawLocalFileSystem.checkReturnValue(RawLocalFileSystem.java:525)
> at
> org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:499)
> at
> org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:318)
> at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:183)
> at org.apache.hadoop.mapred.TaskTracker.initialize(TaskTracker.java:635)
> at org.apache.hadoop.mapred.TaskTracker.(TaskTracker.java:1328)
> at org.apache.hadoop.mapred.TaskTracker.main(TaskTracker.java:3430)
> Since hadoop0.20.203 when the TaskTracker initialize, it checks the
> permission(TaskTracker Line 624) of
> (org.apache.hadoop.mapred.TaskTracker.TT_LOG_TMP_DIR,org.apache.hadoop.mapred.TaskTracker.TT_PRIVATE_DIR,
>
> org.apache.hadoop.mapred.TaskTracker.TT_PRIVATE_DIR).RawLocalFileSystem(http://svn.apache.org/viewvc/hadoop/common/tags/release-0.20.203.0/src/core/org/apache/hadoop/fs/RawLocalFileSystem.java?view=markup)
> call setPermission(Line 481) to deal with it, setPermission works fine on
> *nx, however,it dose not alway works on windows.
> setPermission call setReadable of Java.io.File in the line 498, but according
> to the Table1 below provided by oracle,setReadable(false) will always return
> false on windows, the same as setExecutable(false).
> http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/enhancements/
> is it cause the task tracker "Failed to set permissions" to "ttprivate to
> 0700"?
> Hadoop 0.20.202 works fine in the same environment.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira