diff --git a/db/builder.cc b/db/builder.cc index e6329e0..02f4eae 100644 --- a/db/builder.cc +++ b/db/builder.cc @@ -30,8 +30,17 @@ Status BuildTable(const std::string& dbname, Env* env, const Options& options, TableBuilder* builder = new TableBuilder(options, file); meta->smallest.DecodeFrom(iter->key()); - Slice key; + Slice key=iter->key(); + // 小合并时检查ttl + time_t now = time(nullptr); // 获得当前时间 + uint64_t now_time=static_cast(now); for (; iter->Valid(); iter->Next()) { + uint64_t ttl=*(uint64_t*)(iter->value().data()+iter->value().size()-sizeof(uint64_t)); // 将 TTL 从 new_data 的末尾取出 + // 如果 TTL 超过当前时间,说明数据已经过期 + if(ttl < static_cast(now_time)){ + continue; + } + key = iter->key(); builder->Add(key, iter->value()); } diff --git a/db/db_impl.cc b/db/db_impl.cc index 9ee6db4..1da206f 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -57,6 +57,8 @@ struct DBImpl::CompactionState { uint64_t number; uint64_t file_size; InternalKey smallest, largest; + // uint64_t now = static_cast(time(nullptr)); // 合并发起的时间 + }; Output* current_output() { return &outputs[outputs.size() - 1]; } @@ -923,12 +925,13 @@ Status DBImpl::DoCompactionWork(CompactionState* compact) { std::string current_user_key; bool has_current_user_key = false; SequenceNumber last_sequence_for_key = kMaxSequenceNumber; + time_t now = time(nullptr); // 获得当前时间 + uint64_t now_time=static_cast(now); while (input->Valid() && !shutting_down_.load(std::memory_order_acquire)) { auto x=input->value(); // 获取键值对 value uint64_t ttl=*(uint64_t*)(x.data()+x.size()-sizeof(uint64_t));// 将 TTL 从 new_data 的末尾取出 - time_t now = time(nullptr); // 获得当前时间 // 如果 TTL 超过当前时间,说明数据已经过期 - if(ttl < static_cast(now)){ + if(ttl < now_time){ Log(options_.info_log, "delete record for ttl"); input->Next(); // 将 input 指向下一个键值对 continue; diff --git a/test/ttl_test.cc b/test/ttl_test.cc index 018258d..4e058ac 100644 --- a/test/ttl_test.cc +++ b/test/ttl_test.cc @@ -65,7 +65,7 @@ TEST(TestTTL, ReadTTL) { ASSERT_TRUE(status.ok()); } - Env::Default()->SleepForMicroseconds((ttl+1) * 1000000); + Env::Default()->SleepForMicroseconds((ttl+2) * 1000000); for (int i = 0; i < 100; i++) { int key_ = rand() % key_num+1; diff --git a/ttl.md b/ttl.md index c6a727f..33ed986 100644 --- a/ttl.md +++ b/ttl.md @@ -14,11 +14,11 @@ 其中每个分支对应的内容为: -master分支:主分支:第二版TTL设计。 +master 分支:主分支:第二版TTL设计。 -xry分支:第一版TTL设计,完成了在memtable中的带有TTL数据的存取(即在小数据量情况下可以正确运行测试脚本中的第一个测试)。 +xry 分支:第一版TTL设计,完成了在 memtable 中的带有 TTL 数据的存取(即在小数据量情况下可以正确运行测试脚本中的第一个测试)。 -xxy分支、new_version分支:第二版TTL设计。其中new_version分支与master分支内容相同。 +xxy 分支、new_version 分支:第二版 TTL 设计。其中 new_version 分支与 master 分支内容相同。 ### 设计思路