diff --git a/CMakeLists.txt b/CMakeLists.txt index 705abce..a9b1c5e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -107,6 +107,7 @@ configure_file( include_directories( "${PROJECT_BINARY_DIR}/include" "." + "./third_party/googletest/googletest/include/" ) if(BUILD_SHARED_LIBS) diff --git a/db/db_test.cc b/db/db_test.cc index ee3a72a..79478b0 100644 --- a/db/db_test.cc +++ b/db/db_test.cc @@ -2117,9 +2117,9 @@ class ModelDB : public DB { Status Put(const WriteOptions& o, const Slice& k, const Slice& v, uint64_t ttl = 0) override { return DB::Put(o, k, v, ttl); } - Status Put(const WriteOptions& o, const Slice& k,const Slice& v,uint64_t ttl) { - return DB::Put(o,k,v); - } + // Status Put(const WriteOptions& o, const Slice& k,const Slice& v,uint64_t ttl) { + // return DB::Put(o,k,v); + // } Status Delete(const WriteOptions& o, const Slice& key) override { return DB::Delete(o, key); } diff --git a/db/dbformat.cc b/db/dbformat.cc index 6f11a1d..2ef75e2 100644 --- a/db/dbformat.cc +++ b/db/dbformat.cc @@ -78,15 +78,15 @@ int InternalKeyComparator::Compare(const Slice& akey, const Slice& bkey) const { const uint64_t atime = DecodeFixed64(akey.data() + akey.size() - 16); const uint64_t btime = DecodeFixed64(bkey.data() + bkey.size() - 16); //原本应该找到了,新加判断 - if((btag & 0b100) && (atag & 0b10)){ //一个是查询键,另一个有ttl - const uint64_t atime = DecodeFixed64(akey.data() + akey.size() - 16); - const uint64_t btime = DecodeFixed64(bkey.data() + bkey.size() - 16); - std::cout<<"atime:"<= 8); uint64_t num = DecodeFixed64(internal_key.data() + internal_key.size() - 8); uint8_t havettl = (num & 0b10) >> 1; @@ -195,7 +198,8 @@ inline bool ParseInternalKey(const Slice& internal_key, result->deadTime = 0; result->user_key = Slice(internal_key.data(), n - 8); } - return (c <= static_cast(kTypeValue)); + // return c <= 0b111; + return ((c & 0b1) <= static_cast(kTypeValue)); } // A helper class useful for DBImpl::Get() diff --git a/db/memtable.cc b/db/memtable.cc index 8131005..f27dca3 100644 --- a/db/memtable.cc +++ b/db/memtable.cc @@ -55,7 +55,23 @@ class MemTableIterator : public Iterator { ~MemTableIterator() override = default; bool Valid() const override { return iter_.Valid(); } - void Seek(const Slice& k) override { iter_.Seek(EncodeKey(&tmp_, k)); } + void Seek(const Slice& k) override { + iter_.Seek(EncodeKey(&tmp_, k)); + MemTable::KeyComparator comp_ = iter_.get_comparator(); + while(Valid()) { + Slice now = key(); + ParsedInternalKey parsed_k,parsed_now; + ParseInternalKey(k,&parsed_k); + ParseInternalKey(now,&parsed_now); + uint64_t deadtime_k = parsed_k.deadTime; + uint64_t deadtime_now = parsed_now.deadTime; + if(deadtime_k == 0) deadtime_k = UINT64_MAX; + if(deadtime_now == 0) deadtime_now = UINT64_MAX; + if(deadtime_k > deadtime_now) {Next();continue;}; + if(comp_.comparator.Compare(k,now) <= 0) return; + Next(); + } + } void SeekToFirst() override { iter_.SeekToFirst(); } void SeekToLast() override { iter_.SeekToLast(); } void Next() override { iter_.Next(); } @@ -115,13 +131,35 @@ void MemTable::Add(SequenceNumber s, ValueType type, const Slice& key, std::memcpy(p, value.data(), val_size); assert(p + val_size == buf + encoded_len); table_.Insert(buf); - std::cout << "insert:" << key.ToString() <<" deadTime: " << deadTime << std::endl; + static int count = 0; + if(count++ % 1000 == 0) + std::cout<<"count: "< deadtime_now) { + iter.Next(); + continue; + } + std::cout<<"size : "<compare_;} + private: const SkipList* list_; Node* node_; diff --git a/db/version_set.cc b/db/version_set.cc index 764a158..1bf9ddd 100644 --- a/db/version_set.cc +++ b/db/version_set.cc @@ -263,8 +263,10 @@ static void SaveValue(void* arg, const Slice& ikey, const Slice& v) { Saver* s = reinterpret_cast(arg); ParsedInternalKey parsed_key; if (!ParseInternalKey(ikey, &parsed_key)) { + // std::cout<<"corrupt get"<state = kCorrupt; } else { + std::cout<<"tar&found"<user_key.ToString()<ucmp->Compare(parsed_key.user_key, s->user_key) == 0) { s->state = (parsed_key.type == kTypeValue) ? kFound : kDeleted; if (s->state == kFound) { @@ -272,6 +274,7 @@ static void SaveValue(void* arg, const Slice& ikey, const Slice& v) { } } } + std::cout<<"state : "<state<= target + //处理deadtime:从当前位置向后找到最新的未死亡的key while (true) { if (!ParseNextKey()) { return; } + ParsedInternalKey parsed_target,parsed_key_; + ParseInternalKey(target,&parsed_target); + ParseInternalKey(key_,&parsed_key_); + uint64_t deadtime_tar = parsed_target.deadTime; + uint64_t deadtime_key_ = parsed_key_.deadTime; + if(deadtime_tar == 0) deadtime_tar = UINT64_MAX; + if(deadtime_key_ == 0) deadtime_key_ = UINT64_MAX; + std::cout<<"key :"< deadtime_key_) continue; if (Compare(key_, target) >= 0) { return; } diff --git a/test/ttl_mmtable_test.cc b/test/ttl_mmtable_test.cc index dccf9ed..5b44033 100644 --- a/test/ttl_mmtable_test.cc +++ b/test/ttl_mmtable_test.cc @@ -8,7 +8,7 @@ using namespace leveldb; constexpr int value_size = 2048; -constexpr int data_size = 2048 << 2; +constexpr int data_size = 2048 << 15; Status OpenDB(std::string dbName, DB **db) { Options options; @@ -92,7 +92,7 @@ DB *db; uint64_t ttl1 = 3; uint64_t ttl2 = 5; - InsertData(db, ttl2); + // InsertData(db, ttl2); InsertData(db, ttl1, 2); //都没过期先找到后插的 @@ -101,8 +101,8 @@ DB *db; //再找到前一次 Env::Default()->SleepForMicroseconds(3 * 1000000); - GetData(db, false); - + GetData(db, true); + DestroyDB("testdb",Options()); delete(db); printf("-----closing-----\n"); printf("success!\n"); diff --git a/test/ttl_test.cc b/test/ttl_test.cc index 12cd583..fb91b86 100644 --- a/test/ttl_test.cc +++ b/test/ttl_test.cc @@ -26,7 +26,8 @@ void InsertData(DB *db, uint64_t ttl/* second */) { int key_ = rand() % key_num+1; std::string key = std::to_string(key_); std::string value(value_size, 'a'); - db->Put(writeOptions, key, value, ttl); + db->Put(writeOptions, std::to_string(i+1), value, ttl); + // db->Put(writeOptions, key, value, ttl); } } @@ -45,13 +46,14 @@ void GetData(DB *db, int size = (1 << 30)) { } TEST(TestTTL, ReadTTL) { + DestroyDB("testdb",Options()); DB *db; if(OpenDB("testdb", &db).ok() == false) { std::cerr << "open db failed" << std::endl; abort(); } - uint64_t ttl = 20; + uint64_t ttl = 15; InsertData(db, ttl); @@ -64,47 +66,52 @@ TEST(TestTTL, ReadTTL) { std::string key = std::to_string(key_); std::string value; status = db->Get(readOptions, key, &value); + std::cout<SleepForMicroseconds(ttl * 1000000); + Env::Default()->SleepForMicroseconds((ttl+1) * 1000000); for (int i = 0; i < 100; i++) { int key_ = rand() % key_num+1; std::string key = std::to_string(key_); std::string value; status = db->Get(readOptions, key, &value); + std::cout<GetApproximateSizes(ranges, 1, sizes); -// ASSERT_GT(sizes[0], 0); + leveldb::Range ranges[1]; + ranges[0] = leveldb::Range("-", "A"); + uint64_t sizes[1]; + db->GetApproximateSizes(ranges, 1, sizes); + ASSERT_GT(sizes[0], 0); -// Env::Default()->SleepForMicroseconds(ttl * 1000000); + Env::Default()->SleepForMicroseconds(ttl * 1000000); -// db->CompactRange(nullptr, nullptr); + db->CompactRange(nullptr, nullptr); -// leveldb::Range ranges[1]; -// ranges[0] = leveldb::Range("-", "A"); -// uint64_t sizes[1]; -// db->GetApproximateSizes(ranges, 1, sizes); -// ASSERT_EQ(sizes[0], 0); -// } + // leveldb::Range ranges[1]; + ranges[0] = leveldb::Range("-", "A"); + // uint64_t sizes[1]; + db->GetApproximateSizes(ranges, 1, sizes); + ASSERT_EQ(sizes[0], 0); + delete db; +} int main(int argc, char** argv) {