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

James Clampffer commented on HDFS-9103:
---------------------------------------

"Every node in the set requires a separate heap allocation. They might scatter 
around the address space. vector is on the heap as well but it guarantees 
continuous amount of memory. Some implementation of string has inlined buffer 
which has much better cache locality results."
I agree with both of those statements.  Do datanode IDs have a max length, is 
it just uuid?  SSO is usually limited to 23 chars on 64 bit machines.  Intel 
processors have 8-way associative caches for now so I'm not terribly worried 
about address space fragmentation.  The processor has to try a little harder 
because it's not a simple linear prefetch to scoop up the vector anymore, but 
superscalar pipelines have multiple load units :)

I think I might try out a more architectural fix to side-step this whole 
problem(why I didn't get a patch up yet).  How about passing a function 
"IsDead(const std::string& dn)" through the InputStream down to the block 
reader.  My current approach of generating a new set or vector of bad nodes on 
every calls is terribly inefficient.  Even if SSO kicked in and it boiled down 
to a memcpy there's still a smallish heap allocation for every 
GetNodesToExclude call.  Passing down a function avoids keeping the redundant 
copies in cache to begin with.  I'd change BadDataNodeTracker::bad_datanodes_ 
to a map (this is what it always should have been, not sure why I thought a set 
of pairs keyed by pair::first was a good idea...).  The IsDead function would 
grab the update lock which is usually implemented as a CAS in userspace, and do 
a O(log(n)) map lookup.  In my experience the log2(smallish number) 
indirections with std::map that lookup shouldn't come close to bottlenecking 
anything.  Do you see any obvious issues with this approach?

"Checking with the code kResourceUnavailable is only for the NN cannot find any 
DNs to serve this data. I don't think we'll need to handle this case when 
excluding the DNs."
Thanks for the info.  I was hoping this was the case but wasn't sure if I was 
missing something that would be added soon.

> Retry reads on DN failure
> -------------------------
>
>                 Key: HDFS-9103
>                 URL: https://issues.apache.org/jira/browse/HDFS-9103
>             Project: Hadoop HDFS
>          Issue Type: Sub-task
>          Components: hdfs-client
>            Reporter: Bob Hansen
>            Assignee: James Clampffer
>             Fix For: HDFS-8707
>
>         Attachments: HDFS-9103.1.patch, HDFS-9103.2.patch, 
> HDFS-9103.HDFS-8707.006.patch, HDFS-9103.HDFS-8707.3.patch, 
> HDFS-9103.HDFS-8707.4.patch, HDFS-9103.HDFS-8707.5.patch
>
>
> When AsyncPreadSome fails, add the failed DataNode to the excluded list and 
> try again.



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

Reply via email to