2.2. Bug Fixes

qpid-java

BZ#915333 - Java client raises javax.jms.JMSException instead of InvalidDestinationException in BasicMessageProducer.send() method

It was discovered that the javax.jms.JMSException raised when attempting to send a message to an invalid destination in the Java client was too generalized. This causes problems with exception handling in a Java application. The client has been improved to raise a proper InvalidDestinationException for this particular use case, which fixes the issue.
BZ#929169 - Closing a topic consumer should delete its exclusive auto-delete queue

The expected behavior of a topic consumer is to persist the subscription queue when the topic consumer is closed. The subscription queue is deleted automatically when the session is closed due to being marked auto-delete. It was discovered that the subscription queue remained on the broker, even after the subscription queue was closed. The fix now ensures the subscription queue is deleted when the consumer is closed, with the exception of JMS durable subscriptions.

qpid-cpp

BZ#693721 - Session names longer than 256 bytes cause errors when encoding session management objects

AMQP 0-10 allowed session names to be up to 2^16 bytes long. The QMF management schema for the broker defined the name of a session object as being up to 2^8 bytes long. If a session was created with a name greater than 256 bytes, the broker could not send out management objects for the session, and periodic processing failed. Changes to the QMF management tools now support long-named sessions, which fixes the originally reported issue.
BZ#1186693 - [amqp1.0] Abort after uncaught UnknownExchangeTypeException

It was discovered that the QPID Broker aborted with an uncaught UnknownExchangeTypeException when the client attempted to request an unsupported exchange type. The code for the Exchange Registry and Node Policy has been improved to prevent this issue from happening again.
BZ#1160232 - [regression] broker sometimes forgets to send connection heartbeats

It was discovered that the timer task for periodic queue purging was added to the timer’s set of tasks twice. This caused the timer’s internal state to become corrupted, which in turn prevented some tasks from being triggered. The logic is now fixed to ensure the task is not included multiple times within the timer.
BZ#1160154 - C++ and .NET clients on Windows do not support AMQP 1.0 protocol

It was discovered that a build script did not include the Proton shared install directory. AMQP 1.0 support delivered by Proton was absent. The fix adds the framework code to specify and use the Proton shared install directory. AMQP 1.0 support is now available in the Microsoft Windows SDK.
BZ#1096744 - Increased memory requirements of MRG-M 3.0, as compared to 2.3

Previously, message state was shared between queues on which the message was enqueued. This behavior was incorrect, because certain elements of the state tracked information relevant to the message specific to a particular queue. This caused memory consumption to increase significantly. The amount of duplicated (per queue) state tracked for each message is now optimised to reduce the amount of memory required. Though a given scenario may still (unavoidably) require a little more memory, memory consumption is reduced compared to the original scenario.
BZ#916975 - Journal can not manage enqueues matching two bindings from headers exchange to the same queue

It was discovered that if a message sent to a headers exchange matched two bindings to the same queue, the queue attempted to enqueue the message twice. This caused a journal exception when the queue attempted to store the message. The headers exchange implementation has been improved to ensure there is just one enqueue made in these circumstances. This prevents the journal exception from occurring, and fixes the originally reported issue.
BZ#1179609 - ring queue disables LVQ

It was discovered that the 'ring' policy and a 'last value queue' queue type were implemented as incompatible options. Selecting the ring policy meant the last value queue type request was effectively ignored, and messages with a given key did not replace older messages on the queue with the same key. Special handling is now added, which now correctly handles the two different behaviours on the same queue. A ring policy on a last value queue now behaves as expected. Messages with the same key replace each other on the queue, and the ring policy now correctly limits the maximum depth of the queue.
BZ#1101533 - QMF opcode _query_request bypasses any ACL authorisation

It was discovered that the QMF query "_query_request" bypassed ACL authorization. This allowed any user with minimal privileges to successfully query any object within the broker, regardless of the ACL rule in place for the object. An enhancement adds ACL authorization for the query method, which prevents users from querying objects they do not have permissions for.
BZ#1093996 - Purging TTL expired messages blocks all other timers, causing connection drops

It was discovered that purging expired messages could take a long time, which prevented the timer thread from servicing other periodic tasks—​such as heartbeats—​in a timely manner. The timer thread is now used only to trigger the purge, with the actual purge task now offloaded to one of the broker’s worker threads. This change allows the timer thread to monitor time state correctly, and allow other jobs such as heartbeat reporting to function correctly.
BZ#1078936 - "csharp.example.server" cannot read connection options

