We are trying to upgrade our ActiveMQ dependency from 5.8.0 to something newer. 
In our environment, we use an embedded broker with useCompression set to true. 
After the upgrade to any version after 5.9.1, we see some unfortunate side 
effects on a test client which is listening on a topic where 
ActiveMQBytesMessages are posted. The following exception is thrown while 
running a test suite which publishes around 100k ActiveMQBytesMessages on a non 
persistent topic. It is very reproducible on about 95% of all runs, but only 
once or maybe a few times per run:

11:04:21.075 [ActiveMQ Session Task-1] ERROR  
o.a.activemq.ActiveMQMessageConsumer - 
ID:hostname-43481-1453197809985-15:1:12:1 Exception while processing message: 
ID:hostname-57271-1453197780850-6:2:1:3:95106
java.lang.RuntimeException: Failed to deserialize a message 
(ActiveMQBytesMessage {commandId = 3702, responseRequired = false, messageId = 
ID:office388-44548-1453286940386-5:1:1:3:1229, originalDestination = null, 
originalTransactionId = null, producerId = 
ID:office388-44548-1453286940386-5:1:1:3, destination = topic://com.foo.bar, 
transactionId = null, expiration = 1453287566063, timestamp = 1453286966063, 
arrival = 0, brokerInTime = 1453286966064, brokerOutTime = 1453286966064, 
correlationId = null, replyTo = null, persistent = false, type = null, priority 
= 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = 
true, userID = null, content = org.apache.activemq.util.ByteSequence@7ec950bb, 
marshalledProperties = org.apache.activemq.util.ByteSequence@3e90d35e, 
dataStructure = null, redeliveryCounter = 0, size = 0, properties = 
{mapped=1453286966034, received=1453286965865, source=3, 
published=1453286959733, type=TEST, class=2884, party=TEST}, readOnlyProperties 
= true, readOnlyBody = true, droppable = false, jmsXGroupFirstForConsumer = 
false} ActiveMQBytesMessage{ bytesOut = null, dataOut = null, dataIn = null }).
       at 
com.foo.bar.PersistEntityMessageHandlerServiceListener.onMessage(PersistEntityMessageHandlerServiceListener.java:57)
 ~[foobar.jar:amq513-SNAPSHOT]
       at 
org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1393)
 ~[activemq-client.jar:5.13.0]
       at 
org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
 [activemq-client.jar:5.13.0]
       at 
org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
 [activemq-client.jar:5.13.0]
       at 
org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133) 
[activemq-client.jar:5.13.0]
       at 
org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48) 
[activemq-client.jar:5.13.0]
       at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
[na:1.8.0_45]
       at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
[na:1.8.0_45]
       at java.lang.Thread.run(Thread.java:745) [na:1.8.0_45]
Caused by: javax.jms.JMSException: java.util.zip.DataFormatException: incorrect 
header check
       at 
org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:72)
 ~[activemq-client.jar:5.13.0]
       at 
org.apache.activemq.command.ActiveMQBytesMessage.initializeReading(ActiveMQBytesMessage.java:884)
 ~[activemq-client.jar:5.13.0]
       at 
org.apache.activemq.command.ActiveMQBytesMessage.getBodyLength(ActiveMQBytesMessage.java:198)
 ~[activemq-client.jar:5.13.0]
       at 
com.foo.bar.JmsSerializerHelper.deserialize(JmsSerializerHelper.java:52) 
~[foobar-client.jar:1761]
       at 
com.foo.bar.PersistEntityMessageHandlerServiceListener.onMessage(PersistEntityMessageHandlerServiceListener.java:53)
 ~[foobar.jar:amq513-SNAPSHOT]
       ... 8 common frames omitted
Caused by: java.io.IOException: java.util.zip.DataFormatException: incorrect 
header check
       at 
org.apache.activemq.command.ActiveMQBytesMessage.decompress(ActiveMQBytesMessage.java:902)
 ~[activemq-client.jar:5.13.0]
       at 
org.apache.activemq.command.ActiveMQBytesMessage.initializeReading(ActiveMQBytesMessage.java:876)
 ~[activemq-client.jar:5.13.0]
       ... 11 common frames omitted
Caused by: java.util.zip.DataFormatException: incorrect header check
       at java.util.zip.Inflater.inflateBytes(Native Method) ~[na:1.8.0_45]
       at java.util.zip.Inflater.inflate(Inflater.java:259) ~[na:1.8.0_45]
       at java.util.zip.Inflater.inflate(Inflater.java:280) ~[na:1.8.0_45]
       at 
org.apache.activemq.command.ActiveMQBytesMessage.decompress(ActiveMQBytesMessage.java:898)
 ~[activemq-client.jar:5.13.0]
       ... 12 common frames omitted

In one occasion, a different cause was shown:

Caused by: java.lang.NegativeArraySizeException: null
       at 
org.apache.activemq.command.ActiveMQBytesMessage.decompress(ActiveMQBytesMessage.java:897)
 ~[activemq-client.jar:5.13.0]

I have reproduced this with 5.10.0, 5.10.1, 5.10.2, 5.11.3 and 5.13.0. It is 
not reproducible on 5.8.0 (our current version) and 5.9.1. The stacktrace on 
5.10.0 is slightly different:

