mirror of
https://github.com/facebook/rocksdb.git
synced 2024-11-26 07:30:54 +00:00
Revert to checking the upper bound on a per-key basis in BlockBasedTableIterator (#5428)
Summary: PR #5111 reduced the number of key comparisons when iterating with upper/lower bounds; however, this caused a regression for MyRocks. Reverting to the previous behavior in BlockBasedTableIterator as a hotfix. Pull Request resolved: https://github.com/facebook/rocksdb/pull/5428 Differential Revision: D15721038 Pulled By: ltamasi fbshipit-source-id: 5450106442f1763bccd17f6cfd648697f2ae8b6c
This commit is contained in:
parent
ad52626cf4
commit
0f48e56f96
|
@ -467,6 +467,8 @@ inline bool DBIter::FindNextUserEntryInternal(bool skipping, bool prefix_check)
|
||||||
|
|
||||||
is_key_seqnum_zero_ = (ikey_.sequence == 0);
|
is_key_seqnum_zero_ = (ikey_.sequence == 0);
|
||||||
|
|
||||||
|
assert(iterate_upper_bound_ == nullptr || iter_.MayBeOutOfUpperBound() ||
|
||||||
|
user_comparator_.Compare(ikey_.user_key, *iterate_upper_bound_) < 0);
|
||||||
if (iterate_upper_bound_ != nullptr && iter_.MayBeOutOfUpperBound() &&
|
if (iterate_upper_bound_ != nullptr && iter_.MayBeOutOfUpperBound() &&
|
||||||
user_comparator_.Compare(ikey_.user_key, *iterate_upper_bound_) >= 0) {
|
user_comparator_.Compare(ikey_.user_key, *iterate_upper_bound_) >= 0) {
|
||||||
break;
|
break;
|
||||||
|
@ -859,6 +861,9 @@ void DBIter::PrevInternal() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert(iterate_lower_bound_ == nullptr || iter_.MayBeOutOfLowerBound() ||
|
||||||
|
user_comparator_.Compare(saved_key_.GetUserKey(),
|
||||||
|
*iterate_lower_bound_) >= 0);
|
||||||
if (iterate_lower_bound_ != nullptr && iter_.MayBeOutOfLowerBound() &&
|
if (iterate_lower_bound_ != nullptr && iter_.MayBeOutOfLowerBound() &&
|
||||||
user_comparator_.Compare(saved_key_.GetUserKey(),
|
user_comparator_.Compare(saved_key_.GetUserKey(),
|
||||||
*iterate_lower_bound_) < 0) {
|
*iterate_lower_bound_) < 0) {
|
||||||
|
|
|
@ -2597,9 +2597,15 @@ void BlockBasedTableIterator<TBlockIter, TValue>::FindBlockForward() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Whether next data block is out of upper bound, if there is one.
|
// Whether next data block is out of upper bound, if there is one.
|
||||||
bool next_block_is_out_of_bound =
|
// TODO: we should be able to use !data_block_within_upper_bound_ here
|
||||||
|
// instead of performing the comparison; however, the flag can apparently
|
||||||
|
// be out of sync with the comparison in some cases. This should be
|
||||||
|
// investigated.
|
||||||
|
const bool next_block_is_out_of_bound =
|
||||||
read_options_.iterate_upper_bound != nullptr &&
|
read_options_.iterate_upper_bound != nullptr &&
|
||||||
block_iter_points_to_real_block_ && !data_block_within_upper_bound_;
|
block_iter_points_to_real_block_ &&
|
||||||
|
(user_comparator_.Compare(*read_options_.iterate_upper_bound,
|
||||||
|
index_iter_->user_key()) <= 0);
|
||||||
ResetDataIter();
|
ResetDataIter();
|
||||||
index_iter_->Next();
|
index_iter_->Next();
|
||||||
if (next_block_is_out_of_bound) {
|
if (next_block_is_out_of_bound) {
|
||||||
|
|
Loading…
Reference in a new issue