This nearly covers the issue I was raising, and most likely addresses
the major use case.

I was envisaging multiple sessions over the same connection, possibly
with different priorities and flow control needs.  The question shifts
from "when is it a good time to send messages on this session" to
"when is the connection output buffer ready for a new message (from
any session)".  The PN_TRANSPORT event you suggest is actually session
agnostic and could form the role here as well.  pn_transport_pending()
could serve to decide when to add more messages to the connection's
output stream.

The right value of a high/low water mark would vary a lot between an
8Gig network and some low power wireless transport.

If we did not generate PN_TRANSPORT events by default, many
applications would run just fine and not pay the price of ignoring
them.  Those that wanted them could perhaps register for them.

Or, assuming the application knows whether it is a large hub server or a
webcam, perhaps it could inform Proton appropriately and register what
it thought was the low water mark via an api call:

      pn_transport_set_low_watermark(t, n_bytes);

which would be edge triggered when the buffer transitioned from above
the watermark to below.

Or the Application could just tell Proton each time it is interested in
a low watermark event.

  void send_available() {
     /* ... */
     /* try_to_send returns false because we hit high water mark,
which leads to: */
     /* Message not sent, leave on available list for next send_available() */
     /* and... */
     pn_transport_notify_pending_less_than(t, n_bytes)

Which fires exactly once, either on the transition, or "soon" if
transport_pending is currently less than n_bytes.

I acknowledge that the saner approach in most cases might be to have
separate connections to manage complicated session link priorities and
that it may not really be too onerous to generate a transport event
whenever the output buffer shrinks.

Cliff

On Thu, Oct 27, 2016 at 1:35 PM, Alan Conway <acon...@redhat.com> wrote:
> Cliff has been bugging me about transport events, sending messages and
> memory bounding for ages and the penny finally dropped, I think it
> deserves a wider audience:
>
> The issue is bounding memory use in a proton sending application. AMQP
> flow control (as shown in our examples) covers many/most cases
> providing the receiver sets a "reasonable" credit limits.
>
> However, on the sender, if the receiver sets infinite credit, or has a
> much bigger notion of "reasonable", proton will buffer messages without
> regard to sender constraints. It is quite plausible that
> receiver/sender have very different memory constraints - one might be a
> large hub server, the other embedded on millions of small devices
> (webcams for example)
>
> The `on_sendable` or PN_FLOW event tells you the remote end has given
> credit, so you can write a sender that waits for credit before sending.
> I think we can use the C PN_TRANSPORT event in a similar way to limit
> sender memory. Attached is a C example/explanation.
>
> Some of our language bindings don't expose TRANSPORT and we might want
> to think of a more intuitive way to express this. Also TRANSPORT is a
> bit of a catch-all event, it does fire when data moves from session to
> transport buffers, but it fires for other things too. We might want to
> look at the event model.
>
> Meantime I think the attached is a workable approach in C. Would love
> to hear comments, this is something we probably should incorporate into
> the language bindings
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@qpid.apache.org
> For additional commands, e-mail: users-h...@qpid.apache.org

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@qpid.apache.org
For additional commands, e-mail: users-h...@qpid.apache.org

Reply via email to