-
Notifications
You must be signed in to change notification settings - Fork 4.1k
fix(store/v2): Fix PebbleDB Iteration Edge Cases #18948
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
Changes from 6 commits
c00509e
1603129
c1f8dfe
ffa58c6
252b87e
786827a
525382b
a2c09d9
c730f29
ced49f3
d7ac611
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -116,15 +116,15 @@ func (itr *iterator) Value() []byte { | |||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| func (itr *iterator) Next() bool { | ||||||||||||||||||||||||||||
| currKey, _, ok := SplitMVCCKey(itr.source.Key()) | ||||||||||||||||||||||||||||
| if !ok { | ||||||||||||||||||||||||||||
| // XXX: This should not happen as that would indicate we have a malformed | ||||||||||||||||||||||||||||
| // MVCC key. | ||||||||||||||||||||||||||||
| panic(fmt.Sprintf("invalid PebbleDB MVCC key: %s", itr.source.Key())) | ||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||
|
Comment on lines
+116
to
+121
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The use of - panic(fmt.Sprintf("invalid PebbleDB MVCC key: %s", itr.source.Key()))
+ // Handle error properly instead of panic
+ return fmt.Errorf("invalid PebbleDB MVCC key: %s", itr.source.Key())Committable suggestion
Suggested change
The panic in the |
||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| var next bool | ||||||||||||||||||||||||||||
| if itr.reverse { | ||||||||||||||||||||||||||||
| currKey, _, ok := SplitMVCCKey(itr.source.Key()) | ||||||||||||||||||||||||||||
| if !ok { | ||||||||||||||||||||||||||||
| // XXX: This should not happen as that would indicate we have a malformed | ||||||||||||||||||||||||||||
| // MVCC key. | ||||||||||||||||||||||||||||
| panic(fmt.Sprintf("invalid PebbleDB MVCC key: %s", itr.source.Key())) | ||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| // Since PebbleDB has no PrevPrefix API, we must manually seek to the next | ||||||||||||||||||||||||||||
| // key that is lexicographically less than the current key. | ||||||||||||||||||||||||||||
| next = itr.source.SeekLT(MVCCEncode(currKey, 0)) | ||||||||||||||||||||||||||||
|
|
@@ -135,7 +135,7 @@ func (itr *iterator) Next() bool { | |||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| // First move the iterator to the next prefix, which may not correspond to the | ||||||||||||||||||||||||||||
| // desired version for that key, e.g. if the key was written at a later version, | ||||||||||||||||||||||||||||
| // so we seek back to the latest desired version, s.t. the version is <= itr.version. | ||||||||||||||||||||||||||||
| // so we seek back to the latest desired version, s.t. the version <= itr.version. | ||||||||||||||||||||||||||||
| if next { | ||||||||||||||||||||||||||||
| nextKey, _, ok := SplitMVCCKey(itr.source.Key()) | ||||||||||||||||||||||||||||
| if !ok { | ||||||||||||||||||||||||||||
|
Comment on lines
133
to
138
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The logic for handling reverse iteration and seeking to the next prefix seems to be missing the actual implementation for reverse iteration, as the |
||||||||||||||||||||||||||||
|
|
@@ -150,10 +150,31 @@ func (itr *iterator) Next() bool { | |||||||||||||||||||||||||||
| return itr.valid | ||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| // Move the iterator to the closest version to the desired version, so we | ||||||||||||||||||||||||||||
| // Move the iterator to the closest version of the desired version, so we | ||||||||||||||||||||||||||||
| // append the current iterator key to the prefix and seek to that key. | ||||||||||||||||||||||||||||
| itr.valid = itr.source.SeekLT(MVCCEncode(nextKey, itr.version+1)) | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| tmpKey, _, ok := SplitMVCCKey(itr.source.Key()) | ||||||||||||||||||||||||||||
| if !ok { | ||||||||||||||||||||||||||||
| // XXX: This should not happen as that would indicate we have a malformed | ||||||||||||||||||||||||||||
| // MVCC key. | ||||||||||||||||||||||||||||
| itr.valid = false | ||||||||||||||||||||||||||||
| return itr.valid | ||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| // There exists cases where the SeekLT() call moved us back to the same key | ||||||||||||||||||||||||||||
| // we started at, so we must move to next key, i.e. two keys forward. | ||||||||||||||||||||||||||||
| if bytes.Equal(tmpKey, currKey) { | ||||||||||||||||||||||||||||
| if itr.source.SeekGE(MVCCEncode(nextKey, 0)) { | ||||||||||||||||||||||||||||
| if itr.source.NextPrefix() { | ||||||||||||||||||||||||||||
| return itr.Next() | ||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| itr.valid = false | ||||||||||||||||||||||||||||
| return itr.valid | ||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||
alexanderbez marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| // The cursor might now be pointing at a key/value pair that is tombstoned. | ||||||||||||||||||||||||||||
| // If so, we must move the cursor. | ||||||||||||||||||||||||||||
| if itr.valid && itr.cursorTombstoned() { | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
Uh oh!
There was an error while loading. Please reload this page.