[saga-rg] SAGA spec proof read

Andre Merzky andre at merzky.net
Fri Jun 9 06:03:42 CDT 2006


Hi Pascal, 

thanks for the agreement!  I hope my comments have not been
too confusing... :-)

We should keep all the points you raised in mind, and cross
check if the message API indeed solves these issues.

Cheers, Andre.


Quoting [Pascal Kleijer] (Jun 09 2006):
> Date: Fri, 09 Jun 2006 17:35:11 +0900
> From: Pascal Kleijer <k-pasukaru at ap.jp.nec.com>
> To: Andre Merzky <andre at merzky.net>
> CC: saga-rg at ggf.org
> Subject: Re: [saga-rg] SAGA spec proof read
> 
> Hi Andre,
> 
> I have taken some time to digest your comments and assess the situation. 
> Your arguments are reasonable and accurate and see where you want to go. 
> I would then agree on the current proposal and defer these issues to the 
> messaging API. The messaging API should ensure the requirements that I 
> could imagine.
> 
> >Hi Pascal, 
> >
> >comments to the comments... :-)
> >
> >(removed some topics, agreed with them, and will change
> >accordingly)
> >
> >
> >Quoting [Pascal Kleijer] (Jun 09 2006):
> >>Hi,
> >>
> >>some in-line comments...
> >>
> >>
> >>>>Some extensions:
> >>>>Purpose: ?Reads up to ?size? bytes of data from the stream into an 
> >>>>array of bytes. An attempt is made to read as many as ?size? bytes, but 
> >>>>a smaller number but may be read. The number of bytes actually read is 
> >>>>returned as ?nbytes?. If ?size? is zero, then no bytes are read and 
> >>>>nbytes is 0; otherwise, there is an attempt to read at least one byte.?
> >>>That should already be the case - that is why 'nbytes' is
> >>>returned, indicating the actual number of bytes copied.
> >>>nbytes can be smaller than size w/o posing an error
> >>>condition (as in POSIX).  Is that what you propose?
> >>Well I think the whole description should be redone based on the 
> >>blocking or not behavior. Also the 'nbytes' returned should add, like in 
> >>POSIX, the error code (negative). IF a new read is made after an fatal 
> >>error, then the exception should kick in. See below.
> >
> >See below.
> >
> >>>>3. In this implementation we have no choice but to wait for an 
> >>>>exception to be thrown when the stream has dried up (use the read 
> >>>>method). It would be nice to have -1 set to nbytes to first time the 
> >>>>end of stream is reached (if applies), then the next call to read will 
> >>>>throw an exception.
> >>>What is the error condition the exception is supposed to
> >>>catch:
> >>>
> >>> - stream died
> >>> - no data available
> >>>
> >>>The first one is available via the state of the stream.
> >>>
> >>>The second one is what you refer to, right?  But I think
> >>>that this is not an error condition which should raise an
> >>>exception: data might be available again a second later.
> >>>
> >>>If data availability poses an error condition or not should
> >>>be decided on application level IMHO.  
> >>>
> >>>Am I missing something?
> >>Basically the exception should be thrown if the last read did return 
> >>with an error. If the error was rectified in the mean time, the read 
> >>should go one as a new call. Therefore the state machine is important to 
> >>have, because a change of state will flush the last error.
> >
> >I am not sure if I would agree with this one.
> >
> >Assume the following pseudo code:
> >
> >
> > char chache[10] = "";
> > int  nbytes;
> >
> > while ( nbytes = socket.read (cache, 10))
> > {
> >   if ( 0 > nbytes )
> >   { 
> >     print (cache);
> >   }
> >   else
> >   { 
> >     sleep (1);
> >   }  
> > }
> >
> >
> >Adding an exception on the second failed read breaks that
> >schema, and makes code more complex.  Why?  Because the
> >application has to explicitely keep track of the stream
> >state.
> >
> >However, POSIX and most other stream APIs I can think of
> >would fully support the schema above.
> >
> >Also, what is the application supposed to do after the first
> >non-read?  It is bound to eventually try again, and raise an
> >exception.
> >
> >However, that is related to the next point you raise...
> >
> >(PS.: new data would not change the state, really, in the
> >sense of state diagram...)
> >
> >
> >>>>4. There is no way to check the size of the data waiting for read. It 
> >>>>would be nice if we can query the stream on how many bytes in the pipe 
> >>>>are waiting. This is important if the client must allocate a buffer to 
> >>>>read this data. So an additional method like ?available? should be 
> >>>>added. Note that this will slightly overlap with the ?wait? method for 
> >>>>?read? or ?any? mask, but will return a more accurate figure. Another 
> >>>>solution is to extend the wait method.
> >>>I would have no idea how to implement that on a stream:
> >>>without an additional protocol, you have no chance to know
> >>>how many bytes will arrive.
> >>>
> >>>However, that is one of the reasons why the message API was
> >>>proposed: that implies an additional protocol on the wire,
> >>>but will allow the application to query the message size
> >>>before performing the message read.
> >>I don't say how many will arrive, but how many 'has' arrived. That mean 
> >>how many are currently stored somewhere within the stream and that are 
> >>ensured to be returned when the next call the read is done. In that case 
> >>we can test for a possible block (if blocking) and size of the buffer to 
> >>allocate (if necessary) as well as to avoid a catch block.
> >
> >Even that would be difficult to implement.  Assume you
> >implement that on a BSD socket.  If you do that strainght
> >forward, so just map the read to a socket read etc, you
> >don't have that test call.
> >
> >If you want to provide the test call, you have to
> >continously READ the data from the socket, to push it into a
> >cache, and to return the current size of the cache on the
> >test call.
> >
> >  - How much do you cache?  1kB?  1MB? 1GB?
> >  - How do you know that the app actually wants all the
> >    data?
> >  - you imply the existence of a thread in the SAGA
> >    implementation which continously reads on the stream
> >  - you loose zero copy, so degrade performance
> >
> >These are again exactly the problems the message API is
> >supposed to solve - there the cache size is given by the
> >message size, and it is assumed that the application is
> >interested in one complete message, at least.  And zero copy
> >should be preserved as the message size will be known in
> >advance.
> >
> >Cheers, Andre.
-- 
"So much time, so little to do..."  -- Garfield





More information about the saga-rg mailing list