[SAGA-RG] SAGA Message API Extension

John Shalf JShalf at lbl.gov
Thu Jan 18 13:19:30 CST 2007


On Jan 18, 2007, at 10:36 AM, Andrei Hutanu wrote:

> Hi Andre,
>
> Thanks for writing this up. I think it looks very good but I
> still have just a few quick comments to the latest version..
>
> 1) Motivation - can make a bit stronger perhaps :
> a)to break out of the stream semantics (byte-oriented, strict  
> ordering and reliability)
> and b)to remove the burden from the application programmer of dealing
> with arbitrary-sized entities such as Ethernet packet size.
>
> 2) I see ordering is enforced, could that be an option?

I think ordering is *not* enforced, but I do wonder if it should be  
an option or a channel property (certainly semireliable will likely  
result in some reording whereas a TCP channel would enforce ordering  
of the messages for instance).

This is a controversial topic in the HPC message passing community  
(whether msg. ordering is a good or bad-thing to enforce in at the  
hardware level).

> 3) community : it would be nice if some of the active transport  
> protocol developers would
> give their input. I would think the UDT team : Robert Grossman and  
> Yunhong Gu and the EVL team :
> Venkatram Vishwanath should take a look at this. Perhaps the XIO  
> team as well.
> They may all be already involved but just in case.

That's actually a pretty good suggestion.  Perhaps its not worth  
holding up the current draft submission, but getting the lower level  
transport poeple on board is pretty powerful.

> Andrei
>
> Andre Merzky wrote:
>
>> Quoting [John Shalf] (Jan 17 2007):
>>
>>> I agree.  I think the reliability semantics should be a property  
>>> of  the channel (and hence underlying protocol) and not something  
>>> to  switch at runtime.  However, I think the clients that use  
>>> the  connection should be able to query what the channel  
>>> properties are  (or define the minimum requirements and throw an  
>>> exception if they  cannot be met).  This is just a little  
>>> introspection (not really a  deep or fancy coding underneath).
>>>
>>
>> I agree - that can safely be done with a read-only
>> attribute.
>>
>>
>>
>>>> I wanted to avoid a 'reliability' attribute on the endpoint,
>>>> as I don't see a reasonable easy way to switch reliability
>>>> in mid stream.  It is most likely that changes in
>>>> reliability policy would require different protocols (only
>>>> few protocols will be able to serve both ends), and would
>>>> hence need a new connection setup anyway.  Not sure if that
>>>> is reasonable though.
>>>>
>>>> Anyway, that would leave us with specification of
>>>> reliability on connection setup (i.e. endpoint construction)
>>>> - right now that is done via the scheme part of the URL.
>>>> Would a flag be more appropriate/explicit?  Probably...
>>>>
>>>>
>>>>
>>>>> 		b) what about if the message arrives more than once? (eg.
>>>>> 		redundant  copies of messages can occur in practice for a 		 
>>>>> number of
>>>>> unreliable  or semi-reliable messaging protocols).
>>>>>
>>>> Good point.  IMHO we should specify that messages arrive 'AT
>>>> MOST ONCE' (unreliable) or EXACTLY ONCE (reliable).  I don't
>>>> think that we need to support additional modes, nor the
>>>> complete spectrum of (un/)reliable transmission modes.  Or?
>>>>
>>> I cannot remember the document, but there was a spec for  
>>> defining  reliability of another kind of messaging bus.  It had
>>> 	unreliable: message may or may not arrive (typical UDP).
>>> 	semi-reliable: message must arrive (will be retransmitted if  
>>> not  acked).  Source keeps resending until it sees the ack.  It  
>>> is  possible that the ack is lost, in which case, the message may  
>>> arrive  at the client twice (so this is a Message will arrive at  
>>> least once,  and possibly more than once.)  This protocol is  
>>> useful since the  message destination does not need to maintain  
>>> complex message  state... it just acks messages that arrive (very  
>>> simple).
>>> 	reliable: the message must arrive and it will only arrive once.
>>>
>>
>> I added to the spec:
>>
>>   The available realiability levels are:
>>
>>   \up
>>   \begin{tabbing}
>>    XXXXXXXXXX          \= \kill
>>    |Unreliable|:       \> messages MAY (or may not) reach the
>>                           remote clients.\\[0.3em]
>>
>>    |Atomic|:           \> |Unreliable|, but a message  
>> received                           by one client is\ 
>> \                        \> guaranteed to (MUST) arrive
>>                           at all clients.\\[0.3em]
>>
>>    |SemiReliable|:     \> messages are guaranteed to  
>> (MUST)                           arrive at all\\
>>                        \> clients, but may arrive more than once.\\ 
>> [0.3em]
>>
>>    |Reliable|:         \> all messages are guaranteed to  
>> (MUST)                           arrive at\\
>>                        \> all clients.\\[0.3em]
>>   \end{tabbing}
>>
>> That is similar to your list, but adds the 'atomic' one.
>> Not sure if that is useful (sounds like) or easily
>> implementable (??), but I found it in a list of relibility
>> modes for message transmissions which looked sensible, and
>> seems to be close to what you propose.
>>
>> [ about point-to-point ]
>>
>>
>>> That does address one of the cases (not exactly the one I was   
>>> thinking of).
>>> Also should allow -1 to specify *any-number-of-clients* at the   
>>> underlying protocol's discretion.
>>>
>>
>> Yes, definitely, thats in the spec already.
>>
>>
>>
>>> But now for a semantic thicket....
>>>
>>> Case 1: I connect to a named destination and I am joined  
>>> together  with everyone else who has connected to that port.  In  
>>> this case, any  message I send will be broadcast to everyone else  
>>> and vice verse  (message bus).  This is the equivalent of a  
>>> publish-subscribe service.
>>> Case 2: I connect to a port and I own the service.  This appears  
>>> to  be the case you are setting up above as it only allows one  
>>> client to  join the service.
>>> Case 3: I connect to the port and for a sub-process that does  
>>> not  share the messages with the other clients that have  
>>> connected to that  port (like an HTTP server).  I don't quite see  
>>> how that kind of point- to-point message service is supported.
>>>
>>> I think we need an attribute for the message port that says  
>>> whether  it is a bus or a point-to-point.  In addition, I like  
>>> the idea of  setting the message queue length (as you have  
>>> above).  I was not  thinking of that, but I can see the value of  
>>> creating a first-come- first-serve message port as well. (if that  
>>> is not too complicated).
>>>
>>
>> Got you (I think) :-)  Yes, that makes sense.  I added a
>> 'topology' enum and attribute, which is handled similarly to
>> the 'reliability' property (static over connection/endpoint
>> lifetime, inspection via ReadOnly attribute).
>>
>>
>> New draft is attached, with new sections marked.  It would
>> be great if you could review the paragraphs about connection
>> topology.
>>
>> Thanks!
>>
>>  Andre.
>>
>>




More information about the saga-rg mailing list