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

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

This patch didn't quite apply for me.  I think you might have to rebase.

Good job creating hdfs_strerror.  I think it will make printing error messages 
a lot easier.  Just a few notes: you don't have to check for sys_errlist[x] == 
NULL; these strings can't be NULL.

I also think that libhdfs will probably want to use hdfs_strerror.  Perhaps we 
should move it to 
hadoop-hdfs-project/hadoop-hdfs/src/main/native/util/posix_util.c.  It will be 
useful on any POSIX operating system, so I think it belongs there.

I notice a few places where you are setting {{errno}} and then calling another 
function such as {{fprintf}}.  Unfortunately, the {{fprintf}} function might 
change the value of {{errno}}.  This mistake is unfortunately very easy to make 
even if you know about this problem.  This is one reason why I strongly 
recommend the "de-errnoificiation" of APIs.

For example if you have an API that returns a struct Foo*, but could have an 
error, it's usually better to do this:
{code}
int doStuff(struct Foo **foo)  __attribute__ ((warn_unused_result));
{code}

Than to do this:
{code}
struct Foo* doStuff(void); // sets errno on error
{code}

The second, errno-based one may *look* simpler, but danger lurks.  It's very 
easy for the implementor to forget to set {{errno}} correctly somewhere in 
doStuff, or to call one of the many functions which overwrite it.  The caller 
may also forget to check for NULL, or overwrite the {{errno}} value before 
checking it.

So I would really recommend that you get rid of all the places where you're 
setting errno to increase maintainability in the future.  (except the places 
where you're forced to because you're implementing the libhdfs API.)

I also find it really confusing that "Response" is actually a pointer to a 
structure.  I do not expect something to be a pointer unless it has the "*".  
This is very important because it makes it confusing to read code which appears 
to be copying structures, but is actually just passing around pointers to them. 
 Can we just make Response a normal structure type, rather than a typedef?  I 
don't think hitting the * key is an undue hardship, and it would make the code 
so much more readable.  Same thing goes for ResponseBuffer-- just make it a 
regular old structure, and you won't need ResponseBufferInternal at all.  
typedefs are kind of like macros-- you should use them very sparingly and only 
when there's a really good reason.

Overall, thanks for doing this cleanup.  I especially like the new comments.
                
> libwebdhfs code cleanup: string processing and using strerror consistently to 
> handle all errors
> -----------------------------------------------------------------------------------------------
>
>                 Key: HDFS-3920
>                 URL: https://issues.apache.org/jira/browse/HDFS-3920
>             Project: Hadoop HDFS
>          Issue Type: Sub-task
>            Reporter: Jing Zhao
>            Assignee: Jing Zhao
>         Attachments: HDFS-3920-001.patch, HDFS-3920-001.patch, 
> HDFS-3920-002.patch, HDFS-3920-003.patch, HDFS-3920-004.patch, 
> HDFS-3920-005.patch
>
>
> 1. Clean up code for string processing;
> 2. Using strerror consistently for error handling;
> 3. Use sprintf to replace decToOctal
> 4. other issues requiring fixing.

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