apache / rocketmq-client-cpp

Apache RocketMQ cpp client

Home Page:https://rocketmq.apache.org/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Memory leak in TcpTransport::getInetAddr

LeeTsen opened this issue · comments

int err = evutil_getaddrinfo(hostname.c_str(), NULL, &hints, &answer);

The answer returned by evutil_getaddrinfo should be released by evutil_freeaddrinfo.

the leak happens only when using CProducer while setting server with a domian not a IP;
I also tried cpp class DefaultMQProducer, it's totally ok without it.

it seems c-based interface has such leaks

the code like this
SetProducerNameServerAddress(producer, "some.domain.com:9876");

found version:
2.2.0

here is the result from Valgrind

==12866== 5,760 (960 direct, 4,800 indirect) bytes in 15 blocks are definitely lost in loss record 7 of 9
==12866== at 0x4C29F73: malloc (vg_replace_malloc.c:309)
==12866== by 0x6361E8A: gaih_inet.constprop.8 (in /usr/lib64/libc-2.17.so)
==12866== by 0x63635F3: getaddrinfo (in /usr/lib64/libc-2.17.so)
==12866== by 0x53C7B38: evutil_getaddrinfo (in /usr/lib64/librocketmq.so)
==12866== by 0x5379357: rocketmq::TcpTransport::getInetAddr(std::string&) (TcpTransport.cpp:105)
==12866== by 0x5379672: rocketmq::TcpTransport::connect(std::string const&, int) (TcpTransport.cpp:160)
==12866== by 0x536ACEA: rocketmq::TcpRemotingClient::CreateTransport(std::string const&, bool) (TcpRemotingClient.cpp:339)
==12866== by 0x536B068: rocketmq::TcpRemotingClient::CreateNameServerTransport(bool) (TcpRemotingClient.cpp:390)
==12866== by 0x536A989: rocketmq::TcpRemotingClient::GetTransport(std::string const&, bool) (TcpRemotingClient.cpp:293)
==12866== by 0x536A134: rocketmq::TcpRemotingClient::invokeSync(std::string const&, rocketmq::RemotingCommand&, int) (TcpRemotingClient.cpp:203)
==12866== by 0x5243C2C: rocketmq::MQClientAPIImpl::getTopicRouteInfoFromNameServer(std::string const&, int, rocketmq::SessionCredentials const&) (MQClientAPIImpl.cpp:315)
==12866== by 0x5257CA3: rocketmq::MQClientFactory::updateTopicRouteInfoFromNameServer(std::string const&, rocketmq::SessionCredentials const&, bool) (MQClientFactory.cpp:172)
==12866==
==12866== 7,296 (1,216 direct, 6,080 indirect) bytes in 19 blocks are definitely lost in loss record 9 of 9
==12866== at 0x4C29F73: malloc (vg_replace_malloc.c:309)
==12866== by 0x6361E8A: gaih_inet.constprop.8 (in /usr/lib64/libc-2.17.so)
==12866== by 0x63635F3: getaddrinfo (in /usr/lib64/libc-2.17.so)
==12866== by 0x53C7B38: evutil_getaddrinfo (in /usr/lib64/librocketmq.so)
==12866== by 0x5379357: rocketmq::TcpTransport::getInetAddr(std::string&) (TcpTransport.cpp:105)
==12866== by 0x5379672: rocketmq::TcpTransport::connect(std::string const&, int) (TcpTransport.cpp:160)
==12866== by 0x536ACEA: rocketmq::TcpRemotingClient::CreateTransport(std::string const&, bool) (TcpRemotingClient.cpp:339)
==12866== by 0x536B068: rocketmq::TcpRemotingClient::CreateNameServerTransport(bool) (TcpRemotingClient.cpp:390)
==12866== by 0x536A989: rocketmq::TcpRemotingClient::GetTransport(std::string const&, bool) (TcpRemotingClient.cpp:293)
==12866== by 0x536A134: rocketmq::TcpRemotingClient::invokeSync(std::string const&, rocketmq::RemotingCommand&, int) (TcpRemotingClient.cpp:203)
==12866== by 0x5243C2C: rocketmq::MQClientAPIImpl::getTopicRouteInfoFromNameServer(std::string const&, int, rocketmq::SessionCredentials const&) (MQClientAPIImpl.cpp:315)
==12866== by 0x5257DDA: rocketmq::MQClientFactory::updateTopicRouteInfoFromNameServer(std::string const&, rocketmq::SessionCredentials const&, bool) (MQClientFactory.cpp:184)