[ 
https://issues.apache.org/jira/browse/HDFS-4712?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13716650#comment-13716650
 ] 

Colin Patrick McCabe commented on HDFS-4712:
--------------------------------------------

{code}
+    if (jVal.l == NULL) 
+        strcpy(dataNodeInfos->hostName,"");
+    else 
+        jExc =  newCStr(env, jVal.l, &dataNodeInfos->hostName);
{code}

You want {{dataNodeInfos->hostName = strdup("")}} here

{code}
+    typedef struct  hdfsDataNodeInfo_s {
+        long capacity;        /* The raw capacity */
+        long dfsUsed;         /* The used space by the data node*/
+        char *hostName;       /* HostName as supplied by the datanode during 
registration as its name*/
+        tTime lastUpdate;     /* The time when this information was accurate */
+        char *location;       /* The rack name */
+        long remaining;       /* The raw free space */
+        short xceiverCount;   /* The  number of active connections */
+    } hdfsDataNodeInfo;
{code}

Please use {{int64_t}} instead of {{long}} here.  {{long}} has different sizes 
on different architectures, but these quantities should always be 64-bit.  I 
think it makes more sense to use {{uint32_t}} for xceiverCount, since I don't 
know if "32767 will be enough for anyone."

{code}
+         if (hdfsDataNodeInfos[i]->hostName) {
+            free(hdfsDataNodeInfos[i]->hostName);
+          }
+         if (hdfsDataNodeInfos[i]->location) {
+            free(hdfsDataNodeInfos[i]->location);
+        }
{code}
You don't need to test if something is NULL before calling {{free}} on it.  
{{free}} ignores NULL pointers.

{{hdfsGetDataNodeInfo}}: the error handling is wrong here.  You should return 
NULL when there is an error.  You must also free the memory you've allocated on 
this line:
{code}
+    dataNodeInfoList = calloc(jNumDataNodeInfos, sizeof(hdfsDataNodeInfo*));
{code}

It is preferrable to use a pattern like this:
{code}
  if (bad thing) {
    ret = EIO;
    goto done;
  }

done:
  if (ret) {
    free(resources);
    resources = NULL;
    errno = ret;
  }
  return resources;
{code}

This way:
* You always free the resources on error.
* setting errno is the last thing you do, and won't be overwritten by another 
function call.
* You return NULL on error rather than a bogus pointer.

thanks
                
> New libhdfs method hdfsGetDataNodes
> -----------------------------------
>
>                 Key: HDFS-4712
>                 URL: https://issues.apache.org/jira/browse/HDFS-4712
>             Project: Hadoop HDFS
>          Issue Type: New Feature
>          Components: libhdfs
>            Reporter: andrea manzi
>         Attachments: HDFS-4712.patch, hdfs.c.diff, hdfs.h.diff
>
>
> we have implemented a possible extension to libhdfs to retrieve information 
> about the available datanodes ( there was a mail on the hadoop-hdsf-dev 
> mailing list initially abut this :
> http://mail-archives.apache.org/mod_mbox/hadoop-hdfs-dev/201204.mbox/%3CCANhO-
> [email protected]%3E)
> i would like to know how to proceed to create a patch, cause on the wiki 
> http://wiki.apache.org/hadoop/HowToContribute i can see info about JAVA 
> patches but nothing related to extensions in C.

--
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

Reply via email to