[ 
https://issues.apache.org/jira/browse/AMQ-5379?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14231394#comment-14231394
 ] 

Robbie Gemmell commented on AMQ-5379:
-------------------------------------

Hi Dejan,

I think we need to change how the credit is observed after the initial flow, 
patch attached. As AMQPProtocolConverter could create the 'ActiveMQ consumer' 
with a 1000 msg prefetch (if we havent already also had a Flow before the 
Attach actually gets processed), it is likely it could buffer up to that many 
messages sends before we ever get a Flow, at which point the way the credit is 
currently observed (via getRemoteCredit()) wont actually give the amount of 
credit we received but rather what is currently believed to be left unused 
after accounting for buffered messages, leading us to underestimate the actual 
prefetch (it could even be negative if it already buffered sends for more 
messages than the actual received credit). I think getCredit() seems to be what 
to use instead.

Having said all that, I am now also thinking that a better way to go for now 
might be creating the 'ActiveMQ consumer' with 0 prefetch until the first flow 
arrives, and then giving it that much prefetch, since the AMQP consumer 
cant/wont actually be sent any messages over the wire until it gives the 
broker/proton credit anyway. This would help with multiple consumers etc by 
avoiding the 'ActiveMQ consumers' prefetching lots of messages they cant 
actually transmit to the AMQP consumer yet.

The above may possibly make the general issue underlying AMQ-5453 a little 
worse, since the 'ActiveMQ consumer' wouldnt have any 'advance credit' to use 
to get messages buffered ready to send before a 'drain' flow occurs. As it is 
currently almost entirely broken anyway, I'm not sure this would really be much 
more of an issue than already exists, which will still need a general fix 
either way. A possible saving grace in this specific case though is that I see 
that client is sending two flows, one with drain false then one with it true, 
which might still appear to work occasionally if messages get sent inbetween 
them.

I think the changes here mean that anyone using ClientAcknowledge with the JMS 
clients will find it isnt able to recieve more messages than the consumers 
configured prefetch size within a single ack window, since the desire for more 
messages is communicated by granting more credit, which would now have no 
effect. That in itself isnt necessarily worse than it was in ActiveMQ 5.10, 
which had an internal fixed window of 100 messages, the only difference is that 
if AMQP clients set their prefetch down below the old fixed 100 (e.g, to 1) 
they then wont be able to exceed that, whereas previously they would have 
apparently been able to since up to 99 messages would have actually been 
buffered awaiting the new credit. I guess that by using the new 
'transport.prefetch' config to set a value will essentially force it to behave 
as it did previously, which may be a workaround in some cases.

When looking an issue relating to transactions, I came across the 'prefetch 
extension' concept in PrefetchSubscription. It currently looks to mainly use 
acknowlegement of specific messages to operate, but perhaps it could be 
modified to use credit (since we cant tell which specific messages, if any, 
that incoming credit may have been previously associated with) and help toward 
enabling things to work more along the lines of expectation for AMQP.

Sorry for writing another book size comment, I really dont mean to when I start 
:P

Robbie

> AMQP - allow setting prefetch size
> ----------------------------------
>
>                 Key: AMQ-5379
>                 URL: https://issues.apache.org/jira/browse/AMQ-5379
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: AMQP
>    Affects Versions: 5.10.0
>            Reporter: Dejan Bosanac
>            Assignee: Dejan Bosanac
>             Fix For: 5.11.0
>
>
> Currently the prefetch size is hardcoded to the value of 100



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to