[
https://issues.apache.org/jira/browse/HADOOP-9232?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13564593#comment-13564593
]
Chris Nauroth commented on HADOOP-9232:
---------------------------------------
Thanks, Ivan. I applied the patch locally and tested a few HDFS operations and
MapReduce jobs. I didn't need to override the config to
{{ShellBasedUnixGroupsMapping}}. It worked great! I also did a build with
-Pnative in an Ubuntu VM to confirm that it didn't accidentally harm native
compilation on Linux.
Here are a few questions:
1. Regarding {{throw_ioe}}, it looks like an almost-copy of the #ifdef WINDOWS
path of the function in {{NativeIO.c}}. Can we refactor and reuse the same
{{throw_ioe}} everywhere, or is that too cumbersome?
2. Assuming that the answer to #1 is that we really need to keep a separate
{{throw_ioe}} in here, then is it intentional that this version uses
LPSTR/FormatMessageA, whereas the version in {{NativeIO.c}} uses
LPWSTR/FormatMessageW?
{code}
...
LPSTR buffer = NULL;
const char* message = NULL;
len = FormatMessageA(
...
{code}
3. Once again assuming that we need to keep the separate {{throw_ioe}}, I don't
think we need to NULL out buffer before returning. For the version in
{{NativeIO.c}}, this was required to prevent a double-free later in the control
flow, but this version only has one possible path to calling {{LocalFree}}.
{code}
...
LocalFree(buffer);
buffer = NULL;
return;
}
{code}
4. Is the following code not thread-safe?
{code}
...
static jobjectArray emptyGroups = NULL;
...
if (emptyGroups == NULL) {
jobjectArray lEmptyGroups = (jobjectArray)(*env)->NewObjectArray(env, 0,
(*env)->FindClass(env, "java/lang/String"), NULL);
if (lEmptyGroups == NULL) {
goto cleanup;
}
emptyGroups = (*env)->NewGlobalRef(env, lEmptyGroups);
if (emptyGroups == NULL) {
goto cleanup;
}
}
{code}
For example, assume 2 threads concurrently call {{getGroupForUser}}. Thread 1
executes the NULL check, enters the if body, and then gets suspended by the OS.
Thread 2 executes and {{emptyGroups}} is still NULL, so it initializes it.
Then, the OS resumes thread 1, which proceeds inside the if body and calls
NewObjectArray again. Since {{emptyGroups}} never gets freed, I believe the
net effect would be a small memory leak.
5. On the {{THROW}} calls, can we add strings that describe the point of
failure (i.e. "Couldn't allocate memory for user") instead of NULL for the
third argument?
{code}
user = (*env)->GetStringChars(env, juser, NULL);
if (user == NULL) {
THROW(env, "java/lang/OutOfMemoryError", NULL);
goto cleanup;
}
{code}
Thanks, again!
> JniBasedUnixGroupsMappingWithFallback fails on Windows with
> UnsatisfiedLinkError
> --------------------------------------------------------------------------------
>
> Key: HADOOP-9232
> URL: https://issues.apache.org/jira/browse/HADOOP-9232
> Project: Hadoop Common
> Issue Type: Bug
> Components: native, security
> Affects Versions: trunk-win
> Reporter: Chris Nauroth
> Assignee: Ivan Mitic
> Attachments: HADOOP-9232.branch-trunk-win.jnigroups.2.patch,
> HADOOP-9232.branch-trunk-win.jnigroups.patch
>
>
> {{JniBasedUnixGroupsMapping}} calls native code which isn't implemented
> properly for Windows, causing {{UnsatisfiedLinkError}}. The fallback logic
> in {{JniBasedUnixGroupsMappingWithFallback}} works by checking if the native
> code is loaded during startup. In this case, hadoop.dll is present and
> loaded, but it doesn't contain the right code. There will be no attempt to
> fallback to {{ShellBasedUnixGroupsMapping}}.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira