Yes, that's a good point: all our work with Proton-C to date has been via the 
Messenger API.

-----Original Message-----
From: Robbie Gemmell [mailto:robbie.gemm...@gmail.com] 
Sent: Wednesday, July 1, 2015 4:16 PM
To: proton@qpid.apache.org
Cc: us...@qpid.apache.org
Subject: Re: AMQP 1.0 session outgoing-window usage / meaning

Thanks James. Some expansion which may be useful to add.

When comparing the older JMS client, proton-c via the Messenger API, and the 
new JMS client using proton-j, its important to note that they aren't all doing 
the same thing even where their underlying implementations do seem to share the 
same behaviour in the cases of proton-c and proton-j.

The older JMS client initializes its outgoing window to a fixed number in the 
session Begin frame and then doesnt seem to ever change it for subsequent Flow 
frames, and simply manages whether its session can later send transfer frames 
based on the current value of the remote incoming window. Proton-J and Proton-C 
similarly only base their session level decision to send transfers on the 
remote incoming window and not their own outgoing window (which as noted below 
means they violate their advertised outgoing window, which is often going to be 
0).

Proton-C and Proton-J both currently look to set the outgoing window at any 
given time to a calculated value based on either the number of buffered 
messages or the buffered bytes divided by frame size. If there are no buffered 
messages at the point the Begin and Flow frames are generated, then the 
outgoing-window will be set to 0. This appears to function the same for both 
proton-c and proton-j. A key point though is that I think much of the historic 
usage of proton-c against Service Bus has been via the Messenger API, which 
works somewhat differently than many others in that it looks to create a 
session and a sender and sends the messages in one pipelined sequence of 
transport output, which means that by the point the Begin frame actually gets 
generated there are indeed buffered messages to send which means the 
outgoing-window is initialised to a value greater than zero. Other APIs which 
create the session as a distinct step thus wont ever have buffered messages 
when the Begin frame gets created and so the outgoing-window is initialised to 
0, which is the behaviour observed with the new JMS client using proton-j and 
also what I saw when trying proton-c via the Qpid Messaging C++ client (against 
qpidd).

Robbie


On 1 July 2015 at 20:54, James Birdsall <jb...@microsoft.com> wrote:
> FYI, I have forwarded this and important bits of the preceding discussion to 
> our AMQP stack dev within the ServiceBus team.
>
> Both the Qpid JMS AMQP 1.0 "legacy" client and Proton-C have been working 
> fine with Azure SB for years now. Proton-J, however, is not something we have 
> explored previously, and obviously there is something different about its 
> behavior compared to the other clients.
>
> The Qpid JMS client is our recommended JMS client for interop with 
> ServiceBus, and we would like to keep up with the times and not have to 
> direct customers to the legacy client, so we are very interested in figuring 
> out the correct resolution to this issue.
>
> -----Original Message-----
> From: Robbie Gemmell [mailto:robbie.gemm...@gmail.com]
> Sent: Wednesday, July 1, 2015 7:48 AM
> To: us...@qpid.apache.org; proton@qpid.apache.org
> Subject: AMQP 1.0 session outgoing-window usage / meaning
>
> Hi all,
>
> Short intro:
>
> The way we use the outgoing-window feels wrong, and seems to violate at least 
> one bit of the related [and unclear overall] description in the spec. The way 
> we use it means we currently can't send messages to ServiceBus in many cases 
> (likely anything-but-messenger).
>
>
> Full version:
>
> A user reported being unable to send messages to Service Bus (Azure or 
> Windows variants) using the new JMS client. Investigating that lead me to the 
> handling of session outgoing-window in proton (and incoming-window in 
> ServiceBus). I'd like to discuss how proton uses this, what the spec actually 
> says on how it should be used since its not clear to me these are currently 
> in alignment, and possibly changing how we utilise it in proton.
>
> In Proton the outgoing-window is set based on the amount of outstanding 
> outgoing bytes for the session (from buffered sends) and the frame size, 
> which leads to many situations where the advertised value is 0, particularly 
> in a client that creates sessions entirely independently from sending 
> messages (such as a JMS client, or the Qpid Messaging C++ client). We then 
> send transfer frames if a link has credit, regardless of the session outgoing 
> window, only withholding them if the remote-incoming-window hits 0.
>
> This causes problems against ServiceBus because it seems to base its 
> advertised incoming window on the clients [initial] advertised outgoing 
> window. If it is 0, then it means we can never send any messages.
>
> The intent/definition of the outgoing-window seems a bit unclear as a whole 
> in the spec to me, to the point you could almost remove it without issue 
> given the [remote-]incoming-window seems to govern overall behaviour. 
> However, it seems wrong to me that we often set the outgoing-window to 0. 
> Doing this means we violate the outgoing window (local and at peer) whenever 
> we send a message if the remote-incoming-window allowed it. If we tried not 
> to violate it, we would have to flow the new session window before every 
> send, which again seems odd.
>
> It feels to me like it would be better to define initial values for the 
> windows, perhaps allowing that to be configurable in the same manner as e.g 
> max frame size is. Those that want to impose some limit then could, and those 
> that don't can leave/set it to the max values to achieve that effect.
>
> Thoughts?
>
> Robbie

Reply via email to