bugfix: reactor网络模型的的半包解析错误问题。
全量持久化时清除增量持久化的记录。
This commit is contained in:
48
kvstore.c
48
kvstore.c
@@ -249,16 +249,23 @@ int kvs_filter_protocol(char **tokens, int count, char *response) {
|
||||
#if NEW_KVSTORE
|
||||
/**
|
||||
* input : request request_length
|
||||
* output : response response_length consumed_out
|
||||
* output : response response_length
|
||||
* return : -1 error, =0 半包, 1 成功
|
||||
*/
|
||||
int kvs_protocol(char *request, int request_length, int *consumed_out, char *response, int *response_length){
|
||||
if (!request || request_length <= 0 || !consumed_out || !response || !response_length) return KVS_NEED_MORE;
|
||||
int kvs_protocol(char *request, int request_length, char *response, int *response_length){
|
||||
if (!request || request_length <= 0 || !response || !response_length) return -1;
|
||||
int consumed = 0;
|
||||
int out_len = 0;
|
||||
int budget = KVS_MAX_CMDS_PER_CALL;
|
||||
|
||||
while(consumed < request_length && (budget-- > 0)){
|
||||
static int i = 0;
|
||||
while(consumed < request_length ){
|
||||
if(i > 33){
|
||||
i = i+1;
|
||||
i = i-1;
|
||||
}
|
||||
if(i == 47) i = 0;
|
||||
++i;
|
||||
|
||||
kvs_req_t req;
|
||||
memset(&req, 0, sizeof(kvs_req_t));
|
||||
|
||||
@@ -267,12 +274,13 @@ int kvs_protocol(char *request, int request_length, int *consumed_out, char *res
|
||||
|
||||
int len = kvs_parse_one_cmd(p, remain, &req);
|
||||
if(len < 0){
|
||||
// 解析失败
|
||||
kvs_free_request(&req);
|
||||
*consumed_out = consumed;
|
||||
*response_length = out_len;
|
||||
return KVS_ERROR;
|
||||
return -1;
|
||||
}
|
||||
else if(len == 0){
|
||||
// 半包
|
||||
kvs_free_request(&req);
|
||||
break;
|
||||
}
|
||||
@@ -280,32 +288,26 @@ int kvs_protocol(char *request, int request_length, int *consumed_out, char *res
|
||||
kvs_rsp_t rsp;
|
||||
memset(&rsp, 0, sizeof(kvs_rsp_t));
|
||||
|
||||
// 执行失败
|
||||
if (kvs_execute_one_cmd(&req, &rsp) < 0){
|
||||
kvs_free_request(&req);
|
||||
*consumed_out = consumed;
|
||||
*response_length = out_len;
|
||||
return KVS_ERROR;
|
||||
return -1;
|
||||
}else{
|
||||
// 执行成功,在这里保存到日志中。
|
||||
if(req.op == KVS_CMD_SET || req.op == KVS_CMD_MOD || req.op == KVS_CMD_DEL){
|
||||
printf("%d:%d\n", req.op, req.argc);
|
||||
kvs_save_cmd_to_logfile(p, len, global_cmd_log_fd);
|
||||
if(rsp.status == KVS_STATUS_OK){
|
||||
if(req.op == KVS_CMD_SET || req.op == KVS_CMD_MOD || req.op == KVS_CMD_DEL){
|
||||
kvs_save_cmd_to_logfile(p, len, global_cmd_log_fd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (out_len >= KVS_MAX_RESPONSE) {
|
||||
kvs_free_request(&req);
|
||||
*consumed_out = consumed;
|
||||
*response_length = out_len;
|
||||
return KVS_ERROR;
|
||||
}
|
||||
|
||||
int resp_len = kvs_build_one_rsp(&rsp, (uint8_t *)response+out_len, KVS_MAX_RESPONSE-out_len);
|
||||
// 构建响应 <0 构建失败
|
||||
kvs_free_request(&req);
|
||||
if (resp_len < 0) {
|
||||
*consumed_out = consumed;
|
||||
*response_length = out_len;
|
||||
return KVS_ERROR;
|
||||
return -1;
|
||||
}
|
||||
|
||||
// printf("resp_len:%d\n", resp_len);
|
||||
@@ -314,10 +316,8 @@ int kvs_protocol(char *request, int request_length, int *consumed_out, char *res
|
||||
consumed += len;
|
||||
}
|
||||
|
||||
*consumed_out = consumed;
|
||||
*response_length = out_len;
|
||||
if (consumed == 0 && out_len == 0) return KVS_NEED_MORE;
|
||||
return KVS_OK;
|
||||
return consumed;
|
||||
}
|
||||
#else
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user