Skip to content

redisclient publish api memory leak #84

@zhanmail

Description

@zhanmail

@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
#include
#include <boost/asio/ip/address.hpp>
#include <boost/format.hpp>
#include <boost/asio/deadline_timer.hpp>

#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;

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions