Skip to content

Commit 1300496

Browse files
committedJul 19, 2015
fixed bug in redis_command::run where existing a invlid conn's refering
1 parent 33125fe commit 1300496

File tree

1 file changed

+18
-6
lines changed

1 file changed

+18
-6
lines changed
 

‎lib_acl_cpp/src/redis/redis_command.cpp

+18-6
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ const redis_result* redis_command::run(redis_client_cluster* cluster,
425425

426426
if (result_ == NULL)
427427
{
428-
// 将连接对象归还给连接池对象
428+
// 将旧连接对象归还给连接池对象
429429
conn->get_pool()->put(conn, true);
430430
logger_error("result NULL");
431431

@@ -437,7 +437,7 @@ const redis_result* redis_command::run(redis_client_cluster* cluster,
437437

438438
if (type == REDIS_RESULT_UNKOWN)
439439
{
440-
// 将连接对象归还给连接池对象
440+
// 将旧连接对象归还给连接池对象
441441
conn->get_pool()->put(conn, true);
442442
logger_error("unknown result type: %d", type);
443443

@@ -465,22 +465,25 @@ const redis_result* redis_command::run(redis_client_cluster* cluster,
465465
return result_;
466466
}
467467

468-
// 以下过程不再引用该次的 conn 对象,此处将连接对象归还给连接池对象
469-
conn->get_pool()->put(conn, true);
470-
471468
#define EQ(x, y) !strncasecmp((x), (y), sizeof(y) -1)
472469

473470
// 对于结果类型为错误类型,则需要进一步判断是否是重定向指令
474471
const char* ptr = result_->get_error();
475472
if (ptr == NULL || *ptr == 0)
476473
{
474+
// 将旧连接对象归还给连接池对象
475+
conn->get_pool()->put(conn, true);
477476
logger_error("result error: null");
477+
478478
return result_;
479479
}
480480

481481
// 如果出错信息为重定向指令,则执行重定向过程
482482
if (EQ(ptr, "MOVED"))
483483
{
484+
// 将旧连接对象归还给连接池对象
485+
conn->get_pool()->put(conn, true);
486+
484487
const char* addr = get_addr(ptr);
485488
if (addr == NULL)
486489
{
@@ -515,6 +518,9 @@ const redis_result* redis_command::run(redis_client_cluster* cluster,
515518
}
516519
else if (EQ(ptr, "ASK"))
517520
{
521+
// 将旧连接对象归还给连接池对象
522+
conn->get_pool()->put(conn, true);
523+
518524
const char* addr = get_addr(ptr);
519525
if (addr == NULL)
520526
{
@@ -573,20 +579,26 @@ const redis_result* redis_command::run(redis_client_cluster* cluster,
573579
acl_doze(redirect_sleep_);
574580
}
575581

582+
// 将旧连接对象归还给连接池对象
583+
conn->get_pool()->put(conn, true);
584+
576585
conn = peek_conn(cluster, -1);
577586
if (conn == NULL)
578587
{
579588
logger_error("peek_conn NULL");
580589
return result_;
581590
}
582-
clear(true);
583591

592+
clear(true);
584593
set_client_addr(*conn);
585594
}
586595

587596
// 对于其它错误类型,则直接返回本次得到的响应结果对象
588597
else
589598
{
599+
// 将旧连接对象归还给连接池对象
600+
conn->get_pool()->put(conn, true);
601+
590602
logger_error("server error: %s", ptr);
591603
return result_;
592604
}

0 commit comments

Comments
 (0)
Please sign in to comment.