mmap加载配置文件,uring实现持久化

This commit is contained in:
1iaan
2026-01-22 12:38:34 +00:00
parent f031e107b5
commit ba2004c258
15 changed files with 627 additions and 639 deletions

View File

@@ -1,6 +1,6 @@
#include "kvs_rw_tools.h"
#include "mem_pool/mem_pool.h"
#include "kvs_inc_log.h"
#include "kvs_oplog.h"
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
@@ -62,67 +62,6 @@ int read_full(int fd, void *buf, size_t n)
return 1;
}
// 0 suc, -1 err
int kvs_need(const uint8_t *p, const uint8_t *end, size_t n) {
return (p + n <= end) ? 0 : -1;
}
// 注意u8类型不需要ntoh或者hton
// 0 suc, -1 err
int kvs_read_u8(const uint8_t **pp, const uint8_t *end, uint8_t *out) {
const uint8_t *p = *pp;
if (kvs_need(p, end, 1) < 0) return -1;
*out = *p;
*pp = p + 1;
return 0;
}
int kvs_read_u16(const uint8_t **pp, const uint8_t *end, uint16_t *out) {
const uint8_t *p = *pp;
if (kvs_need(p, end, 2) < 0) return -1;
uint16_t v;
memcpy(&v, p, 2);
*out = ntohs(v);
*pp = p + 2;
return 0;
}
int kvs_read_u32(const uint8_t **pp, const uint8_t *end, uint32_t *out) {
const uint8_t *p = *pp;
if (kvs_need(p, end, 4) < 0) return -1;
uint32_t v;
memcpy(&v, p, 4);
*out = ntohl(v);
*pp = p + 4;
return 0;
}
int kvs_write_u8(uint8_t **pp, const uint8_t *end, uint8_t v) {
uint8_t *p = *pp;
if (kvs_need(p, end, 1) < 0) return -1;
*p = v;
*pp = p + 1;
return 0;
}
int kvs_write_u16(uint8_t **pp, const uint8_t *end, uint16_t v) {
uint8_t *p = *pp;
if (kvs_need(p, end, 2) < 0) return -1;
uint16_t be = htons(v);
memcpy(p, &be, 2);
*pp = p + 2;
return 0;
}
int kvs_write_u32(uint8_t **pp, const uint8_t *end, uint32_t v) {
uint8_t *p = *pp;
if (kvs_need(p, end, 4) < 0) return -1;
uint32_t be = htonl(v);
memcpy(p, &be, 4);
*pp = p + 4;
return 0;
}
// -1 err, 0 suc
int kvs_write_file(FILE *fp, const void *buf, size_t n) {
const uint8_t *p = (const uint8_t *)buf;
@@ -147,320 +86,3 @@ int kvs_read_file(FILE *fp, void *buf, size_t n){
return 0;
}
// // return: -1 fail, 0 half, >0 consumed
// int kvs_parse_one_cmd(const uint8_t *request, int request_length, kvs_req_t *req_out){
// if (!request || request_length <= 0 || !req_out) return -1;
// req_out->op = KVS_CMD_COUNT;
// req_out->argc = 0;
// req_out->args = NULL;
// const uint8_t *p = request;
// const uint8_t *end = request + (size_t)request_length;
// // OP + ARGC
// if (kvs_need(p, end, 2)) {
// return 0; // NEED_MORE
// }
// uint8_t op = 0, argc = 0;
// if (kvs_read_u8(&p, end, &op) < 0) return -1;
// if (kvs_read_u8(&p, end, &argc) < 0) return -1;
// if (argc > KVS_MAX_ARGC) return -1;
// // 先扫描一遍确认整条命令数据都在 buffer 里
// const uint8_t *scan = p;
// uint32_t lens[KVS_MAX_ARGC];
// if (argc > 0) {
// for (uint8_t i = 0; i < argc; i++) {
// if (kvs_need(scan, end, 4)) {
// return 0; // NEED_MORE
// }
// uint32_t alen = 0;
// if (kvs_read_u32(&scan, end, &alen) < 0) return -1;
// // 防御:单个参数长度限制
// if (alen > KVS_MAX_ARGLEN) return -1;
// // 防御scan + alen 越界 / 半包
// if (kvs_need(scan, end, (size_t)alen)) {
// return 0; // NEED_MORE
// }
// lens[i] = alen;
// scan += alen;
// }
// }
// size_t total_len = (size_t)(scan - request);
// if (total_len > KVS_MAX_CMD_BYTES) return -1;
// req_out->op = op;
// req_out->argc = argc;
// if (argc == 0) {
// return (int)total_len;
// }
// kvs_arg_t *args = (kvs_arg_t *)kvs_malloc((size_t)argc * sizeof(kvs_arg_t));
// if (!args) {
// kvs_free_request(req_out);
// return -1;
// }
// memset(args, 0, (size_t)argc * sizeof(kvs_arg_t));
// for (uint8_t i = 0; i < argc; i++) {
// uint32_t alen = 0;
// if (kvs_read_u32(&p, end, &alen) < 0) {
// kvs_free(args);
// kvs_free_request(req_out);
// return -1;
// }
// // alen 与 lens[i] 应当一致(扫描时读过),不一致说明解析器/输入异常
// if (alen != lens[i]) {
// kvs_free(args);
// kvs_free_request(req_out);
// return -1;
// }
// args[i].len = alen;
// args[i].data = p; // 直接指向输入 buffer零拷贝
// p += alen;
// }
// req_out->args = args;
// return (int)(p - request);
// }
// void kvs_free_request(kvs_req_t *req) {
// if (!req) return;
// if (req->args) {
// kvs_free(req->args);
// req->args = NULL;
// }
// req->op = KVS_CMD_COUNT;
// req->argc = 0;
// }
// /**
// * 输入req
// * 输出rsp
// * 返回:-1 失败参数错误0 成功
// */
// int kvs_execute_one_cmd(const kvs_req_t *req, kvs_rsp_t *rsp_out) {
// if(!req || !rsp_out) return -1;
// rsp_out->op = req->op;
// rsp_out->status = KVS_STATUS_ERROR;
// rsp_out->data = NULL;
// rsp_out->dlen = 0;
// int argc = req->argc;
// kvs_cmd_t op = req->op;
// kvs_arg_t *argv = req->args;
// uint32_t key_len = 0;
// const void *key = NULL;
// uint32_t value_len = 0;
// const void *val = NULL;
// if(argc == 1){
// key_len = argv[0].len;
// key = argv[0].data;
// }else if(argc == 2){
// key_len = argv[0].len;
// key = argv[0].data;
// value_len = argv[1].len;
// val = argv[1].data;
// }
// // 基本参数校验(按你原有命令语义)
// switch (op) {
// case KVS_CMD_SET:
// case KVS_CMD_MOD:
// case KVS_CMD_RSET:
// case KVS_CMD_RMOD:
// case KVS_CMD_HSET:
// case KVS_CMD_HMOD:
// if (argc != 2 || !key || !val) { rsp_out->status = KVS_STATUS_BADREQ; return -1; }
// break;
// case KVS_CMD_GET:
// case KVS_CMD_DEL:
// case KVS_CMD_EXIST:
// case KVS_CMD_RGET:
// case KVS_CMD_RDEL:
// case KVS_CMD_REXIST:
// case KVS_CMD_HGET:
// case KVS_CMD_HDEL:
// case KVS_CMD_HEXIST:
// case KVS_CMD_PSYNC:
// if (argc != 1 || !key) { rsp_out->status = KVS_STATUS_BADREQ; return -1; }
// break;
// case KVS_CMD_SAVE:
// if(argc != 0) { rsp_out->status = KVS_STATUS_BADREQ; return -1; }
// break;
// default:
// rsp_out->status = KVS_STATUS_BADREQ;
// return -1;
// }
// int ret = 0;
// const char *result = NULL;
// switch (op) {
// #if ENABLE_ARRAY
// case KVS_CMD_SET:
// ret = kvs_array_set_bin(&global_array, key, key_len, val, value_len);
// if (ret < 0) rsp_out->status = KVS_STATUS_ERROR;
// else if (ret == 0) rsp_out->status = KVS_STATUS_OK;
// else rsp_out->status = KVS_STATUS_EXIST;
// return 0;
// case KVS_CMD_GET:
// result = kvs_array_get_bin(&global_array, key, key_len, &value_len);
// if (!result) { rsp_out->status = KVS_STATUS_NO_EXIST; return 0; }
// rsp_out->status = KVS_STATUS_OK;
// rsp_out->data = (uint8_t*)result;
// rsp_out->dlen = (uint32_t)value_len;
// return 0;
// case KVS_CMD_DEL:
// ret = kvs_array_del_bin(&global_array, key, key_len);
// if (ret < 0) rsp_out->status = KVS_STATUS_ERROR;
// else if (ret == 0) rsp_out->status = KVS_STATUS_OK;
// else rsp_out->status = KVS_STATUS_NO_EXIST;
// return 0;
// case KVS_CMD_MOD:
// ret = kvs_array_mod_bin(&global_array, key, key_len, val, value_len);
// if (ret < 0) rsp_out->status = KVS_STATUS_ERROR;
// else if (ret == 0) rsp_out->status = KVS_STATUS_OK;
// else rsp_out->status = KVS_STATUS_NO_EXIST;
// return 0;
// case KVS_CMD_EXIST:
// ret = kvs_array_exist_bin(&global_array, key, key_len);
// rsp_out->status = (ret == 0) ? KVS_STATUS_EXIST : KVS_STATUS_NO_EXIST;
// return 0;
// #endif
// #if ENABLE_RBTREE
// case KVS_CMD_RSET:
// ret = kvs_rbtree_set(&global_rbtree, key, key_len, val, value_len);
// if (ret < 0) rsp_out->status = KVS_STATUS_ERROR;
// else if (ret == 0) rsp_out->status = KVS_STATUS_OK;
// else rsp_out->status = KVS_STATUS_EXIST;
// return 0;
// case KVS_CMD_RGET:
// result = kvs_rbtree_get(&global_rbtree, key, key_len, &value_len);
// if (!result) { rsp_out->status = KVS_STATUS_NO_EXIST; return 0; }
// rsp_out->status = KVS_STATUS_OK;
// rsp_out->data = (uint8_t*)result;
// rsp_out->dlen = (uint32_t)value_len;
// return 0;
// case KVS_CMD_RDEL:
// ret = kvs_rbtree_del(&global_rbtree, key, key_len);
// if (ret < 0) rsp_out->status = KVS_STATUS_ERROR;
// else if (ret == 0) rsp_out->status = KVS_STATUS_OK;
// else rsp_out->status = KVS_STATUS_NO_EXIST;
// return 0;
// case KVS_CMD_RMOD:
// ret = kvs_rbtree_mod(&global_rbtree, key, key_len, val, value_len);
// if (ret < 0) rsp_out->status = KVS_STATUS_ERROR;
// else if (ret == 0) rsp_out->status = KVS_STATUS_OK;
// else rsp_out->status = KVS_STATUS_NO_EXIST;
// return 0;
// case KVS_CMD_REXIST:
// ret = kvs_rbtree_exist(&global_rbtree, key, key_len);
// rsp_out->status = (ret == 0) ? KVS_STATUS_EXIST : KVS_STATUS_NO_EXIST;
// return 0;
// #endif
// #if ENABLE_HASH
// case KVS_CMD_HSET:
// ret = kvs_hash_set_bin(&global_hash, key, key_len, val, value_len);
// if (ret < 0) rsp_out->status = KVS_STATUS_ERROR;
// else if (ret == 0) rsp_out->status = KVS_STATUS_OK;
// else rsp_out->status = KVS_STATUS_EXIST;
// return 0;
// case KVS_CMD_HGET:
// result = kvs_hash_get_bin(&global_hash, key, key_len, &value_len);
// if (!result) { rsp_out->status = KVS_STATUS_NO_EXIST; return 0; }
// rsp_out->status = KVS_STATUS_OK;
// rsp_out->data = (uint8_t*)result;
// rsp_out->dlen = (uint32_t)value_len;
// return 0;
// case KVS_CMD_HDEL:
// ret = kvs_hash_del_bin(&global_hash, key, key_len);
// if (ret < 0) rsp_out->status = KVS_STATUS_ERROR;
// else if (ret == 0) rsp_out->status = KVS_STATUS_OK;
// else rsp_out->status = KVS_STATUS_NO_EXIST;
// return 0;
// case KVS_CMD_HMOD:
// ret = kvs_hash_mod_bin(&global_hash, key, key_len, val, value_len);
// if (ret < 0) rsp_out->status = KVS_STATUS_ERROR;
// else if (ret == 0) rsp_out->status = KVS_STATUS_OK;
// else rsp_out->status = KVS_STATUS_NO_EXIST;
// return 0;
// case KVS_CMD_HEXIST:
// ret = kvs_hash_exist_bin(&global_hash, key, key_len);
// rsp_out->status = (ret == 0) ? KVS_STATUS_EXIST : KVS_STATUS_NO_EXIST;
// return 0;
// #endif
// case KVS_CMD_SAVE:
// ret = kvs_save_to_file();
// if(ret == 0) rsp_out->status = KVS_STATUS_OK;
// else rsp_out->status = KVS_STATUS_ERROR;
// return 0;
// case KVS_CMD_PSYNC:
// rsp_out->op = req->op;
// rsp_out->status = KVS_STATUS_OK;
// return 0;
// default:
// rsp_out->status = KVS_STATUS_BADREQ;
// return -1;
// }
// return -1;
// }
// /**
// * 构建单条响应
// * 返回:-1 失败,>=0 响应长度
// */
// int kvs_build_one_rsp(const kvs_rsp_t *results, uint8_t *response, size_t response_cap){
// if (!results || !response) return -1;
// const uint8_t *end = response + response_cap;
// uint8_t *p = response;
// // 计算所需长度1 + 1 + 4 + dlen
// // 注意防止 size_t 溢出
// size_t need = 1u + 1u + 4u + (size_t)results->dlen;
// if (need > response_cap) return -1;
// if (kvs_write_u8(&p, end, (uint8_t)results->op) < 0) return -1;
// if (kvs_write_u8(&p, end, results->status) < 0) return -1;
// if (kvs_write_u32(&p, end, results->dlen) < 0) return -1;
// if (results->dlen > 0) {
// if (!results->data) return -1; // 有长度却没指针,视为错误
// if (kvs_need(p, end, (size_t)results->dlen) < 0) return -1;
// memcpy(p, results->data, results->dlen);
// p += results->dlen;
// }
// return (int)(p - response);
// }