----- Original Message ----- > On Tue, Mar 5, 2013 at 3:20 PM, Rafael Schloming <r...@alum.mit.edu> > wrote: > > On Tue, Mar 5, 2013 at 11:33 AM, Rajith Attapattu > > <rajit...@gmail.com>wrote: > > > >> On Tue, Mar 5, 2013 at 2:24 PM, Ted Ross <tr...@redhat.com> wrote: > >> > > >> > On 03/05/2013 02:14 PM, Rajith Attapattu wrote: > >> >> > >> >> > >> >> This is a good explanation that we need to put in the docs, as > >> >> Application developers certainly need to know how it behaves. > >> >> If one were to use the current C impl, it certainly gives the > >> >> impression that put() is meant to write messages into your > >> >> internal > >> >> buffer and send() will actually write it to the wire. > >> >> Unfortunately some applications will depend on this behaviour, > >> >> even > >> >> though it's not advisable > >> >> > >> >> If we are to change from say #2 to #1 or even #3 we need to > >> >> release > >> >> note it prominently. > >> >> > >> >> I think the best solution is to make this behaviour > >> >> configurable, and > >> >> advertise the default very prominently. > >> >> This way application developers will know exactly what they are > >> >> getting instead of us making changes underneath. > >> >> > >> >> Rajith > >> >> > >> > > >> > Making this configurable multiplies the size of the test matrix. > >> > Can't > >> we > >> > make this simpler? > >> > >> I do understand your concern here, but the Java impl already does > >> both > >> #1 and #2 and Rafi wants to do #3 in the future. > >> The old JMS client does something similar. > >> > >> I agree that if we just do option #2 (as you suggest below), then > >> the > >> application can easily do #1 and #3 on top of that. > >> But I'm sure they will like if the library implements those > >> strategies > >> for them and they have the ability to pick a strategy. > >> > > > > I don't see why we'd make this configurable. All three options > > actually > > fit the same general semantics. Even if you're optimistically > > trying to > > transmit every single time put is called it's entirely possible for > > the > > socket to be blocked every single time you try. If this were to > > happen the > > implementation of #1 would appear to behave precisely the same as > > #2 > > behaves. > > > > In other words if you're coding correctly against the API you can't > > assume > > that put will or won't have transmitted anything regardless of > > which > > strategy is used internally. > > > > I agree with you. You make a very good point. > Perhaps we should explicitly make that clear in our docs to avoid > applications written against wrong assumptions.
I can certainly do that, but it seems to me that semantics should be simple, obvious, and orthogonal. What seems non-simple and non-obvious to me so far is: put() might send, or not. It doesn't send now, but it might later. recv() can cause messages to be sent. send() can cause messages to be received. I would think that 1. every verb should only mean one thing 2. there should be a simple mental model, against which every verb performs a predictable action. so for example: put ( messenger, message ); // enqueue for sending send ( messenger, BLOCK ); // block till all sent. send ( messenger, DONT_BLOCK ); // send what you can. credit ( messenger, 10 ); // limit incoming queue size recv ( messenger, BLOCK ); // block till I get a message recv ( messenger, DONT_BLOCK ); // if no messages incoming, return. > > Rajith > > > --Rafael >