bugfix: reactor网络模型的的半包解析错误问题。

全量持久化时清除增量持久化的记录。
This commit is contained in:
2026-01-08 16:20:00 +08:00
parent 3cc97b9454
commit de21fe94ec
10 changed files with 282 additions and 121 deletions

View File

@@ -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
/*