[ https://issues.apache.org/jira/browse/HDFS-573?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14081336#comment-14081336 ]
Colin Patrick McCabe commented on HDFS-573: ------------------------------------------- Thanks for looking at this, Chris. Looks pretty good. {code} /* Use gcc type-checked format arguments. This is not supported on Windows. */ #ifdef _WIN32 #define TYPE_CHECKED_PRINTF_FORMAT(formatArg, varArgs) #else #define TYPE_CHECKED_PRINTF_FORMAT(formatArg, varArgs) \ __attribute__((format(printf, formatArg, varArgs))) #endif {code} Let's put this in {{platform.h}} rather than {{exception.h}}. It will be useful in a lot of different spots. {code} const tTime NO_CHANGE = -1; {code} Let's make this {{static}} while we're moving it. {code} const char *cPathName; const char* cUserName; const char* cGroupName; {code} nit: stars should be next to the variable name {{jni_helper.c}}: This hash table stuff is not quite correct. For instance, here: {code} static int hashTableInit(void) { if (!gClassRefHTable) { LOCK_HASH_TABLE(); {code} You're checking {{gClassRefHTable}} without the lock, so there's no guarantee that another thread's changes will be visible to you. The code here needs some fixing (and needed some fixing even before your patch-- this isn't something you introduced.) You can see that there's a potential double insert issue here: {code} jthrowable globalClassReference(const char *className, JNIEnv *env, jclass *out) { jclass clsLocalRef; jclass cls = searchEntryFromTable(className); if (cls) { *out = cls; return NULL; } <===== POINT 1 clsLocalRef = (*env)->FindClass(env,className); if (clsLocalRef == NULL) { return getPendingExceptionAndClear(env); } cls = (*env)->NewGlobalRef(env, clsLocalRef); if (cls == NULL) { (*env)->DeleteLocalRef(env, clsLocalRef); return getPendingExceptionAndClear(env); } (*env)->DeleteLocalRef(env, clsLocalRef); insertEntryIntoTable(className, cls); *out = cls; return NULL; {code} Because {{globalClassReference}} drops the lock after {{searchEntryFromTable}}, two threads could both get to POINT 1 at the same time, and end up creating two global class references to the same class. Then the insert would fail for one and we'd have a memory leak. It's better just to have the {{globalClassReference}} function hold the hash table lock the whole way through, and atomically search + insert if not present. We also don't need the silly LOCK_HASH_TABLE macros (a macro for one ordinary function call?), or really any of the hash table wrapper functions. Check out the HADOOP-10388 branch, this is fixed there. Again, I realize you didn't break this, but while we're in this code, let's fix it :) {code} char *hadoopClassPathVMArg = "-Djava.class.path="; {code} If this doesn't change it should be {{const char * const}}. {code} hdfsBuilderSetNameNodePort(bld, (tPort)port); {code} Can we avoid this typecast by making port be a variable of type {{tPort}}? Same comment in {{hdfsSingleNameNodeConnect}}. thanks Chris > Porting libhdfs to Windows > -------------------------- > > Key: HDFS-573 > URL: https://issues.apache.org/jira/browse/HDFS-573 > Project: Hadoop HDFS > Issue Type: Improvement > Components: libhdfs > Environment: Windows, Visual Studio 2008 > Reporter: Ziliang Guo > Assignee: Chris Nauroth > Attachments: HDFS-573.1.patch > > Original Estimate: 336h > Remaining Estimate: 336h > > The current C code in libhdfs is written using C99 conventions and also uses > a few POSIX specific functions such as hcreate, hsearch, and pthread mutex > locks. To compile it using Visual Studio would require a conversion of the > code in hdfsJniHelper.c and hdfs.c to C89 and replacement/reimplementation of > the POSIX functions. The code also uses the stdint.h header, which is not > part of the original C89, but there exists what appears to be a BSD licensed > reimplementation written to be compatible with MSVC floating around. I have > already done the other necessary conversions, as well as created a simplistic > hash bucket for use with hcreate and hsearch and successfully built a DLL of > libhdfs. Further testing is needed to see if it is usable by other programs > to actually access hdfs, which will likely happen in the next few weeks as > the Condor Project continues with its file transfer work. > In the process, I've removed a few what I believe are extraneous consts and > also fixed an incorrect array initialization where someone was attempting to > initialize with something like this: JavaVMOption options[noArgs]; where > noArgs was being incremented in the code above. This was in the > hdfsJniHelper.c file, in the getJNIEnv function. -- This message was sent by Atlassian JIRA (v6.2#6252)