two_level_iterator.cc 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
  2. // This source code is licensed under both the GPLv2 (found in the
  3. // COPYING file in the root directory) and Apache 2.0 License
  4. // (found in the LICENSE.Apache file in the root directory).
  5. //
  6. // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
  7. // Use of this source code is governed by a BSD-style license that can be
  8. // found in the LICENSE file. See the AUTHORS file for names of contributors.
  9. #include "table/two_level_iterator.h"
  10. #include "db/pinned_iterators_manager.h"
  11. #include "memory/arena.h"
  12. #include "rocksdb/options.h"
  13. #include "rocksdb/table.h"
  14. #include "table/block_based/block.h"
  15. #include "table/format.h"
  16. namespace ROCKSDB_NAMESPACE {
  17. namespace {
  18. class TwoLevelIndexIterator : public InternalIteratorBase<IndexValue> {
  19. public:
  20. explicit TwoLevelIndexIterator(
  21. TwoLevelIteratorState* state,
  22. InternalIteratorBase<IndexValue>* first_level_iter);
  23. ~TwoLevelIndexIterator() override {
  24. first_level_iter_.DeleteIter(false /* is_arena_mode */);
  25. second_level_iter_.DeleteIter(false /* is_arena_mode */);
  26. delete state_;
  27. }
  28. void Seek(const Slice& target) override;
  29. void SeekForPrev(const Slice& target) override;
  30. void SeekToFirst() override;
  31. void SeekToLast() override;
  32. void Next() override;
  33. void Prev() override;
  34. bool Valid() const override { return second_level_iter_.Valid(); }
  35. Slice key() const override {
  36. assert(Valid());
  37. return second_level_iter_.key();
  38. }
  39. Slice user_key() const override {
  40. assert(Valid());
  41. return second_level_iter_.user_key();
  42. }
  43. IndexValue value() const override {
  44. assert(Valid());
  45. return second_level_iter_.value();
  46. }
  47. Status status() const override {
  48. if (!first_level_iter_.status().ok()) {
  49. assert(second_level_iter_.iter() == nullptr);
  50. return first_level_iter_.status();
  51. } else if (second_level_iter_.iter() != nullptr &&
  52. !second_level_iter_.status().ok()) {
  53. return second_level_iter_.status();
  54. } else {
  55. return status_;
  56. }
  57. }
  58. void SetPinnedItersMgr(
  59. PinnedIteratorsManager* /*pinned_iters_mgr*/) override {}
  60. bool IsKeyPinned() const override { return false; }
  61. bool IsValuePinned() const override { return false; }
  62. private:
  63. void SaveError(const Status& s) {
  64. if (status_.ok() && !s.ok()) {
  65. status_ = s;
  66. }
  67. }
  68. void SkipEmptyDataBlocksForward();
  69. void SkipEmptyDataBlocksBackward();
  70. void SetSecondLevelIterator(InternalIteratorBase<IndexValue>* iter);
  71. void InitDataBlock();
  72. TwoLevelIteratorState* state_;
  73. IteratorWrapperBase<IndexValue> first_level_iter_;
  74. IteratorWrapperBase<IndexValue> second_level_iter_; // May be nullptr
  75. Status status_;
  76. // If second_level_iter is non-nullptr, then "data_block_handle_" holds the
  77. // "index_value" passed to block_function_ to create the second_level_iter.
  78. BlockHandle data_block_handle_;
  79. };
  80. TwoLevelIndexIterator::TwoLevelIndexIterator(
  81. TwoLevelIteratorState* state,
  82. InternalIteratorBase<IndexValue>* first_level_iter)
  83. : state_(state), first_level_iter_(first_level_iter) {}
  84. void TwoLevelIndexIterator::Seek(const Slice& target) {
  85. first_level_iter_.Seek(target);
  86. InitDataBlock();
  87. if (second_level_iter_.iter() != nullptr) {
  88. second_level_iter_.Seek(target);
  89. }
  90. SkipEmptyDataBlocksForward();
  91. }
  92. void TwoLevelIndexIterator::SeekForPrev(const Slice& target) {
  93. first_level_iter_.Seek(target);
  94. InitDataBlock();
  95. if (second_level_iter_.iter() != nullptr) {
  96. second_level_iter_.SeekForPrev(target);
  97. }
  98. if (!Valid()) {
  99. if (!first_level_iter_.Valid() && first_level_iter_.status().ok()) {
  100. first_level_iter_.SeekToLast();
  101. InitDataBlock();
  102. if (second_level_iter_.iter() != nullptr) {
  103. second_level_iter_.SeekForPrev(target);
  104. }
  105. }
  106. SkipEmptyDataBlocksBackward();
  107. }
  108. }
  109. void TwoLevelIndexIterator::SeekToFirst() {
  110. first_level_iter_.SeekToFirst();
  111. InitDataBlock();
  112. if (second_level_iter_.iter() != nullptr) {
  113. second_level_iter_.SeekToFirst();
  114. }
  115. SkipEmptyDataBlocksForward();
  116. }
  117. void TwoLevelIndexIterator::SeekToLast() {
  118. first_level_iter_.SeekToLast();
  119. InitDataBlock();
  120. if (second_level_iter_.iter() != nullptr) {
  121. second_level_iter_.SeekToLast();
  122. }
  123. SkipEmptyDataBlocksBackward();
  124. }
  125. void TwoLevelIndexIterator::Next() {
  126. assert(Valid());
  127. second_level_iter_.Next();
  128. SkipEmptyDataBlocksForward();
  129. }
  130. void TwoLevelIndexIterator::Prev() {
  131. assert(Valid());
  132. second_level_iter_.Prev();
  133. SkipEmptyDataBlocksBackward();
  134. }
  135. void TwoLevelIndexIterator::SkipEmptyDataBlocksForward() {
  136. while (second_level_iter_.iter() == nullptr ||
  137. (!second_level_iter_.Valid() && second_level_iter_.status().ok())) {
  138. // Move to next block
  139. if (!first_level_iter_.Valid()) {
  140. SetSecondLevelIterator(nullptr);
  141. return;
  142. }
  143. first_level_iter_.Next();
  144. InitDataBlock();
  145. if (second_level_iter_.iter() != nullptr) {
  146. second_level_iter_.SeekToFirst();
  147. }
  148. }
  149. }
  150. void TwoLevelIndexIterator::SkipEmptyDataBlocksBackward() {
  151. while (second_level_iter_.iter() == nullptr ||
  152. (!second_level_iter_.Valid() && second_level_iter_.status().ok())) {
  153. // Move to next block
  154. if (!first_level_iter_.Valid()) {
  155. SetSecondLevelIterator(nullptr);
  156. return;
  157. }
  158. first_level_iter_.Prev();
  159. InitDataBlock();
  160. if (second_level_iter_.iter() != nullptr) {
  161. second_level_iter_.SeekToLast();
  162. }
  163. }
  164. }
  165. void TwoLevelIndexIterator::SetSecondLevelIterator(
  166. InternalIteratorBase<IndexValue>* iter) {
  167. InternalIteratorBase<IndexValue>* old_iter = second_level_iter_.Set(iter);
  168. delete old_iter;
  169. }
  170. void TwoLevelIndexIterator::InitDataBlock() {
  171. if (!first_level_iter_.Valid()) {
  172. SetSecondLevelIterator(nullptr);
  173. } else {
  174. BlockHandle handle = first_level_iter_.value().handle;
  175. if (second_level_iter_.iter() != nullptr &&
  176. !second_level_iter_.status().IsIncomplete() &&
  177. handle.offset() == data_block_handle_.offset()) {
  178. // second_level_iter is already constructed with this iterator, so
  179. // no need to change anything
  180. } else {
  181. InternalIteratorBase<IndexValue>* iter =
  182. state_->NewSecondaryIterator(handle);
  183. data_block_handle_ = handle;
  184. SetSecondLevelIterator(iter);
  185. if (iter == nullptr) {
  186. status_ = Status::Corruption("Missing block for partition " +
  187. handle.ToString());
  188. }
  189. }
  190. }
  191. }
  192. } // namespace
  193. InternalIteratorBase<IndexValue>* NewTwoLevelIterator(
  194. TwoLevelIteratorState* state,
  195. InternalIteratorBase<IndexValue>* first_level_iter) {
  196. return new TwoLevelIndexIterator(state, first_level_iter);
  197. }
  198. } // namespace ROCKSDB_NAMESPACE