On Tue, Mar 5, 2013 at 12:39 PM, Michael Goulish <mgoul...@redhat.com>wrote:

>
>
> ----- Original Message -----
> > On Tue, Mar 5, 2013 at 11:10 AM, Ted Ross <tr...@redhat.com> wrote:
> >
> > >
> > > On 03/05/2013 02:01 PM, Rafael Schloming wrote:
> > >
> > >> On Tue, Mar 5, 2013 at 10:42 AM, Michael Goulish
> > >> <mgoul...@redhat.com
> > >> >wrote:
> > >>
> > >>
> > >>> So, am I understanding correctly? -- I should be able to get
> > >>> messages
> > >>> from my sender to my receiver just by calling put() -- if the
> > >>> receiver
> > >>> is ready to receive?
> > >>>
> > >>>  Not necessarily, the receiver being ready just means you are
> > >>>  unblocked
> > >> on
> > >> AMQP level flow control. You could also potentially block on the
> > >> socket
> > >> write (i.e. TCP level flow control). You need to be unblocked on
> > >> both for
> > >> put to succeed.
> > >>
> > >
> > > Certainly there is no TCP flow control happening in Mick's
> > > scenario.
> > >
> > >
> > >  What I said was put is *allowed* to send optimistically, not that
> > >  it is
> > >> required to. It actually did send optimistically in a previous
> > >> version of
> > >> the code, however I commented that line out.
> > >>
> > >> I would say the documented semantics of put and send should allow
> > >> the
> > >> implementation the flexibility to do any of the following:
> > >>
> > >>    1) optimistically transmit whatever it can everytime so long as
> > >>    it
> > >> doesn't block
> > >>    2) never bother transmitting anything until you force it to by
> > >>    calling
> > >> send
> > >>    3) anything in between the first two, e.g. magically transmit
> > >>    once
> > >> you've
> > >> put enough messages to reach the optimal batch size
> > >>
> > >> The reason for the behaviour you are observing is that we
> > >> currently do
> > >> option 2 in the C impl, however we've done option 1 in the past
> > >> (and I
> > >> think we do option 1 still in the Java impl), and we will probably
> > >> do
> > >> option 3 in the future.
> > >>
> > >
> > > If this is the case, then Mick's original view is correct.  The
> > > application must assume that messages will not ever be sent unless
> > > "send"
> > > is called.  There is no flowing, pipelined, non-blocking producer.
> > >
> >
> > It's not correct as documentation of the API semantics. It's also not
> > correct to say that messages will never be sent unless "send" is
> > called,
> > e.g. the following code will work fine:
> >
> > Client:
> >   m.put(request);
> >   m.recv(); // wait for reply
> >   m.get(reply);
>
>
>
> That recv() just caused an enqueued message to be sent?
>
> I just tried it in a C program and it worked, more or less.
> At least the receiver got his 5 messages without send()
> ever having been called.
>
> Does a call to recv() also cause all unblocked messages
> to be sent?
>

When a messenger is blocked it will do whatever outstanding work it can.
This won't necessarily cause all messages to be sent, but it may cause some.


> Is that symmetric?  Does a call to send() also cause
> messages to be received ?
>

Yes it is symmetric, messages can arrive while you're blocking for send().

--Rafael

Reply via email to