You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by Steve Huston <sh...@riverace.com> on 2009/06/24 18:52:43 UTC

RE: client request memory leak on windows

Hi David,

No, the code shouldn't be simply reintroduced... It fixed a memory
corruption on the broker side by deleting too early.

Could you please enter this in JIRA along with a test case please?

Thanks,
-Steve

> -----Original Message-----
> From: David Rennalls [mailto:drennalls@gmail.com] 
> Sent: Wednesday, June 24, 2009 11:39 AM
> To: qpid-dev@incubator.apache.org
> Subject: C++: client request memory leak on windows
> 
> 
> Hi,
>     I'm experiencing a memory leak when using the client 
> library on Windows (0.5 release) when 
> sending a single request. From what debugging I've done so 
> far it looks like the The AsynchIO object 
> used by the TCPConnector is not being deleted.  When the 
> connection is being closed 
> aio->queueForDeletion() is called from 
> TCPConnector::closeInternal().. However in 
> AsynchIO::queueForDeletion() aio.opsInProgress > 0 so the 
> 'delete this' branch is not done. There 
> are no more queueForDeletion() calls made on the aio object 
> (after opsInProgress is 0) and so it 
> never gets deleted. The ConnectionImpl object involved is not 
> cleaned up either, the shared_ptr to 
> it has a non-zero ref count but I'm guessing it's related to 
> the AsynchIO object not being cleaned up.
> 
> There used to be some code in AsynchIO::completion() that 
> seems like it would do the necessary 
> delete. It was removed with code changes in 
> https://issues.apache.org/jira/browse/QPID-1550
> The extra handling in completion() was as follows..
> 
> -    // Lock released; ok to delete if all is done.
> -    if (opsInProgress == 0 && queuedDelete)
> -        delete this;
> 
> Should that code be re-introduced (I don't know the history 
> nor the 'big picture'), or could this be 
> due to my usage ? My reproduction code is as follows.. The 
> CRT memory leak report gets printed when 
> the test program exits, that's what lead me to aio allocation 
> that isn't being freed.
> 
> #define _CRTDBG_MAP_ALLOC
> #include <cstdlib>
> #include <crtdbg.h>
> 
> #include <qpid/client/Connection.h>
> #include <qpid/client/Session.h>
> #include <qpid/client/Message.h>
> #include <qpid/client/SubscriptionManager.h>
> #include "qpid/sys/Time.h"
> 
> #include <iostream>
> 
> using namespace qpid::client;
> using namespace qpid::framing;
> using qpid::sys::TIME_SEC;
> 
> int main(int argc, char **argv)
> {
> 
>     _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
>     _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG | 
> _CRTDBG_MODE_WNDW);
> 
>     Connection connection;
>     Message response;
>     try
>     {
>        //qpid::TcpAddress::DEFAULT_PORT
>        connection.open("10.39.170.224");
>        Session session =  connection.newSession();
> 
>        // Create a response queue using the client's session 
> id as the name of
>        // the response queue
>        string responseQueue = "x.client" +
session.getId().getName();
> 
>        // Use the name of the response queue as the routing 
> key as well
>        session.queueDeclare(arg::queue=responseQueue);
>        session.exchangeBind(arg::exchange="amq.direct",
>              arg::queue=responseQueue,
arg::bindingKey=responseQueue);
> 
>        // Setup a message using our response queue so the
>        // the service knows where to route response messages.
>        Message req;
>        DeliveryProperties &deliveryProps = 
> req.getDeliveryProperties();
>        deliveryProps.setRoutingKey("x.request");
> 
>        MessageProperties &messageProps = req.getMessageProperties();
>        messageProps.setReplyTo(ReplyTo("amq.direct",
responseQueue));
> 
>        session.messageTransfer(arg::content=req, 
> arg::destination="amq.direct", arg::acceptMode=0);
> 
>        // Create a listener for the response queue and listen 
> for response messages.
>        SubscriptionManager subsManager(session);
>        if(!subsManager.get(response, responseQueue, TIME_SEC))
>           std::cout << "Timed out waiting for a response" << 
> std::endl;
>     }
>     catch(const std::exception& error)
>     {
>        std::cout << "exception thrown.." << std::endl
>                  << error.what() << std::endl;
>     }
> 
>     return 0;
> }
> 
> - David
> 
>
---------------------------------------------------------------------
> Apache Qpid - AMQP Messaging Implementation
> Project:      http://qpid.apache.org
> Use/Interact: mailto:dev-subscribe@qpid.apache.org
> 
> 


---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:dev-subscribe@qpid.apache.org