uring落盘的无锁队列修改
This commit is contained in:
127
kvstore.c
127
kvstore.c
@@ -45,7 +45,14 @@ void __completed_cmd(const uint8_t *cmd, size_t len, unsigned long long seq){
|
||||
// asm volatile("" ::: "memory");
|
||||
// }
|
||||
|
||||
#include <sys/time.h>
|
||||
#define TIME_SUB_MS(tv1, tv2) ((tv1.tv_sec - tv2.tv_sec) * 1000 + (tv1.tv_usec - tv2.tv_usec) / 1000)
|
||||
#define TIME_SUB_US(tv1, tv2) ((tv1.tv_sec - tv2.tv_sec) * 1000000 + (tv1.tv_usec - tv2.tv_usec))
|
||||
int kvs_protocol(struct conn* conn){
|
||||
// struct timeval func_start;
|
||||
// gettimeofday(&func_start, NULL);
|
||||
// long total_oplog_us = 0;
|
||||
|
||||
if (!conn) return -1;
|
||||
char *request = conn->rbuffer;
|
||||
int request_length = conn->rlength;
|
||||
@@ -80,65 +87,80 @@ int kvs_protocol(struct conn* conn){
|
||||
|
||||
int dr = resp_dispatch(&cmd, &val);
|
||||
|
||||
|
||||
// if(global_cfg.persistence == PERSIST_INCREMENTAL){
|
||||
// kvs_oplog_append(p, len, global_oplog_fd);
|
||||
// }
|
||||
|
||||
/*
|
||||
* 语义建议:
|
||||
* - resp_dispatch() 即使返回 -1(比如 unknown command / wrong argc),
|
||||
* 一般也已经把 out_value 设置成了 RESP error,这样客户端能收到错误响应。
|
||||
* - 如果 dr < 0 但 val.type 没被正确设置,兜底回一个通用错误。
|
||||
*/
|
||||
if(dr < 0){
|
||||
if (val.type != RESP_T_SIMPLE_STR &&
|
||||
val.type != RESP_T_ERROR &&
|
||||
val.type != RESP_T_INTEGER &&
|
||||
val.type != RESP_T_BULK_STR &&
|
||||
val.type != RESP_T_NIL) {
|
||||
val = resp_error("ERR dispatch failed");
|
||||
}
|
||||
} else {
|
||||
// persist into oplog
|
||||
/* 执行成功:在这里保存到日志中(只记录更新类命令) */
|
||||
if (cmd.argc > 0 && cmd.argv[0].ptr) {
|
||||
/* 更新类命令:SET/DEL/MOD/RSET/RDEL/RMOD/HSET/HDEL/HMOD/SAVE */
|
||||
const resp_slice_t *c0 = &cmd.argv[0];
|
||||
int is_update = 0;
|
||||
if (c0->ptr && c0->len) {
|
||||
if (ascii_casecmp(c0->ptr, c0->len, "SET") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "DEL") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "MOD") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "RSET") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "RDEL") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "RMOD") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "HSET") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "HDEL") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "HMOD") == 0) {
|
||||
is_update = 1;
|
||||
}
|
||||
}
|
||||
// struct timeval oplog_start, oplog_end;
|
||||
// gettimeofday(&oplog_start, NULL);
|
||||
|
||||
if (is_update) {
|
||||
if(global_cfg.persistence == PERSIST_INCREMENTAL){
|
||||
kvs_oplog_append(p, len, global_oplog_fd);
|
||||
}
|
||||
// if(dr < 0){
|
||||
// if (val.type != RESP_T_SIMPLE_STR &&
|
||||
// val.type != RESP_T_ERROR &&
|
||||
// val.type != RESP_T_INTEGER &&
|
||||
// val.type != RESP_T_BULK_STR &&
|
||||
// val.type != RESP_T_NIL) {
|
||||
// val = resp_error("ERR dispatch failed");
|
||||
// }
|
||||
// } else {
|
||||
// // persist into oplog
|
||||
// /* 执行成功:在这里保存到日志中(只记录更新类命令) */
|
||||
// if (cmd.argc > 0 && cmd.argv[0].ptr) {
|
||||
// /* 更新类命令:SET/DEL/MOD/RSET/RDEL/RMOD/HSET/HDEL/HMOD/SAVE */
|
||||
// const resp_slice_t *c0 = &cmd.argv[0];
|
||||
// int is_update = 0;
|
||||
// if (c0->ptr && c0->len) {
|
||||
// if (ascii_casecmp(c0->ptr, c0->len, "SET") == 0 ||
|
||||
// ascii_casecmp(c0->ptr, c0->len, "DEL") == 0 ||
|
||||
// ascii_casecmp(c0->ptr, c0->len, "MOD") == 0 ||
|
||||
// ascii_casecmp(c0->ptr, c0->len, "RSET") == 0 ||
|
||||
// ascii_casecmp(c0->ptr, c0->len, "RDEL") == 0 ||
|
||||
// ascii_casecmp(c0->ptr, c0->len, "RMOD") == 0 ||
|
||||
// ascii_casecmp(c0->ptr, c0->len, "HSET") == 0 ||
|
||||
// ascii_casecmp(c0->ptr, c0->len, "HDEL") == 0 ||
|
||||
// ascii_casecmp(c0->ptr, c0->len, "HMOD") == 0) {
|
||||
// is_update = 1;
|
||||
// }
|
||||
// }
|
||||
|
||||
// __completed_cmd(p, len, global_seq);
|
||||
// global_seq ++;
|
||||
// if (is_update) {
|
||||
// if(global_cfg.persistence == PERSIST_INCREMENTAL){
|
||||
// kvs_oplog_append(p, len, global_oplog_fd);
|
||||
// }
|
||||
|
||||
// // __completed_cmd(p, len, global_seq);
|
||||
// // global_seq ++;
|
||||
|
||||
if (global_cfg.replica_mode == REPLICA_ENABLE) {
|
||||
uint32_t off = 0;
|
||||
int ar = replica_shm_append(&g_rep_shm, global_seq, p, (uint32_t)len, &off);
|
||||
if (ar == 0) {
|
||||
// __replica_notify(global_seq, off, (uint32_t)len);
|
||||
global_seq++;
|
||||
// if (global_cfg.replica_mode == REPLICA_ENABLE) {
|
||||
// uint32_t off = 0;
|
||||
// int ar = replica_shm_append(&g_rep_shm, global_seq, p, (uint32_t)len, &off);
|
||||
// if (ar == 0) {
|
||||
// // __replica_notify(global_seq, off, (uint32_t)len);
|
||||
// global_seq++;
|
||||
|
||||
} else {
|
||||
// shm 满或异常:你可以选择降级(比如直接跳过复制,或阻塞/丢弃)
|
||||
// 为了不影响主路径,这里先打印并跳过
|
||||
fprintf(stderr, "replica_shm_append failed %d\n", ar);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// } else {
|
||||
// // shm 满或异常:你可以选择降级(比如直接跳过复制,或阻塞/丢弃)
|
||||
// // 为了不影响主路径,这里先打印并跳过
|
||||
// fprintf(stderr, "replica_shm_append failed %d\n", ar);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
if(global_cfg.persistence == PERSIST_INCREMENTAL){
|
||||
kvs_oplog_append(p, len, global_oplog_fd);
|
||||
}
|
||||
// gettimeofday(&oplog_end, NULL);
|
||||
// total_oplog_us += (oplog_end.tv_sec - oplog_start.tv_sec) * 1000000 +
|
||||
// (oplog_end.tv_usec - oplog_start.tv_usec);
|
||||
|
||||
/* 构建响应 */
|
||||
int cap = KVS_MAX_RESPONSE - out_len;
|
||||
@@ -157,6 +179,13 @@ int kvs_protocol(struct conn* conn){
|
||||
consumed += len;
|
||||
}
|
||||
|
||||
|
||||
// struct timeval func_end;
|
||||
// gettimeofday(&func_end, NULL);
|
||||
// long func_us = (func_end.tv_sec - func_start.tv_sec) * 1000000 +
|
||||
// (func_end.tv_usec - func_start.tv_usec);
|
||||
// fprintf(stderr, "kvs_protocol: total %ld us, oplog %ld us\n", func_us, total_oplog_us);
|
||||
|
||||
*response_length = out_len;
|
||||
return consumed;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user