马也驰 пре 2 недеља
родитељ
комит
149eb23e9c
1 измењених фајлова са 11 додато и 2 уклоњено
  1. +11
    -2
      README.md

+ 11
- 2
README.md Прегледај датотеку

@ -62,8 +62,8 @@ if (ddl <= microsecondsTimestamp) {
}
}
```
### 3.3.3 修改Comapction流程
在ComapctRange函数中选中的最后一层,也就是代码中的max_level_with_files选中进行合并,
### 3.3.3 修改Compaction流程
在CompactRange函数中选中的最后一层,也就是代码中的max_level_with_files选中进行合并,
确保合并过程选中所有应该被覆盖度文件。
```
void DBImpl::CompactRange(const Slice* begin, const Slice* end) {
@ -130,3 +130,12 @@ void DBImpl::CompactRange(const Slice* begin, const Slice* end) {
我们最初的想法是把TTL跟value存储在一起,形式为`<TTL value>`,这样Put操作会很简单,仅仅把两个字符串拼接起来即可,但这样的话,在Get操作中时,无法判断从何处分割TTL和value,所以我们决定在TTL和value之间添加一个标志符,存放形式改为`<TTL_value>`,这样,在Get操作时,只需先找到第一个下划线,下划线前面的为TTL,后面的为value,这样就能把TTL和value区分开来。但还有一个问题,判断条件为:`写入数据的时间+ TTL < 读取数据的时间 `,如果仅存放TTL,虽然在调用get时我们可以获得读取数据的时间,并通过解码value获得TTL,但我们没有办法获得写入数据的时间,所以只能通过在Put操作时,把写入数据的时间也写入value中,这样在Get时,就能获得写入数据的时间,从而判断是否过期。所以,我们又把value的形式改为`<TTL_写入时间_value>`,这样,通过两个下划线把TTL、写入时间和value区分开来,就能实现在get操作时判断是否过期。但我们又想到,既然在get操作解码得到TTL和写入时间之后要加在一块,并且TTL和写入时间都是在get操作时与value进行编码,那么我们为什么不在get操作时就把TTL和写入时间加在一起,再与value编码呢,把写入时间+TTL记为DDL,这样就可以把value编码为`<DDL_value>`,在get操作时,只需解码得到DDL,然后拿当前时间跟DDL作比较,即可知道数据是否过期。
综上所述,我们的编码格式经过多次迭代:`<TTL value>`->`<TTL_value>`->`<TTL_写入时间_value>`->`<DDL_value>`,最终得到一个比较满意的编码方式。
### 2. Compaction流程
一开始我们只在DoCompactionWork函数中添加了一个解码value得到ddl,并于当前时间进行比较判断数据是否过期的过程,但发现测试无法通过。
后来参考助教的提示,我们原本打算修改测试用例,即修改写入数据量的大小,但是没有成功。之后我们决定修改Compact过程。具体来说,我们在CompactRange,BackgroundCompaction中进行修改,
确保每一次Compaction都能合并所有的文件,并且禁止leveldb直接跨层移动文件,最后通过了测试。
### 3. test_ttl编译以及数据库打开问题
test_ttl一开始无法通过编译,经过检查发现是重复定义了ranges和sizes两个数组。我们将两个数组进行了重命名解决了这个问题。同时,我们还遇到了第二个
测试数据库无法打开的问题,我们通过修改数据库名称的方法解决了这个问题。

Loading…
Откажи
Сачувај