std::optional<std::string> MemTable::get(const std::string &key){ std::shared_lock<std::shared_mutex> slock(rx_mtx); // 首先检查当前活跃的memtable auto result = current_table->get(key); if (result.has_value()) { auto data = result.value(); if (!data.empty()) { return data; } else { // 空值表示被删除了 return std::nullopt; } }
// 如果当前memtable中没有找到,检查frozen memtable for (auto &tabe : frozen_tables) { auto result = tabe->get(key); if (result.has_value()) { auto data = result.value(); if (!data.empty()) { return data; } else { // 空值表示被删除了 return std::nullopt; } } }
MemTableIterator::MemTableIterator(const MemTable &memtable) { auto cur_table = memtable.current_table;
for (auto iter = cur_table->begin(); iter != cur_table->end(); iter++) { items.push(SearchItem{iter.get_key(), iter.get_value(), 0}); }
int level = 1; for (auto ft = memtable.frozen_tables.begin(); ft != memtable.frozen_tables.end(); ft++) { auto table = *ft; for (auto iter = table->begin(); iter != table->end(); iter++) { items.push(SearchItem{iter.get_key(), iter.get_value(), level}); } level++; }
while (!items.empty() && items.top().value.empty()) { // 如果当前元素的value为空,则说明该元素已经被删除,需要从优先队列中删除 auto del_key = items.top().key; while (!items.empty() && items.top().key == del_key) { items.pop(); } } }