ForwardLevelIterator(const ColumnFamilyData* const cfd,
const ReadOptions& read_options,
const std::vector<FileMetaData*>& files,
- const SliceTransform* prefix_extractor)
+ const SliceTransform* prefix_extractor,
+ bool allow_unprepared_value)
: cfd_(cfd),
read_options_(read_options),
files_(files),
file_index_(std::numeric_limits<uint32_t>::max()),
file_iter_(nullptr),
pinned_iters_mgr_(nullptr),
- prefix_extractor_(prefix_extractor) {}
+ prefix_extractor_(prefix_extractor),
+ allow_unprepared_value_(allow_unprepared_value) {}
~ForwardLevelIterator() override {
// Reset current pointer
prefix_extractor_, /*table_reader_ptr=*/nullptr,
/*file_read_hist=*/nullptr, TableReaderCaller::kUserIterator,
/*arena=*/nullptr, /*skip_filters=*/false, /*level=*/-1,
+ /*max_file_size_for_l0_meta_pin=*/0,
/*smallest_compaction_key=*/nullptr,
- /*largest_compaction_key=*/nullptr);
+ /*largest_compaction_key=*/nullptr, allow_unprepared_value_);
file_iter_->SetPinnedItersMgr(pinned_iters_mgr_);
valid_ = false;
if (!range_del_agg.IsEmpty()) {
}
return Status::OK();
}
+ bool PrepareValue() override {
+ assert(valid_);
+ if (file_iter_->PrepareValue()) {
+ return true;
+ }
+
+ assert(!file_iter_->Valid());
+ valid_ = false;
+ return false;
+ }
bool IsKeyPinned() const override {
return pinned_iters_mgr_ && pinned_iters_mgr_->PinningEnabled() &&
file_iter_->IsKeyPinned();
InternalIterator* file_iter_;
PinnedIteratorsManager* pinned_iters_mgr_;
const SliceTransform* prefix_extractor_;
+ const bool allow_unprepared_value_;
};
ForwardIterator::ForwardIterator(DBImpl* db, const ReadOptions& read_options,
ColumnFamilyData* cfd,
- SuperVersion* current_sv)
+ SuperVersion* current_sv,
+ bool allow_unprepared_value)
: db_(db),
read_options_(read_options),
cfd_(cfd),
prefix_extractor_(current_sv->mutable_cf_options.prefix_extractor.get()),
user_comparator_(cfd->user_comparator()),
+ allow_unprepared_value_(allow_unprepared_value),
immutable_min_heap_(MinIterComparator(&cfd_->internal_comparator())),
sv_(current_sv),
mutable_iter_(nullptr),
return immutable_status_;
}
+bool ForwardIterator::PrepareValue() {
+ assert(valid_);
+ if (current_->PrepareValue()) {
+ return true;
+ }
+
+ assert(!current_->Valid());
+ assert(!current_->status().ok());
+ assert(current_ != mutable_iter_); // memtable iterator can't fail
+ assert(immutable_status_.ok());
+
+ valid_ = false;
+ immutable_status_ = current_->status();
+ return false;
+}
+
Status ForwardIterator::GetProperty(std::string prop_name, std::string* prop) {
assert(prop != nullptr);
if (prop_name == "rocksdb.iterator.super-version-number") {
sv_->mem->NewRangeTombstoneIterator(
read_options_, sv_->current->version_set()->LastSequence()));
range_del_agg.AddTombstones(std::move(range_del_iter));
- sv_->imm->AddRangeTombstoneIterators(read_options_, &arena_,
- &range_del_agg);
+ // Always return Status::OK().
+ Status temp_s = sv_->imm->AddRangeTombstoneIterators(read_options_, &arena_,
+ &range_del_agg);
+ assert(temp_s.ok());
}
has_iter_trimmed_for_upper_bound_ = false;
/*table_reader_ptr=*/nullptr, /*file_read_hist=*/nullptr,
TableReaderCaller::kUserIterator, /*arena=*/nullptr,
/*skip_filters=*/false, /*level=*/-1,
+ MaxFileSizeForL0MetaPin(sv_->mutable_cf_options),
/*smallest_compaction_key=*/nullptr,
- /*largest_compaction_key=*/nullptr));
+ /*largest_compaction_key=*/nullptr, allow_unprepared_value_));
}
BuildLevelIterators(vstorage);
current_ = nullptr;
svnew->mem->NewRangeTombstoneIterator(
read_options_, sv_->current->version_set()->LastSequence()));
range_del_agg.AddTombstones(std::move(range_del_iter));
- svnew->imm->AddRangeTombstoneIterators(read_options_, &arena_,
- &range_del_agg);
+ // Always return Status::OK().
+ Status temp_s = svnew->imm->AddRangeTombstoneIterators(
+ read_options_, &arena_, &range_del_agg);
+ assert(temp_s.ok());
}
const auto* vstorage = sv_->current->storage_info();
/*table_reader_ptr=*/nullptr, /*file_read_hist=*/nullptr,
TableReaderCaller::kUserIterator, /*arena=*/nullptr,
/*skip_filters=*/false, /*level=*/-1,
+ MaxFileSizeForL0MetaPin(svnew->mutable_cf_options),
/*smallest_compaction_key=*/nullptr,
- /*largest_compaction_key=*/nullptr));
+ /*largest_compaction_key=*/nullptr, allow_unprepared_value_));
}
for (auto* f : l0_iters_) {
} else {
level_iters_.push_back(new ForwardLevelIterator(
cfd_, read_options_, level_files,
- sv_->mutable_cf_options.prefix_extractor.get()));
+ sv_->mutable_cf_options.prefix_extractor.get(),
+ allow_unprepared_value_));
}
}
}
/*table_reader_ptr=*/nullptr, /*file_read_hist=*/nullptr,
TableReaderCaller::kUserIterator, /*arena=*/nullptr,
/*skip_filters=*/false, /*level=*/-1,
+ MaxFileSizeForL0MetaPin(sv_->mutable_cf_options),
/*smallest_compaction_key=*/nullptr,
- /*largest_compaction_key=*/nullptr);
+ /*largest_compaction_key=*/nullptr, allow_unprepared_value_);
l0_iters_[i]->SetPinnedItersMgr(pinned_iters_mgr_);
}