将读取配置单独抽出形成parameter API;支持Redis多机备份和故障切换。
This commit is contained in:
119
cache/src/tango_cache_redis.cpp
vendored
119
cache/src/tango_cache_redis.cpp
vendored
@@ -39,19 +39,82 @@ struct http_hdr_name g_http_hdr_name[HDR_CONTENT_NUM]=
|
||||
{"content-md5", "Content-MD5: "}
|
||||
};
|
||||
|
||||
//һ<><D2BB>mainip<69><70><EFBFBD>ӳɹ<D3B3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>
|
||||
static void main_redis_asyn_connect_cb(const struct redisAsyncContext *ac, int status)
|
||||
{
|
||||
struct tango_cache_instance *instance = (struct tango_cache_instance *)redisAsyncGetConnectionData(ac);
|
||||
|
||||
if(status == REDIS_OK)
|
||||
{
|
||||
evtimer_del(&instance->timer_redis);
|
||||
if(instance->redis_connecting == CACHE_REDIS_CONNECTED)
|
||||
{
|
||||
redisAsyncDisconnect(instance->redis_ac);
|
||||
}
|
||||
sprintf(instance->current_redisip, "%s", instance->param->redis.mainip);
|
||||
instance->redis_ac = (struct redisAsyncContext *)ac;
|
||||
instance->redis_connecting = CACHE_REDIS_CONNECTED;
|
||||
MESA_HANDLE_RUNTIME_LOGV2(instance->runtime_log, RLOG_LV_INFO, "Redis connect %s:%u success.",
|
||||
instance->param->redis.mainip, instance->param->redis.port);
|
||||
}
|
||||
else
|
||||
{
|
||||
MESA_HANDLE_RUNTIME_LOGV2(instance->runtime_log, RLOG_LV_INFO, "Redis connect %s:%u failed: %s.",
|
||||
instance->param->redis.mainip, instance->param->redis.port, ac->errstr);
|
||||
}
|
||||
}
|
||||
|
||||
static void redis_asyn_disconnect_cb(const struct redisAsyncContext *ac, int status)
|
||||
{
|
||||
struct tango_cache_instance *instance = (struct tango_cache_instance *)redisAsyncGetConnectionData(ac);
|
||||
|
||||
if(status == REDIS_OK)
|
||||
{
|
||||
MESA_HANDLE_RUNTIME_LOGV2(instance->runtime_log, RLOG_LV_INFO, "Redis disconnect %s:%u success.", instance->redis_ip, instance->redis_port);
|
||||
MESA_HANDLE_RUNTIME_LOGV2(instance->runtime_log, RLOG_LV_INFO, "Redis disconnect %s:%u success.",
|
||||
instance->current_redisip, instance->param->redis.port);
|
||||
}
|
||||
else
|
||||
{
|
||||
MESA_HANDLE_RUNTIME_LOGV2(instance->runtime_log, RLOG_LV_INFO, "Redis disconnect %s:%u failed: %s.", instance->redis_ip, instance->redis_port, ac->errstr);
|
||||
MESA_HANDLE_RUNTIME_LOGV2(instance->runtime_log, RLOG_LV_INFO, "Redis disconnect %s:%u failed: %s.",
|
||||
instance->current_redisip, instance->param->redis.port, ac->errstr);
|
||||
}
|
||||
instance->redis_connecting = CACHE_REDIS_DISCONNECTED;
|
||||
|
||||
if(!strcmp(instance->current_redisip, instance->param->redis.mainip))
|
||||
{
|
||||
main_redis_check_timer_start(instance);
|
||||
}
|
||||
}
|
||||
|
||||
void main_redis_check_timer_cb(evutil_socket_t fd, short what, void *arg)
|
||||
{
|
||||
struct tango_cache_instance *instance = (struct tango_cache_instance *)arg;
|
||||
redisAsyncContext *redis_ac;
|
||||
struct timeval tv;
|
||||
|
||||
redis_ac = redisAsyncConnect(instance->param->redis.mainip, instance->param->redis.port);
|
||||
if(redis_ac == NULL)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
redisLibeventAttach(redis_ac, instance->evbase);
|
||||
redisAsyncSetConnectionData(redis_ac, instance);
|
||||
redisAsyncSetConnectCallback(redis_ac, main_redis_asyn_connect_cb);
|
||||
redisAsyncSetDisconnectCallback(redis_ac, redis_asyn_disconnect_cb);
|
||||
|
||||
tv.tv_sec = 60;
|
||||
tv.tv_usec = 0;
|
||||
evtimer_add(&instance->timer_redis, &tv);
|
||||
}
|
||||
|
||||
void main_redis_check_timer_start(struct tango_cache_instance *instance)
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
tv.tv_sec = 60;
|
||||
tv.tv_usec = 0;
|
||||
evtimer_assign(&instance->timer_redis, instance->evbase, main_redis_check_timer_cb, instance);
|
||||
evtimer_add(&instance->timer_redis, &tv);
|
||||
}
|
||||
|
||||
static void redis_asyn_connect_cb(const struct redisAsyncContext *ac, int status)
|
||||
@@ -60,19 +123,27 @@ static void redis_asyn_connect_cb(const struct redisAsyncContext *ac, int status
|
||||
|
||||
if(status == REDIS_OK)
|
||||
{
|
||||
MESA_HANDLE_RUNTIME_LOGV2(instance->runtime_log, RLOG_LV_INFO, "Redis connect %s:%u success.", instance->redis_ip, instance->redis_port);
|
||||
MESA_HANDLE_RUNTIME_LOGV2(instance->runtime_log, RLOG_LV_INFO, "Redis connect %s:%u success.",
|
||||
instance->current_redisip, instance->param->redis.port);
|
||||
instance->redis_connecting = CACHE_REDIS_CONNECTED;
|
||||
}
|
||||
else
|
||||
{
|
||||
MESA_HANDLE_RUNTIME_LOGV2(instance->runtime_log, RLOG_LV_INFO, "Redis connect %s:%u failed: %s.", instance->redis_ip, instance->redis_port, ac->errstr);
|
||||
instance->redis_connecting = CACHE_REDIS_CONNECT_IDLE;
|
||||
MESA_HANDLE_RUNTIME_LOGV2(instance->runtime_log, RLOG_LV_INFO, "Redis connect %s:%u failed: %s.",
|
||||
instance->current_redisip, instance->param->redis.port, ac->errstr);
|
||||
if(!strcmp(instance->current_redisip, instance->param->redis.mainip))
|
||||
{
|
||||
main_redis_check_timer_start(instance);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int redis_asyn_connect_init(struct tango_cache_instance *instance)
|
||||
int redis_asyn_connect_init(struct tango_cache_instance *instance, const char *redisip)
|
||||
{
|
||||
instance->redis_ac = redisAsyncConnect(instance->redis_ip, instance->redis_port);
|
||||
sprintf(instance->current_redisip, "%s", redisip); //mainip<69>õ<EFBFBD>ʱ<EFBFBD><CAB1>ʹ<EFBFBD><CAB9>mainip
|
||||
|
||||
instance->redis_ac = redisAsyncConnect(instance->current_redisip, instance->param->redis.port);
|
||||
if(instance->redis_ac == NULL)
|
||||
{
|
||||
return -1;
|
||||
@@ -85,6 +156,29 @@ int redis_asyn_connect_init(struct tango_cache_instance *instance)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int wiredlb_redis_asyn_connect(struct tango_cache_instance *instance)
|
||||
{
|
||||
struct WLB_consumer_t cons_array[64];
|
||||
int i, cons_num;
|
||||
|
||||
cons_num = wiredLB_list(instance->param->redis.wiredlb, 64, cons_array);
|
||||
for(i=0; i<cons_num; i++)
|
||||
{
|
||||
if(strcmp(instance->param->redis.mainip, cons_array[i].ip_addr))
|
||||
{
|
||||
if(0==redis_asyn_connect_init(instance, cons_array[i].ip_addr))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(i == cons_num)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_minio_events_json(struct tango_cache_ctx *ctx, const char *jcontent)
|
||||
{
|
||||
cJSON *root, *pobject = NULL, *ptarget, *plastMod, *pexpires;
|
||||
@@ -225,22 +319,23 @@ int tango_cache_head_redis(struct tango_cache_ctx *ctx)
|
||||
{
|
||||
case CACHE_REDIS_CONNECTED:
|
||||
ret = redisAsyncCommand(ctx->instance->redis_ac, redis_hget_command_cb, ctx, "HGET %s %s/%s",
|
||||
ctx->instance->redis_key, ctx->instance->bucketname, ctx->object_key);
|
||||
ctx->instance->param->redis_key, ctx->instance->param->bucketname, ctx->object_key);
|
||||
if(ret != REDIS_OK)
|
||||
{
|
||||
//redisAsyncDisconnect(ctx->instance->redis_ac);
|
||||
redis_asyn_connect_init(ctx->instance);
|
||||
ctx->instance->redis_connecting = CACHE_REDIS_CONNECT_IDLE;
|
||||
if(!strcmp(ctx->instance->current_redisip, ctx->instance->param->redis.mainip))
|
||||
{
|
||||
main_redis_check_timer_start(ctx->instance);
|
||||
}
|
||||
tango_cache_set_fail_state(ctx, CACHE_ERR_REDIS_CONNECT);
|
||||
promise_failed(future_to_promise(ctx->future), FUTURE_ERROR_CANCEL, tango_cache_get_errstring(ctx));
|
||||
tango_cache_ctx_destroy(ctx);
|
||||
}
|
||||
break;
|
||||
case CACHE_REDIS_DISCONNECTED:
|
||||
case CACHE_REDIS_CONNECT_IDLE:
|
||||
redis_asyn_connect_init(ctx->instance);
|
||||
wiredlb_redis_asyn_connect(ctx->instance);
|
||||
case CACHE_REDIS_CONNECTING:
|
||||
tango_cache_set_fail_state(ctx, CACHE_ERR_REDIS_CONNECT);
|
||||
promise_failed(future_to_promise(ctx->future), FUTURE_ERROR_CANCEL, tango_cache_get_errstring(ctx));
|
||||
tango_cache_ctx_destroy(ctx);
|
||||
break;
|
||||
default: assert(0);break;
|
||||
|
||||
Reference in New Issue
Block a user