mmap加载配置文件,uring实现持久化
This commit is contained in:
159
kvstore.c
159
kvstore.c
@@ -4,9 +4,11 @@
|
||||
#include "kvstore.h"
|
||||
#include "kvs_rw_tools.h"
|
||||
#include "kvs_protocol_resp.h"
|
||||
#include "kvs_inc_log.h"
|
||||
#include "kvs_oplog.h"
|
||||
#include "mem_pool/mem_pool.h"
|
||||
#include "common/config.h"
|
||||
#include "diskuring/diskuring.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
@@ -35,111 +37,14 @@ extern mp_pool_t global_mempool;
|
||||
|
||||
AppConfig global_cfg;
|
||||
|
||||
int global_cmd_log_fd = -1;
|
||||
extern int global_cmd_log_fd;
|
||||
extern iouring_ctx_t global_uring_ctx;
|
||||
|
||||
char global_oplog_file[256] = "kvs_oplog.default.db";
|
||||
char global_array_file[256] = "kvs_array.default.db";
|
||||
char global_rbtree_file[256] = "kvs_rbtree.default.db";
|
||||
char global_hash_file[256] = "kvs_hash.default.db";
|
||||
|
||||
int is_update_cmd(kvs_cmd_t op){
|
||||
if(op == KVS_CMD_SET || op == KVS_CMD_RSET || op == KVS_CMD_HSET
|
||||
|| op == KVS_CMD_MOD || op == KVS_CMD_RMOD || op == KVS_CMD_HMOD
|
||||
|| op == KVS_CMD_DEL || op == KVS_CMD_RDEL || op == KVS_CMD_HDEL){
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* input : request request_length
|
||||
* output : response response_length
|
||||
* return : -1 error, =0 半包, 1 成功
|
||||
*/
|
||||
|
||||
|
||||
// int kvs_protocol(char *request, int request_length, char *response, int *response_length){
|
||||
// int kvs_protocol(struct conn* conn){
|
||||
// if (!conn) return -1;
|
||||
// char *request = conn->rbuffer;
|
||||
// int request_length = conn->rlength;
|
||||
// char *response = conn->wbuffer;
|
||||
// int *response_length = &conn->wlength;
|
||||
|
||||
// if (!request || request_length <= 0 || !response || !response_length) return -1;
|
||||
// int consumed = 0;
|
||||
// int out_len = 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));
|
||||
|
||||
// const uint8_t *p = request+consumed;
|
||||
// int remain = request_length - consumed;
|
||||
|
||||
// int len = kvs_parse_one_cmd(p, remain, &req);
|
||||
// if(len < 0){
|
||||
// // 解析失败
|
||||
// kvs_free_request(&req);
|
||||
// *response_length = out_len;
|
||||
// return -1;
|
||||
// }
|
||||
// else if(len == 0){
|
||||
// // 半包
|
||||
// kvs_free_request(&req);
|
||||
// break;
|
||||
// }
|
||||
|
||||
// kvs_rsp_t rsp;
|
||||
// memset(&rsp, 0, sizeof(kvs_rsp_t));
|
||||
|
||||
// // 执行失败
|
||||
// if (kvs_execute_one_cmd(&req, &rsp) < 0){
|
||||
// kvs_free_request(&req);
|
||||
// *response_length = out_len;
|
||||
// return -1;
|
||||
// }else{
|
||||
// // 执行成功,在这里保存到日志中。
|
||||
// if(rsp.status == KVS_STATUS_OK){
|
||||
// if(is_update_cmd(req.op)){
|
||||
// kvs_save_cmd_to_logfile(p, len, global_cmd_log_fd);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// if(req.op == KVS_CMD_PSYNC){
|
||||
// build_thread_to_sync(req.args->data, conn);
|
||||
// }
|
||||
|
||||
// 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) {
|
||||
// *response_length = out_len;
|
||||
// return -1;
|
||||
// }
|
||||
|
||||
// out_len += resp_len;
|
||||
// consumed += len;
|
||||
// }
|
||||
|
||||
// // slave 暂时不需要回报,或者回一个new_offset
|
||||
// if(conn->is_from_master){
|
||||
// conn->wlength = 0;
|
||||
// return consumed;
|
||||
// }
|
||||
// *response_length = out_len;
|
||||
// return consumed;
|
||||
// }
|
||||
|
||||
int kvs_protocol(struct conn* conn){
|
||||
if (!conn) return -1;
|
||||
char *request = conn->rbuffer;
|
||||
@@ -190,38 +95,30 @@ int kvs_protocol(struct conn* conn){
|
||||
val = resp_error("ERR dispatch failed");
|
||||
}
|
||||
} else {
|
||||
// persist into o o
|
||||
// persist into oplog
|
||||
if(global_cfg.persistence == PERSIST_INCREMENTAL){
|
||||
|
||||
/* 执行成功:在这里保存到日志中(只记录更新类命令) */
|
||||
if (cmd.argc > 0 && cmd.argv[0].ptr) {
|
||||
/* 仅当返回 OK 时记录 */
|
||||
int is_ok = (val.type == RESP_T_SIMPLE_STR &&
|
||||
val.bulk.ptr && val.bulk.len == 2 &&
|
||||
((val.bulk.ptr[0] == 'O' || val.bulk.ptr[0] == 'o') &&
|
||||
(val.bulk.ptr[1] == 'K' || val.bulk.ptr[1] == 'k')));
|
||||
|
||||
if (is_ok) {
|
||||
/* 更新类命令: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;
|
||||
}
|
||||
/* 更新类命令: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;
|
||||
}
|
||||
}
|
||||
|
||||
if (is_update) {
|
||||
kvs_save_cmd_to_logfile(p, len, global_cmd_log_fd);
|
||||
}
|
||||
if (is_update) {
|
||||
kvs_oplog_append(p, len, global_cmd_log_fd);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -453,7 +350,7 @@ int init_kvengine(void) {
|
||||
|
||||
if(global_cfg.persistence == PERSIST_INCREMENTAL){
|
||||
init_cmd_log(global_oplog_file, &global_cmd_log_fd);
|
||||
kvs_replay_log(global_oplog_file, global_cmd_log_fd);
|
||||
kvs_replay_log(global_cmd_log_fd);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -550,6 +447,10 @@ int init_config(AppConfig *cfg){
|
||||
return 0;
|
||||
}
|
||||
|
||||
void init_disk_uring(iouring_ctx_t *uring_ctx){
|
||||
iouring_init(uring_ctx, 256);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
if(-1 == init_config(&global_cfg)){
|
||||
@@ -558,6 +459,8 @@ int main(int argc, char *argv[]) {
|
||||
}
|
||||
|
||||
init_data_file(&global_cfg);
|
||||
|
||||
init_disk_uring(&global_uring_ctx);
|
||||
|
||||
int port = global_cfg.port;
|
||||
|
||||
@@ -575,7 +478,7 @@ int main(int argc, char *argv[]) {
|
||||
|
||||
init_memory_pool();
|
||||
init_kvengine();
|
||||
|
||||
|
||||
|
||||
#if (NETWORK_SELECT == NETWORK_REACTOR)
|
||||
reactor_start(port, kvs_protocol, master_ip, master_port); //
|
||||
|
||||
Reference in New Issue
Block a user