Hi Mike,

I will merge Rob's fix into 7.0.x branch for inclusion into 7.0.7 release.

Kind Regards,
Alex

On 6 August 2018 at 20:03, Dyslin, Mike <mike.dys...@hpe.com> wrote:
> Rob,
>
> I'm running with your fixed jar file now, and passed the 4GB boundary, 
> currently at 5.11 GB, so your fix seems to work!
>
> Thanks so much for your quick response!  We really appreciate it.
>
> We will watch for the next release that has this fix in it.  Do you think it 
> will be in 7.0.7?
>
> Thanks,
> Mike
>
>
> -----Original Message-----
> From: Rob Godfrey [mailto:rob.j.godf...@gmail.com]
> Sent: Monday, August 6, 2018 10:25 AM
> To: users@qpid.apache.org
> Cc: Mears, David B <david.me...@hpe.com>; Herren, Elaine 
> <elaine.her...@hpe.com>; Rao, Shobha (NonStop) <shobha.jayatheer...@hpe.com>
> Subject: Re: Java Broker (7.0.6) stops delivering queue/consumer messages 
> after 4 GB data transfer
>
> Hi Mike,
> On Mon, 6 Aug 2018 at 18:23, Dyslin, Mike <mike.dys...@hpe.com> wrote:
>
>> Rob,
>>
>> I created JIRA QPID-8225 with Title "Java Broker (7.0.6) stops
>> delivering queue/consumer messages after 4 GB data transfer".
>>
>> The log you requested is attached to the JIRA.
>>
>> The log contains the connection startup, 10 messages flowing (2 every
>> 10 seconds), then connection close.  It does not contain when message
>> flow stopped (credit exhausted?).  I can get that for you if you like.
>>
>> We did see this in the log:
>>
>> 2018-08-06 07:57:34,100 DEBUG [IO-/15.252.32.148:43266]
>> (o.a.q.s.p.v.ServerConnection) - RECV: [conn:6cd338b5] ch=1
>> MessageSetFlowMode(destination=dsaqp15, flowMode=CREDIT)
>> 2018-08-06 07:57:34,102 DEBUG [IO-/15.252.32.148:43266]
>> (o.a.q.s.p.v.ServerConnection) - RECV: [conn:6cd338b5] ch=1
>> MessageFlow(destination=dsaqp15, unit=MESSAGE, value=4294967295)
>> 2018-08-06 07:57:34,102 DEBUG [IO-/15.252.32.148:43266]
>> (o.a.q.s.p.v.ServerConnection) - RECV: [conn:6cd338b5] ch=1
>> MessageFlow(destination=dsaqp15, unit=BYTE, value=4294967295)
>>
>> And we never saw anything that looked like credit was being reset by
>> the consumer.
>>
>>
> OK - this actually  matches up with what I suspected looking more deeply at 
> the code this morning.  The value 4294967295 is supposed to be a magic number 
> meaning "infinite" credit, however the Java Broker is mishandling this, 
> expecting it to be passed as -1, whereas in fact a lower layer in the code is 
> instead passing the value as 4294967295 in a signed 64bit value.  I just 
> committed a fix to master, but I'm not sure when that might be released as a 
> new version.
>
>
>> So, perhaps the 4 GB credit simply is all used up and messages stop
>> flowing.
>>
>> How do we change FlowMode to OFF, or if that is not possible, how do
>> we reset our credit back to 4 GB in the QPID C++ API?
>>
>>
> So, I'm not familiar with the C++ API, if there were an obvious way to switch 
> from "credit" mode to "window" mode (which is the protocol default) then that 
> would likely work around the problem.
>
>
>> Since we don't see any of our code setting any kind of flow control
>> option, is the C++ API sending flow control default setting to the
>> broker, or is the broker setting flow control default because the
>> producer has not specified any flow control?  If the latter, then
>> perhaps the C++ and Java brokers have different flow control defaults.
>> If the former, then C++ broker and the java broker are not
>> implementing specified the flow control in the same way.
>>
>> Again, our original code was only tested with C++ brokers.
>>
>>
> Yeah - sadly this is a Java Broker bug you've discovered.  I've uploaded a 
> jar file with the proposed fix into the JIRA (just replace the existing jar 
> of the same name in lib/broker-plugins).  Alternatively you can build this 
> yourself by doing the following:
>
> git clone https://git-wip-us.apache.org/repos/asf/qpid-broker-j.git
>
> cd qpid-broker-j/
>
> git checkout 7.0.6
>
> git cherry-pick cf40fdea39d9633702ee286d94e950a19ec7be74
> mvn package
>
>  Apologies you've run into this :-(  I think most clients are using window, 
> or non-infinite credit - that's the only reason I can think that this has not 
> been spotted before.
>
> If you give the jar a try and it works (or doesn't work) for you, please let 
> us know.
>
> -- Rob
>
> Thanks,
>> Mike
>>
>>
>> -----Original Message-----
>> From: Rob Godfrey [mailto:rob.j.godf...@gmail.com]
>> Sent: Friday, August 3, 2018 3:34 PM
>> To: users@qpid.apache.org
>> Cc: Mears, David B <david.me...@hpe.com>; Herren, Elaine <
>> elaine.her...@hpe.com>; Rao, Shobha (NonStop)
>> <shobha.jayatheer...@hpe.com
>> >
>> Subject: Re: Java Broker (7.0.6) stops delivering queue/consumer
>> messages after 4 GB data transfer
>>
>> On Sat, 4 Aug 2018 at 00:11, Dyslin, Mike <mike.dys...@hpe.com> wrote:
>>
>> > Rob,
>> >
>> > We do not know how our consumer is managing credit, or anything
>> > about credit flow, but have started looking for information on this.
>> > It sounds like the right place to look.  If we could figure out how
>> > to turn off the flow control limits, that may do it.  We inherited
>> > most of this code, and the original authors of the code are long
>> > gone, so we don't have the experience of putting it all together.
>> > Perhaps the defaults for this credit flow is different between the
>> > C++ and Java
>> brokers.
>> >
>> > OK, we'll try to figure out how to get protocol logging turned on
>> > and get a log file to look at.
>> >
>>
>> Thanks - I had a quick look at the Java Broker code for managing
>> credit and didn't immediately see any obvious errors that would hit a
>> properly functioning client, *however* it does look like that if the
>> client is improperly managing credit there would be an overflow error
>> where a value that should be an unsigned integral value (the amount of
>> remaining credit) will turn negative.  The broker is storing the
>> amount of outstanding credit as a (signed) Java long value.  AMQP 0-10
>> defines the message.flow command as "This command controls the flow of 
>> message data to a given destination.
>> It is used by the recipient of messages to dynamically match the
>> incoming rate of message flow to its processing or forwarding
>> capacity. Upon receipt of this command, the sender must add "value"
>> number of the specified unit to the available credit balance for the
>> specified destination."  So if the client is repeatedly adding more
>> credit than it needs the stored "limit" in the broker might overflow
>> and turn negative.  At this point the broker would stop sending messages.
>>
>> -- Rob
>>
>>
>>
>> >
>> > Thanks,
>> > Mike
>> >
>> > -----Original Message-----
>> > From: Rob Godfrey [mailto:rob.j.godf...@gmail.com]
>> > Sent: Friday, August 3, 2018 11:11 AM
>> > To: users@qpid.apache.org
>> > Cc: Mears, David B <david.me...@hpe.com>; Herren, Elaine <
>> > elaine.her...@hpe.com>; Rao, Shobha (NonStop)
>> > <shobha.jayatheer...@hpe.com
>> > >
>> > Subject: Re: Java Broker (7.0.6) stops delivering queue/consumer
>> > messages after 4 GB data transfer
>> >
>> > On Fri, 3 Aug 2018 at 19:18, Dyslin, Mike <mike.dys...@hpe.com> wrote:
>> >
>> > > Rob,
>> > >
>> > > Our consumer client version is 1.37:
>> > >
>> > >    bash 0 3: rpm -qa | grep -i qpid
>> > >    qpid-cpp-client-devel-1.37.0-1.el7.x86_64
>> > >    python-qpid-1.37.0-1.el7.noarch
>> > >    qpid-qmf-1.37.0-1.el7.x86_64
>> > >    qpid-cpp-client-1.37.0-1.el7.x86_64
>> > >    python-qpid-qmf-1.37.0-1.el7.x86_64
>> > >    qpid-cpp-server-1.37.0-1.el7.x86_64
>> > >    qpid-proton-c-0.18.1-1.el7.x86_64
>> > >    qpid-tools-1.37.0-1.el7.noarch
>> > >
>> > > Our producer client version is 6.1.5:
>> > >     -rw-r--r--    1 NSDA.NSDA          NSDA      570873 Jul 26 15:42
>> > > qpid-client-6.1.5.jar
>> > >     -rw-r--r--    1 NSDA.NSDA          NSDA      864493 Jul 26 15:42
>> > > qpid-common-6.1.5.jar
>> > >
>> > > Both producer and consumer clients use AMQP_0_10 protocol.
>> > >
>> >
>> > OK - so my assumption here is that there is some issue in the
>> > management of credit in the broker (or possibly in the client).
>> > AMQP
>> > 0-10 has two distinct credit flow modes "credit" and "window" and
>> > also allows the consumer to separately set limits for both "message"
>> > and
>> "byte" credit.
>> > I'm not very familiar with the C++ API, but do you know how your
>> > consumer is managing credit?
>> >
>> > One thing that would be very helpful in trying to diagnose this
>> > problem is getting protocol logging for the consumer (at least for
>> > the start of the consumer where it sets up the credit flow mode, and
>> > towards the end where it would be interesting to see the credit
>> > being allocated just before message flow stops).
>> >
>> > -- Rob
>> >
>> >
>> > >
>> > > Thanks for your assistance,
>> > > Mike
>> > >
>> > > FYI - There may be a typo on the past releases web page.  I
>> > > believe
>> > "2017"
>> > > should be "2018" in "Qpid JMS AMQP 0-x 6.3.2, July 2017".  URL:
>> > > https://qpid.apache.org/releases/index.html#past-releases
>> > >
>> > > -----Original Message-----
>> > > From: Rob Godfrey [mailto:rob.j.godf...@gmail.com]
>> > > Sent: Thursday, August 2, 2018 5:57 PM
>> > > To: users@qpid.apache.org
>> > > Cc: Mears, David B <david.me...@hpe.com>; Herren, Elaine <
>> > > elaine.her...@hpe.com>; Rao, Shobha (NonStop)
>> > > <shobha.jayatheer...@hpe.com
>> > > >
>> > > Subject: Re: Java Broker (7.0.6) stops delivering queue/consumer
>> > > messages after 4 GB data transfer
>> > >
>> > > Hi Mike,
>> > >
>> > > On Fri, 3 Aug 2018 at 01:25, Dyslin, Mike <mike.dys...@hpe.com> wrote:
>> > >
>> > > > This is my first submit to this email group.  Hopefully this is
>> > > > the correct place to post this problem.
>> > > >
>> > > >
>> > > This is exactly the right place to post this problem.
>> > >
>> > >
>> > > > We are running a continuous stream of message (about 5K each)
>> > > > from producer to consumer over a single java broker queue at a
>> > > > rate of about 600 messages/second.  Outbound message flow stops
>> > > > after transferring 4 GB of message data (about 770,000 messages
>> > > > in 25 minutes).  The Web Management Console page for our
>> > > > consumer connection
>> > > shows the total "Outbound Bytes"
>> > > > growing steadily until it reaches 4.0 GB and stops with "Last
>> > > > I/O
>> time"
>> > > > unchanging thereafter.
>> > > >
>> > > > After outbound messages stop:
>> > > > Inbound messages continue on the producer connection (well past
>> > > > 4.0
>> > > > GB) and are kept in the queue until they expire with a
>> > > > time-to-live value of 3 minutes.  The queue grows until is
>> > > > stabilizes with a steady
>> > > > 600 m/s inbound, and 600 m/s expiring and being deleted from the
>> > > > queue (as expected).  The Web Management Console shows that the
>> > > > consumer connection remains open and is a consumer on the queue,
>> > > > and the queue shows the connection as a consumer on the queue.
>> > > >
>> > > > If I run the exact same test replacing the Java Broker with a
>> > > > C++ broker (1.37.0), message flow continues well past the 4 GB barrier.
>> > > > I kept it running for about 17 hours reaching about 37 million
>> > > > messages, about 180 GB data transferred on the queue.
>> > > >
>> > > > Since the only difference seems to be the broker, this seems to
>> > > > point to a problem with the Java Broker, and not issues with our
>> > > > producer, consumer or network issues.  Could there be some
>> > > > problem with our java broker configuration that would explain this 
>> > > > behaviour?
>> > > >
>> > >
>> > > Unfortunately this sounds like it may be a bug in the Java Broker
>> > > :-(
>> > >
>> > >
>> > > >
>> > > > Has anyone out there experienced more than 4 GB of outbound data
>> > > > on a single java broker connection or queue?
>> > > >
>> > > >
>> > > Can you confirm which client you are using, and which version of
>> > > AMQP is in use (as you have identified I don't expect this to be a
>> > > client problem, but knowing the client will help us track down the
>> > > issue in the
>> > broker)?
>> > >
>> > >
>> > > > Any help would be appreciated.
>> > > >
>> > > > Other comments/observations:
>> > > >
>> > > > I do not know if the 4 GB barrier is associated with the
>> > > > connection and/or the queue because all our message traffic is
>> > > > over one consumer connection and one queue.  I could determine
>> > > > this by changing our consumer code to spread message traffic
>> > > > over one connection and multiple
>> > > queues.
>> > >
>> > >
>> > >
>> > > >
>> > > >
>> > > We are using the heartbeat feature with a 5 minute timeout.  Since
>> > > the
>> > > > connection stays open beyond the 5 minute timeout after the
>> > > > messages stop, I assume the heartbeat messages are still being
>> > > > sent between consumer and broker, indicating that the consumer
>> > > > and broker are able to communicate over the socket.  It has been
>> > > > awhile since I have tested that the heartbeat feature is working
>> correctly.
>> > > >
>> > > > If I close the consumer connection from the Web Management
>> > > > Console, the broker deletes the queue (I believe) and our
>> > > > consumer detects the closed connection, establishes a new
>> > > > connection and new queue, and messages start flowing again until
>> > > > . . . we reach the 4 GB barrier and messages stop being delivered once 
>> > > > again.
>> > > >
>> > > > We have run with the Java Broker on both Linux (RHEL 7.4) and
>> > > > proprietary NonStop POSIX platform with the same results.
>> > > > Unfortunately, the C++ broker is not yet an option on the
>> > > > NonStop POSIX platform where we require the broker to be.
>> > > >
>> > > >
>> > > Hopefully we can quickly track down the issue in the Java Broker
>> > > and push out a fix,
>> > >
>> > >
>> > > > Thanks,
>> > > > Mike
>> > > >
>> > > >
>> > > Apologies you've run into this issue, Rob
>> > >
>> > >
>> > > > ----------------------------------------------------------------
>> > > > ----
>> > > > - 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
>>
>>

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

Reply via email to