mmap加载配置文件,uring实现持久化
This commit is contained in:
@@ -3,8 +3,7 @@
|
||||
#include "kvstore.h"
|
||||
#include "kvs_rw_tools.h"
|
||||
#include "mem_pool/mem_pool.h"
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include "diskuring/diskuring.h"
|
||||
|
||||
// singleton
|
||||
|
||||
@@ -194,28 +193,62 @@ int kvs_array_exist_bin(kvs_array_t *inst, const void *key, uint32_t key_len) {
|
||||
// return: 0 success, <0 error
|
||||
int kvs_array_save(kvs_array_t *inst, const char* filename){
|
||||
if(!inst || !filename) return -1;
|
||||
FILE *fp = fopen(filename, "wb");
|
||||
if(!fp) return -2;
|
||||
|
||||
int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644);
|
||||
if(fd < 0) return -2;
|
||||
|
||||
off_t current_off = 0;
|
||||
|
||||
for(int i = 0;i < inst->total; ++ i){
|
||||
kvs_array_item_t *it = &inst->table[i];
|
||||
if(!it->key || it->key_len == 0) continue; // 跳过空槽
|
||||
if(it->value_len > 0 && !it->value) { fclose(fp); return -3; }
|
||||
if(it->value_len > 0 && !it->value) { close(fd); return -3; }
|
||||
|
||||
uint32_t klen = htonl(it->key_len);
|
||||
uint32_t vlen = htonl(it->value_len);
|
||||
|
||||
if (kvs_write_file(fp, &klen, 4) < 0) { fclose(fp); return -4; }
|
||||
if (kvs_write_file(fp, &vlen, 4) < 0) { fclose(fp); return -4; }
|
||||
void *bufs[4];
|
||||
size_t lens[4];
|
||||
int count = 0;
|
||||
|
||||
if (kvs_write_file(fp, it->key, it->key_len) < 0) { fclose(fp); return -4; }
|
||||
if (it->value_len > 0) {
|
||||
if (kvs_write_file(fp, it->value, it->value_len) < 0) { fclose(fp); return -4; }
|
||||
bufs[count] = &klen;
|
||||
lens[count] = sizeof(klen);
|
||||
count++;
|
||||
|
||||
bufs[count] = &vlen;
|
||||
lens[count] = sizeof(vlen);
|
||||
count++;
|
||||
|
||||
if (it->key_len > 0){
|
||||
bufs[count] = it->key;
|
||||
lens[count] = it->key_len;
|
||||
count++;
|
||||
}
|
||||
|
||||
if (it->value_len > 0) {
|
||||
bufs[count] = it->value;
|
||||
lens[count] = it->value_len;
|
||||
count++;
|
||||
}
|
||||
|
||||
size_t total = 0;
|
||||
for (int i = 0; i < count; i++) total += lens[i];
|
||||
|
||||
task_t *t = submit_write(&global_uring_ctx, fd, bufs, lens, count, current_off);
|
||||
|
||||
if (!t) { close(fd); return -4; }
|
||||
int res = task_wait(t);
|
||||
task_destroy(t);
|
||||
|
||||
if (res < 0) {
|
||||
close(fd);
|
||||
return -5;
|
||||
}
|
||||
|
||||
current_off += (off_t) total;
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user