|
@ -398,31 +398,6 @@ int main(int argc, char** argv) { |
|
|
|
|
|
|
|
|
![image-20241107082315854](assets/image-20241107082315854.png) |
|
|
![image-20241107082315854](assets/image-20241107082315854.png) |
|
|
|
|
|
|
|
|
## 5.3其他可能出现的问题: |
|
|
|
|
|
|
|
|
|
|
|
可能是因为test文件内的数据准备以及硬件的运行速度,有些问题有可能会发生。 |
|
|
|
|
|
|
|
|
|
|
|
```cpp |
|
|
|
|
|
inline bool DBIter::ParseKey(ParsedInternalKey* ikey) { |
|
|
|
|
|
Slice k = iter_->key(); |
|
|
|
|
|
|
|
|
|
|
|
size_t bytes_read = k.size() + iter_->value().size(); |
|
|
|
|
|
while (bytes_until_read_sampling_ < bytes_read) { |
|
|
|
|
|
bytes_until_read_sampling_ += RandomCompactionPeriod(); |
|
|
|
|
|
db_->RecordReadSample(k); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//...... |
|
|
|
|
|
void DBImpl::RecordReadSample(Slice key) { |
|
|
|
|
|
MutexLock l(&mutex_); |
|
|
|
|
|
if (versions_->current()->RecordReadSample(key)) { |
|
|
|
|
|
MaybeScheduleCompaction(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
上述过程是在读取的过程中发生的,当发现key跨文件存在后,它也会触发合并。这就有可能导致,对于testRead文件,如果ttl设置的比较小,在读取key1(file1内)时,发现它跨文件存在于file2,然后触发合并,但是值key2也在file2内,此时有可能过期。这就导致在读取key2前,就已经触发合并,将过期数据删除,这样会导致test报错。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 6.本实验ttl实现与已有ttl实现的比较 |
|
|
## 6.本实验ttl实现与已有ttl实现的比较 |
|
|