java.lang.RuntimeException: Failed to deserialize a message 
(ActiveMQBytesMessage {commandId = 3702, responseRequired = false, messageId = 
ID:office388-44548-1453286940386-5:1:1:3:1229, originalDestination = null, 
originalTransactionId = null, producerId = 
ID:office388-44548-1453286940386-5:1:1:3, destination = topic://com.foo.bar, 
transactionId = null, expiration = 1453287566063, timestamp = 1453286966063, 
arrival = 0, brokerInTime = 1453286966064, brokerOutTime = 1453286966064, 
correlationId = null, replyTo = null, persistent = false, type = null, priority 
= 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = 
true, userID = null, content = org.apache.activemq.util.ByteSequence@7ec950bb, 
marshalledProperties = org.apache.activemq.util.ByteSequence@3e90d35e, 
dataStructure = null, redeliveryCounter = 0, size = 0, properties = 
{mapped=1453286966034, received=1453286965865, source=3, 
published=1453286959733, type=TEST, class=2884, party=TEST}, readOnlyProperties 
= true, readOnlyBody = true, droppable = false, jmsXGroupFirstForConsumer = 
false} ActiveMQBytesMessage{ bytesOut = null, dataOut = null, dataIn = null })
   at 
com.foo.bar.PersistEntityMessageHandlerServiceListener.onMessage(PersistEntityMessageHandlerServiceListener.java:57)
 ~[classes/:na]
   at 
org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1390)
 ~[activemq-client-5.10.0.jar:5.10.0]
   at 
org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
 [activemq-client-5.10.0.jar:5.10.0]
   at 
org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
 [activemq-client-5.10.0.jar:5.10.0]
   at 
org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133) 
[activemq-client-5.10.0.jar:5.10.0]
   at 
org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48) 
[activemq-client-5.10.0.jar:5.10.0]
   at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
[na:1.8.0_66]
   at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
[na:1.8.0_66]
   at java.lang.Thread.run(Thread.java:745) [na:1.8.0_66]
Caused by: javax.jms.JMSException: java.lang.NegativeArraySizeException
   at 
org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:72)
 ~[activemq-client-5.10.0.jar:5.10.0]
   at 
org.apache.activemq.command.ActiveMQBytesMessage.initializeReading(ActiveMQBytesMessage.java:890)
 ~[activemq-client-5.10.0.jar:5.10.0]
   at 
org.apache.activemq.command.ActiveMQBytesMessage.getBodyLength(ActiveMQBytesMessage.java:199)
 ~[activemq-client-5.10.0.jar:5.10.0]
   at com.foo.ba.rJmsSerializerHelper.deserialize(JmsSerializerHelper.java:52) 
~[foundations-rpc-client-70.1761.jar:70.1761]
   at 
com.foo.bar.PersistEntityMessageHandlerServiceListener.onMessage(PersistEntityMessageHandlerServiceListener.java:53)
 ~[classes/:na]
   ... 8 common frames omitted
Caused by: java.io.IOException: java.lang.NegativeArraySizeException
   at 
org.apache.activemq.command.ActiveMQBytesMessage.decompress(ActiveMQBytesMessage.java:908)
 ~[activemq-client-5.10.0.jar:5.10.0]
   at 
org.apache.activemq.command.ActiveMQBytesMessage.initializeReading(ActiveMQBytesMessage.java:882)
 ~[activemq-client-5.10.0.jar:5.10.0]
   ... 11 common frames omitted
Caused by: java.lang.NegativeArraySizeException: null
   at 
org.apache.activemq.command.ActiveMQBytesMessage.decompress(ActiveMQBytesMessage.java:903)
 ~[activemq-client-5.10.0.jar:5.10.0]
   ... 12 common frames omitted

This points me towards AMQ-4887<https://issues.apache.org/jira/browse/AMQ-4887> and 
AMQ-5381<https://issues.apache.org/jira/browse/AMQ-5381> which correlate with the 
versions when it starts failing and the code changes that have been made in 
ActiveMQBytesMessage.

Halting the process with a debugger does not give me much extra information, 
there is content in the Inflater buffer, but the native method 
Inflater.inflateBytes just throws the exception. Both client and server are 
running on the same machine, same JDK. Running with 1.8.0_66 has the same 
effect. What I did see was that the actual compressed bytes at that point were 
different between what the server sent and what the client received, which 
points to client side buffer corruption. Both the compress on the server side 
as well as the decompress methods were always called from the same thread, so 
there does not seem to be a multi-threaded race condition at that location, 
although it might be somewhere else in the stack.

Disabling compression on the server side will make the error go away. I have 
not found any other flag that has effect on this yet.

I could not find any recent issues logged, is this something other people also 
encountered? I'm currently trying to isolate the code and create a test setup, 
but that's quite an undertaking so please bear with me.

Thank you,
Claudio

________________________________

The information in this e-mail is intended only for the person or entity to 
which it is addressed.

It may contain confidential and /or privileged material. If someone other than 
the intended recipient should receive this e-mail, he / she shall not be 
entitled to read, disseminate, disclose or duplicate it.

If you receive this e-mail unintentionally, please inform us immediately by "reply" 
and then delete it from your system. Although this information has been compiled with great 
care, neither IMC Financial Markets & Asset Management nor any of its related entities 
shall accept any responsibility for any errors, omissions or other inaccuracies in this 
information or for the consequences thereof, nor shall it be bound in any way by the contents 
of this e-mail or its attachments. In the event of incomplete or incorrect transmission, 
please return the e-mail to the sender and permanently delete this message and any 
attachments.

Messages and attachments are scanned for all known viruses. Always scan 
attachments before opening them.

Reply via email to