From: Andrew Kryczka Date: Mon, 12 Oct 2020 20:43:52 +0000 (-0700) Subject: Fix bug in pinned partitioned user key indexes X-Git-Tag: v6.13.2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=82c5a09241bb0de6487affd70c70ca1acc495627;p=rocksdb.git Fix bug in pinned partitioned user key indexes Backports part of 75d3b6fdf0aa1007c4d26382f65be0adf4519a37. --- diff --git a/HISTORY.md b/HISTORY.md index c942f1012..b2d855db2 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -2,6 +2,7 @@ ## Unreleased ### Bug Fixes * Since 6.12, memtable lookup should report unrecognized value_type as corruption (#7121). +* Fixed a bug in the following combination of features: indexes with user keys (`format_version >= 3`), indexes are partitioned (`index_type == kTwoLevelIndexSearch`), and some index partitions are pinned in memory (`BlockBasedTableOptions::pin_l0_filter_and_index_blocks_in_cache`). The bug could cause keys to be truncated when read from the index leading to wrong read results or other unexpected behavior. ## 6.13 (09/24/2020) ### Bug fixes diff --git a/table/iterator_wrapper.h b/table/iterator_wrapper.h index 6444b0a25..ff46f2536 100644 --- a/table/iterator_wrapper.h +++ b/table/iterator_wrapper.h @@ -149,6 +149,11 @@ class IteratorWrapperBase { return result_.value_prepared; } + Slice user_key() const { + assert(Valid()); + return iter_->user_key(); + } + private: void Update() { valid_ = iter_->Valid(); diff --git a/table/two_level_iterator.cc b/table/two_level_iterator.cc index a17d56df5..d967deff8 100644 --- a/table/two_level_iterator.cc +++ b/table/two_level_iterator.cc @@ -43,6 +43,10 @@ class TwoLevelIndexIterator : public InternalIteratorBase { assert(Valid()); return second_level_iter_.key(); } + Slice user_key() const override { + assert(Valid()); + return second_level_iter_.user_key(); + } IndexValue value() const override { assert(Valid()); return second_level_iter_.value();