1 | Iterator* DBImpl::NewIterator(const ReadOptions& options) { |
具体代码解释如下
1 | void DBIter::Next() { |
1. DBIter::Next()
-
作用:
实现迭代器前进到下一个用户可见的条目。 -
核心逻辑:
-
断言当前状态有效:
assert(valid_);
确保调用Next()
时,迭代器处于有效状态。 -
处理不同方向:
-
如果当前迭代方向为
kReverse
,说明之前的操作是反向遍历:切换方向为
kForward
。因为反向遍历时迭代器指向当前 key 之前的位置,所以需要先移动一步使其进入当前 key 的区间:若当前迭代器无效,则调用SeekToFirst()
重置到首元素。否则调用iter_->Next()
。若移动后迭代器变为无效,则标记迭代器为无效并清空saved_key_
,返回。此时,saved_key_
内保存了需要跳过的 key。 -
当方向已经是
kForward
时:首先将当前 key 提取后保存到
saved_key_
,用于后续跳过同一用户键的所有条目(防止重复返回)。调用iter_->Next()
移动到下一个内部条目。同样,若移动后无效,则更新状态并返回。
-
-
寻找下一个用户条目:
最后调用FindNextUserEntry(true, &saved_key_)
,从当前位置继续寻找一个用户可见的有效条目。
-
2. DBIter::FindNextUserEntry(bool skipping, std::string* skip)
-
作用:
在内部迭代器当前位置开始,寻找下一个用户层面上“有效”(即未被删除、未被隐藏)的条目。 -
核心逻辑:
-
循环遍历:
循环直到找到一个符合条件的用户条目,或者迭代器到达末尾。 -
解析内部键:
每次循环调用ParseKey(&ikey)
解析当前内部键iter_->key()
,同时检查ikey.sequence
是否在允许的序列号范围内(<= sequence_
)。 -
根据操作类型处理:
-
删除类型(
kTypeDeletion
):将当前
ikey.user_key
保存到skip
(即saved_key_
),并设置skipping
为true
,表示后续相同用户键的条目应当被跳过(删除操作“屏蔽”了旧值)。 -
值类型(
kTypeValue
):如果处于跳过状态(
skipping
为 true),并且当前ikey.user_key
与*skip
比较小于等于(即还处于需要跳过的范围内),则认为该条目被删除或隐藏,不予返回。否则,找到了一个有效的用户条目,将valid_
标记为true
,清空saved_key_
(因为找到有效数据后,不需要再跳过)。返回,结束循环。
-
-
结束条件:
- 如果循环结束时
iter_->Valid()
为 false,则表示已经遍历完所有条目, - 清空
saved_key_
,并将valid_
标记为 false。
- 如果循环结束时
-