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

James Clampffer commented on HDFS-9118:
---------------------------------------

bq. The downside of this approach is that all of the functions calls that 
construct the log message will still be called and construct return strings 
only to throw them away
I agree. I just did some profiling today and a decent chunk of time gets spent 
constructing std::stringstream owned by LogMessage, so that needs to be fixed.

{quote}
Does logging.h require hdfspp/hdfs_ext.h for anything other than the LogData 
declaration (used only by the CForwardingLogger)?
Can we move the CForwardingLogger into hdfs.cc? Since it's C-API-specific, it 
seems to be more tightly bound there than in the logging source file.
{quote}
I also needs the #defines.  I can separate out a header and have hdfs_ext.h and 
logging.h both include that to decouple things.  I can also move the 
CForwardingLogger.

{quote}
In the static log manager methods, we make calls to the logger_impl, calls that 
are explicitly forbidden from being virtual. While I'm not keen on that design 
choice (premature optimization and all that), why not just put the variables 
and code right in the LogManager. Implementations can't override the semantics 
of the calls, so it doesn't appear that we're not gaining any flexibility by 
dereferencing the logger_impl, and there will some (minimal) runtime impact 
(along with increasing the size and complexity of the code). The cleans up the 
LoggerInterface to a single pure virtual method (which is very nice).
{quote}
Good point, I was going to move them into LogManager in the last round and I 
guess I forgot.

bq. I would nix the GET_IMPL_LOCK macro and just copy/paste the code in the few 
places where it needs to be. More explict that way, at the cost of evil 
copypasta.
Sure, I think this was another remnant of when I had a lot more methods getting 
locks or something like that.  Not really that useful now.

{quote}
Upon reflection, do we have a strong use case for having different log levels 
for different components, and enabling and disabling by component? Marking with 
a component for identification I can understand.
{quote}
My main use case is for debugging, and I've been doing a lot of that.  I've 
used it quite a bit lately to focus on what could be a nasty bug in the RPC 
engine; it lets me avoid grepping through the logs.  It's also really 
inexpensive to do so I don't see it hurting anything.  Could always mark it as 
unsupported or something like that.

bq. By my reading, the log currenlty implemented log manager does provide both 
of those guarantees to the CForwardingLogger.
At the moment it does do both of those.  In an earlier design I had it didn't 
but I left those comments to leave some room in case I wanted to change things 
around.  I can strip them out but I don't see making the interface slightly 
more restrictive for the client and implementation more flexible as being too 
bad of a trade.

bq. Should the CForwardingLogger have a const * to the callback set in the ctor 
rather than a setter? We could then get rid of the !callback_ checks.
It wouldn't hurt to have the setter create a new CForwardingLogger when the 
client sets a new callback.  The main reason I did this is so that I can pass a 
null pointer to flush out the old callback and disable logging.  I'm not a big 
fan of having to define no-op callbacks, particularly for stuff with weird 
signatures, to get that same effect.  I'm not too concerned about the runtime 
cost of the check (branch should be super predictable).  My preference would be 
to keep it how it is.

bq. Should LogMessage& LogMessage::operator<<(const std::string *str) log 
"nullptr" if str is null?
Yea, that's a good point.  I'll change that.  Will do the same for the const 
char * version as well.

{quote}
In logging.h, we've commented out:
//std::cerr << "msg ctor called, worth_reporting_=" << worth_reporting_
// << "level = " << level_string() << ", component=" << component_string() << 
std::endl;
It should be removed.
{quote}
Good catch, will fix that and the write to cerr you caught above.

bq. Can we tie ReportError in hdfs.cc to the logging system?
For sure, that would make things really clean.  I'd like to push that into 
another jira just so I can land this soon and minimize how much I have to 
rebase before I do though.




> Add logging system for libdhfs++
> --------------------------------
>
>                 Key: HDFS-9118
>                 URL: https://issues.apache.org/jira/browse/HDFS-9118
>             Project: Hadoop HDFS
>          Issue Type: Sub-task
>          Components: hdfs-client
>    Affects Versions: HDFS-8707
>            Reporter: Bob Hansen
>            Assignee: James Clampffer
>         Attachments: HDFS-9118.HDFS-8707.000.patch, 
> HDFS-9118.HDFS-8707.001.patch, HDFS-9118.HDFS-8707.002.patch
>
>
> With HDFS-9505, we've starting logging data from libhdfs++.  Consumers of the 
> library are going to have their own logging infrastructure that we're going 
> to want to provide data to.  
> libhdfs++ should have a logging library that:
> * Is overridable and can provide sufficient information to work well with 
> common C++ logging frameworks
> * Has a rational default implementation 
> * Is performant



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to