[saga-rg] SAGA spec proof read

Pascal Kleijer k-pasukaru at ap.jp.nec.com
Fri Jun 9 03:35:11 CDT 2006


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


-- 

Best regards,
Pascal Kleijer

----------------------------------------------------------------
   HPC Marketing Promotion Division, NEC Corporation
   1-10, Nisshin-cho, Fuchu, Tokyo, 183-8501, Japan.
   Tel: +81-(0)42/333.6389       Fax: +81-(0)42/333.6382
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 4385 bytes
Desc: S/MIME Cryptographic Signature
Url : http://www.ogf.org/pipermail/saga-rg/attachments/20060609/e41a44da/attachment-0003.bin 


More information about the saga-rg mailing list