-
Notifications
You must be signed in to change notification settings - Fork 589
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
refactor(storage): store direct value entry index in imm iter #15417
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Rest LGTM.
/// Return an exclusive offset of the values of key of index `i` | ||
fn value_end_offset<'a>( | ||
i: usize, | ||
entries: &'a [SharedBufferKeyEntry], | ||
values: &'a [VersionedSharedBufferValue], | ||
) -> usize { | ||
entries | ||
.get(i + 1) | ||
.map(|entry| entry.value_offset) | ||
.unwrap_or(values.len()) | ||
} | ||
|
||
fn values<'a>( | ||
i: usize, | ||
entries: &'a [SharedBufferKeyEntry], | ||
values: &'a [VersionedSharedBufferValue], | ||
) -> &'a [VersionedSharedBufferValue] { | ||
&values[entries[i].value_offset | ||
..entries | ||
.get(i + 1) | ||
.map(|entry| entry.value_offset) | ||
.unwrap_or(values.len())] | ||
&values[entries[i].value_offset..value_end_offset(i, entries, values)] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we make them member functions of SharedBufferKeyEntry
to simplify the definition? It seems they are called nowhere else besides SharedBufferKeyEntry
.
I hereby agree to the terms of the RisingWave Labs, Inc. Contributor License Agreement.
What's changed and what's your intention?
Previously in #15300, we store all versions of values in a single vec. However, the
current_value_idx
of imm iter still means the index of current value in the sub-slice of values of current key. In this PR, we change to letcurrent_value_idx
be the direct index to the single vec of values of all keys, so that we can get the current value directly without computing the index.A bug of backward iter is fixed by the way in this PR. In our previous implementation, for a single key, the backward iter iterates its value from older epoch to newer. However, backward only means the key direction. For difference versions of a single key, we should iterate from newer epoch to older one as what forward iter does.
This PR is separated from #15300 because it needs careful review.
Checklist
./risedev check
(or alias,./risedev c
)Documentation
Release note
If this PR includes changes that directly affect users or other significant modifications relevant to the community, kindly draft a release note to provide a concise summary of these changes. Please prioritize highlighting the impact these changes will have on users.