activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Christian Mamen (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (AMQCPP-543) message producer send never blocking when using producer flow control
Date Fri, 16 May 2014 18:23:14 GMT

     [ https://issues.apache.org/jira/browse/AMQCPP-543?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Christian Mamen updated AMQCPP-543:
-----------------------------------

    Attachment: activemq-cpp_AMQCPP-543_v0.patch

Hi,
I compare with the java client, and uploaded a patch that I think does pretty much what the
java do.

The java assume the latest version of the protocol by default and when it receives a wireFormatInfo
command from the broker, saves the protocol version. this is done in an AtomicInteger.

ActiveMQMessageProducer.java
{code}
        // Enable producer window flow control if protocol > 3 and the window
        // size > 0
        if (session.connection.getProtocolVersion() >= 3 && this.info.getWindowSize()
> 0) {
            producerWindow = new MemoryUsage("Producer Window: " + producerId);
            producerWindow.setExecutor(session.getConnectionExecutor());
            producerWindow.setLimit(this.info.getWindowSize());
            producerWindow.start();
        }
{code}

Can you explain why the comment says protocol > 3, but the code actually does >= 3?
Perhaps you can also review the patch?





> message producer send never blocking when using producer flow control
> ---------------------------------------------------------------------
>
>                 Key: AMQCPP-543
>                 URL: https://issues.apache.org/jira/browse/AMQCPP-543
>             Project: ActiveMQ C++ Client
>          Issue Type: New Feature
>          Components: Openwire
>    Affects Versions: 3.8.2
>            Reporter: Christian Mamen
>            Assignee: Timothy Bish
>            Priority: Minor
>         Attachments: activemq-cpp_AMQCPP-543_v0.patch
>
>
> For testing, 
> message producer is set to non-persisted mode, with the connection producer window size
to 1MB. (the broker enables the producer flow control and set the memory limit to ~10MB with
vm only storage)
> I notice that when i don't have any message consumer, the broker notify me that the memory
limit is reached, that the producer will be throttled (as i would expect), however the producer
never blocks on a send, as if the window size has no effect.
> while digging into ActiveMQProducerKernel.cpp,
> I notice the private member memoryUsage (auto_ptr) is never initialized. and there's
a TODO in the code ?
> {code}
> ActiveMQProducerKernel::ActiveMQProducerKernel(
> [...]
>     // TODO - Check for need of MemoryUsage if there's a producer Windows size
>     //        and the Protocol version is greater than 3.
> }
> {code}
> I tried initializing the memoryUsage, and producer seem to block as expected on a send,
when the limit is reached.
> {code}
> ActiveMQProducerKernel::ActiveMQProducerKernel(
> [...]
>     // TODO - Check for need of MemoryUsage if there's a producer Windows size
>     //        and the Protocol version is greater than 3.
>     if (session->getConnection()->getProducerWindowSize()) { 
>             this->memoryUsage.reset( new MemoryUsage(session->getConnection()->getProducerWindowSize())
);
>     }
> }
> {code}
> I'm not sure what is the proper fix,



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Mime
View raw message