redisclient icon indicating copy to clipboard operation
redisclient copied to clipboard

Core dump when using RedisSyncClient::command

Open SnowfallDan opened this issue 5 years ago • 0 comments

hi

i am facing a core dump when call RedisSyncClient::command() function.

My env : boost: 1.7.0 gcc: 6.3.0 os: centos 7.6

gdb's bt: (gdb) bt #0 0x00007f46f5e1295f in __memmove_ssse3_back () from /lib64/libc.so.6 #1 0x000000000055151d in redisclient::RedisClientImpl::syncReadResponse(boost::posix_time::time_duration const&, boost::system::error_code&) () #2 0x000000000055137f in redisclient::RedisClientImpl::doSyncCommand(std::deque<redisclient::RedisBuffer, std::allocatorredisclient::RedisBuffer > const&, boost::posix_time::time_duration const&, boost::system::error_code&) () #3 0x0000000000552028 in redisclient::RedisSyncClient::command(std::string, std::deque<redisclient::RedisBuffer, std::allocatorredisclient::RedisBuffer >, boost::system::error_code&) () #4 0x0000000000551eef in redisclient::RedisSyncClient::command(std::string, std::deque<redisclient::RedisBuffer, std::allocatorredisclient::RedisBuffer >)()

Source code: ` long get_update_remain(const void *sql_ctx, const void *redis_ctx, const char *user_id, unsigned int flow_size) { long remain_k = 0; string key_remain_size = string(KEY_ORDER_REMAIN_SIZE) + user_id;

assert(redis_ctx);
auto redis = (redisclient::RedisSyncClient *) redis_ctx;

redisclient::RedisValue result;
result = redis->command("GET", {key_remain_size});
string res = result.toString();
if (result.isError() || result.toString().empty())
{
    printf("GET error, key[%s], result[%s]\n",
           key_remain_size.c_str(), result.toString().c_str());

    //select new order
    if (!select_order(sql_ctx, redis_ctx, user_id))
    {
        return 0;
    }
}
else
{
    try
    {
        printf("%s\n", result.toString().c_str());
        remain_k = std::stol(result.toString());
        printf("before DECRBY remain_k is %ld\n", remain_k);
    }
    catch (...)
    {
        printf("error");
    }
}

if(flow_size == 0)
    return remain_k;

//Redis Dec
result = redis->command("DECRBY", {key_remain_size, std::to_string(flow_size/1024)});
if (result.isError() || !result.isInt())
{
    printf("DECRBY key=%s error\n", key_remain_size.c_str());
    return 0;
}
remain_k = (long)result.toInt();
printf("after DECRBY remain_k is %ld\n", remain_k);

if (remain_k<=0)
    unset_order(sql_ctx, redis_ctx, user_id);

return remain_k;

}`

SnowfallDan avatar May 04 '20 03:05 SnowfallDan