|
|
@ -41,11 +41,9 @@ using Field = std::pair; // field_name:field_value |
|
|
|
using FieldArray = std::vector<std::pair<std::string, std::string>>; |
|
|
|
```` |
|
|
|
##### 编码函数: |
|
|
|
`void DBImpl::SerializeValue(const FieldArray& fields, std::string &value, size_t slot_num)` |
|
|
|
`void DBImpl::SerializeValue(const FieldArray& fields, std::string &value)` |
|
|
|
|
|
|
|
**功能:** 将传入的字段数组和 slot_num 序列化为字符串,并存到 value |
|
|
|
|
|
|
|
注:slot_num 字段用于实现KV分离 |
|
|
|
**功能:** 将传入的字段数组序列化为字符串,并存到 value |
|
|
|
|
|
|
|
**字符串形式:** |
|
|
|
|
|
|
@ -57,7 +55,7 @@ using FieldArray = std::vector>; |
|
|
|
|
|
|
|
**具体实现如下:** |
|
|
|
```` |
|
|
|
void DBImpl::SerializeValue(const FieldArray& fields, std::string &value, size_t slot_num) { |
|
|
|
void DBImpl::SerializeValue(const FieldArray& fields, std::string &value) { |
|
|
|
// 先构建 slot_num 之后的字符串,存到 tmp_value 中 |
|
|
|
std::string tmp_value; |
|
|
|
// slot_num 之后的总长度 |
|
|
@ -290,10 +288,6 @@ struct executor_param { |
|
|
|
- [`/db/vlog_cache.cpp`](./db/vlog_cache.cpp):实现 VlogCache 类中的函数 |
|
|
|
- [`/db/vlog_set.cpp`](./db/vlog_set.cpp): |
|
|
|
定义函数: get_value, get_writable_vlog_info, put_value, del_value, register_new_vlog, remove_old_vlog, vlog_need_gc, register_inconfig_file, remove_from_config_file, create_vlog, restore_vlog_inmaps, register_vlog_inmaps, remove_vlog_from_maps, read_vlog_value, write_vlog_value, mark_del_value |
|
|
|
- [`/test/db_test3.cc`](./test/db_test3.cc):测试 value 的字段功能 |
|
|
|
- [`/test/db_test4.cc`](./test/db_test4.cc) |
|
|
|
- [`/test/db_test5.cc`](./test/db_test5.cc) |
|
|
|
- |
|
|
|
- [`CMakeLists.txt`](CMakeLists.txt):添加可执行文件 |
|
|
|
|
|
|
|
**数据结构设计:** |
|
|
@ -350,7 +344,8 @@ return DB::Put(opt, key, slot_val); |
|
|
|
**实现步骤:** |
|
|
|
1. 获取互斥锁; |
|
|
|
2. 判断当前 bitmap 是否有空闲槽位,就是遍历 bitmap,找到第一个为 0 的位,然后设置该位为 1,返回该位对应的 slot_num。 |
|
|
|
**具体实现如下:** |
|
|
|
|
|
|
|
**具体实现如下:** |
|
|
|
```` |
|
|
|
size_t alloc_slot() { |
|
|
|
// 获取互斥锁 |
|
|
@ -742,7 +737,8 @@ void VlogSet::del_value(const struct slot_content &sc) { |
|
|
|
2. 调用 delete_vlog_value 函数删除 vlog 中的条目,并返回被删除的日志项的大小; |
|
|
|
3. 更新信息; |
|
|
|
4. 判断是否需要 GC |
|
|
|
**具体实现如下:** |
|
|
|
|
|
|
|
**具体实现如下:** |
|
|
|
```` |
|
|
|
void VlogSet::mark_del_value(const struct slot_content &sc) { |
|
|
|
// 根据 sc.vlog_num 获取 vlog 文件信息 |
|
|
|