An issue with how the csharp.map.receiver example application command line processing code looked for arguments prevented users from getting the correct result for argument two. The code has been improved so the program argument list is now parsed correctly, which allows users to pass values to argument two correctly.
BZ#1066372 - ACL to take default broker values instead of 0 for queue create parameters

ACL rules check that queue creation sizes are within bounds. When a user request was received and that request did not specify one of the checked sizes, the ACL proceeded checking the ACL rules as if the user had specified zero. For the same user request the broker substituted a default value which was not zero. This caused the ACL rule checks to not render the correct allow or deny decisions. The ACL rule checking behavior is now improved. When the user does not specify a value, the ACL rules are processed using the broker default values and not zero. ACL rule checks are processed using the same values that the broker uses to create the queue. ACL rule checks no longer produce false allow or deny decisions based on queue size limits.
BZ#1066271 - Example application "csharp.map.receiver" with three arguments fails

An issue with how the csharp.map.receiver example application command line processing code looked for arguments prevented users from getting the correct result for argument three. The code has been improved so the program argument list is now parsed correctly, which allows users to pass values to argument three correctly.
BZ#1028289 - Broker reports EXTERNAL mech. not supported if CN is empty.

Insufficient error reporting for malformed client certificates on the broker side made it difficult to determine why the broker was rejecting a connection. The fix introduces improved error message support on the broker side:
2014-06-13 10:58:10 [Security] warning SASL error: unable to offer EXTERNAL mechanism as authid cannot be determined

Users now understand what caused the issue, and can now better resolve the underlying cause of the problem.
BZ#1024685 - Creating a queue with invalid settings results in no queue but only its management object exists

It was discovered that an attempt to create a queue with invalid settings created management object for the queue, but not the queue itself. This caused the user to assume a management queue had been created, when in fact the management object contained no attached queue. The error handling mechanism is now updated to ensure the management object is not created if a queue request contains invalid settings.
BZ#1002605 - Trace queue deletion statistics show msgDepth:0 everytime

It was discovered that the event and log about deleting some provisionable objects (for example, the queue) have zero counters in many statistics, regardless of the truth values. This caused the information in the event and the log to be incorrect. An update in deletion procedures of the objects now ensures the statistic counters provide proper values both in the event and the log.
BZ#977869 - Producing to many queues locks I/O threads for new connections

It was discovered that when a large number of message producing clients were attached to a single broker, and that broker has a fanout exchange with a large number of attached queues, new connections to the broker were delayed significantly, or the connection attempt timed out. The fix changes the maximum amount of time the broker allows a thread to execute before it is freed for the next task. The user can also increase the number of worker threads when starting the broker. The connection delay for starting new connections to the broker is reduced. The new connection delay is further reduced by starting the broker with more worker threads.
BZ#796273 - Priority ring queue lets lower-priority message displace higher-priority

A Ring Priority queue works by removing the lowest priority message if the queue limit is reached. It was discovered that the queue did not take into account whether the new message was a lower priority than the one being removed. A lower priority message could therefore displace a higher-priority message. A fix to the Priority Ring queue now correctly assesses the incoming message priority, and ensures that higher priority messages remain in the queue.
BZ#648690 - "qpid-route route map " with ACL gives "unauthorized-access"

It was discovered that the qpid-route tool only supported the ANONYMOUS SASL mechanism in the route add command, regardless of other mechanisms explicitly set. This caused an unauthorized access error for broker links created by the qpid-route tool, because the originating broker authenticated as an anonymous user with a non-anonymous SASL mechanism set. A change to the method now ensures the authentication mechanism is selected correctly and works as expected.

qpid-sdk

BZ#995496 - [Windows C++ client] An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full

It was discovered that the Windows C++ client would randomly drop SSL connections while reporting a non-existent resource failure: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.

This depended on timing factors and overall network traffic. qpid-cpp was using too many buffers concurrently and reserving available buffers unnecessarily. The Windows C++ client now uses one less buffer for accumulating AMQP frames from encrypted network traffic, and uses all buffers when needed. As a side effect, the qpid-ccp I/O layer now consumes between 64KB and 128KB less memory per connection on all platforms.

python-qpid

BZ#726695 - Unable to create bindings on already existing broker objects using addressing

It was discovered that the python client did not create a binding from an already existing queue, if it was ordered to create both. Improvements to the python client now ensure the binding is created as expected.
BZ#974940 - Python client unexpected exception after ACL denial

It was discovered that an repeated, unexpected exception was raised by an attempt to manipulate a session with either a (closed) session or (open) connection in Python client, after an execution exception closed the session. The exception handling is now improved in such a way that the exception is cleared after it is raised for the first time. Attempts to close the session or connection no longer re-triggers the exception.