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

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

[~stev...@iseran.com]: Hmm.  I don't see much advantage in making 
non-positional reads concurrent.  When two threads do non-positional reads, 
they inherently interfere with each other by modifying the position.  So 
concurrent non-positional reads would not be very useful for most programmers, 
since you would basically not know what offset your read was starting at.  it 
would depend on the peculiarities of thread timing.

Concurrent positional reads (preads) are useful precisely because they don't 
have this problem.  You're not sharing a stream position with any other thread, 
so you know what you're getting with your pread.

I think if we do allow concurrent non-positional reads, we should also document 
that this is optional, and that the stream never reads the same byte offset 
more than once.

bq. getPos() may block for an arbitrary amount of time if another thread is 
attempting to perform a positioned read and is having some problem 
communicating with the far end.  Is that something we really want? Is it 
something people expect?

HDFS has has this behavior for a long time. I checked back in Hadoop 0.20 and 
the {{synchronized}} is there on getPos and read.  I would be ok with getPos 
returning the position locklessly (perhaps from an AtomicLong?) but to my 
knowledge, nobody has ever requested that we change this.

{{pread}} should never affect the output of {{getPos}}.  That would go against 
the basic guarantee of positional read: that it doesn't alter the current 
stream position.  It doesn't really help FSes that implement pread as 
seek+read+seek, either.  Those filesystems have a basic problem-- the inability 
to do concurrent preads-- that weakening the {{getPos}} guarantee can't 
possibly solve.  The real solution is to add a better pread implementation to 
those filesystems.

(I do not think that concurrent pread should be required of all hadoop FSes, 
but it should be highly encouraged for all implementors.  And implementing 
pread as seek+read+seek should be highly discouraged)

I like the idea of saying that operations in "group P" (read, seek, skip, 
zero-copy read, releaseBuffer) can block each other, and every other operation 
is asynchronous.  I think that fits the needs of HBase, MR, and other clients 
needs very well; what do you think?

> Documenting DFSClient#DFSInputStream expectations reading and preading in 
> concurrent context
> --------------------------------------------------------------------------------------------
>
>                 Key: HDFS-6803
>                 URL: https://issues.apache.org/jira/browse/HDFS-6803
>             Project: Hadoop HDFS
>          Issue Type: Sub-task
>          Components: hdfs-client
>    Affects Versions: 2.4.1
>            Reporter: stack
>         Attachments: DocumentingDFSClientDFSInputStream (1).pdf
>
>
> Reviews of the patch posted the parent task suggest that we be more explicit 
> about how DFSIS is expected to behave when being read by contending threads. 
> It is also suggested that presumptions made internally be made explicit 
> documenting expectations.
> Before we put up a patch we've made a document of assertions we'd like to 
> make into tenets of DFSInputSteam.  If agreement, we'll attach to this issue 
> a patch that weaves the assumptions into DFSIS as javadoc and class comments. 



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to