redisclient
redisclient copied to clipboard
redisclient publish api memory leak
@nekipelov @elnull use redisclient pubsub to publish message, but when i publish message 5000000, one message 290 Bytes, it will occur 2G memory leak above. top command show 2G memory that is not free, but it is no memory leak when i use gperftools or valgrind to check memory leak. code is below :
#include
#include <redisclient/redisasyncclient.h>
#include <gperftools/heap-profiler.h>
static const std::string channelName = "test_msg"; static const boost::posix_time::seconds timeout(1); static std::atomic_int unique_send(0); static std::atomic_int unique_cb_succ(0); static std::atomic_int unique_cb_fail(0); static std::atomic_int unique_pub_err(0);
class Client { public: Client(boost::asio::io_service &ioService) : ioService(ioService), publisher(ioService) { boost::asio::ip::address address = boost::asio::ip::address::from_string("127.0.0.1"); const unsigned short port = 6379; boost::asio::ip::tcp::endpoint endpoint(address, port);
publisher.installErrorHandler(std::bind(&Client::onPublishError, this, std::placeholders::_1));
publisher.connect(endpoint, [&](boost::system::error_code ec)
{
if(ec)
{
std::cerr << "publisher Can't connect to redis: " << ec.message() << std::endl;
return;
}
//publishHandler(std::atoi(argv[1]), std::ref(publisher));
publishHandler(5000000, std::ref(publisher));
});
}
void onPublishError(const std::string& error) {
unique_pub_err++;
std::cout << "publish error : " << error << ", count : " << unique_pub_err << std::endl;
}
void publishHandler(const int count, redisclient::RedisAsyncClient &publisher)
{
std::string msg = "{\"data\":{\"loc\":{\"1\":[\"{\\\"pos\\\": [17429, 0, 124300], \\\"yawDeg\\\": 0, \\\"state\\\": 1, \\\"speed\\\": 1500, \\\"seatName\\\": \\\"\\\", \\\"actionType\\\": -1, \\\"camera\\\": 0, \\\"mic\\\": 0, \\\"imGid\\\": 0, \\\"imColor\\\": \\\"\\\", \\\"ts\\\": 1673856701650}\",1673856701650]}},\"spid\":1,\"type\":102,\"users\":1,\"version\":1}";
redisclient::RedisBuffer message(msg);
for (int k = 0; k < count; k++) {
unique_send++;
//std::cout << "publish count : " << unique_send << std::endl;
publisher.publish(channelName, message, [&](redisclient::RedisValue v) {
int code = v.isOk() ? 0 : -1;
if (code != 0) {
unique_cb_fail++;
std::cout << "publishedHandler publish failed count : " << unique_cb_fail << std::endl;
} else {
unique_cb_succ++;
if (unique_cb_succ == 5000000) {
std::cout << "publishedHandler publish success count : " << unique_cb_succ << std::endl;
ioService.stop();
sleep(60*2);
}
}
});
}
}
private: boost::asio::io_service &ioService; redisclient::RedisAsyncClient publisher; };
int main(int argc, char ** argv) { if (argc < 1) { std::cout << "usage error, please use like below : " << std::endl; std::cout << "async_pubsub3 loop_count" << std::endl; return -1; }
boost::asio::io_service ioService;
Client client(ioService);
ioService.run();
return 0;
}