Iterator-bounding feature is introduced to make RocksDB iterators limited, so they
would less likely traverse over tombstones.
This is used when listing keys in fixed range, for example OMAPS for specific object.
It is problematic when extending this logic to WholeSpaceIterator,
since prefix must be taken into account.
Fixes: https://tracker.ceph.com/issues/55444
Signed-off-by: Adam Kupczyk <akupczyk@redhat.com>
std::optional<std::string> upper_bound;
};
- virtual WholeSpaceIterator get_wholespace_iterator(IteratorOpts opts = 0, IteratorBounds bounds = IteratorBounds()) = 0;
+ virtual WholeSpaceIterator get_wholespace_iterator(IteratorOpts opts = 0) = 0;
virtual Iterator get_iterator(const std::string &prefix, IteratorOpts opts = 0, IteratorBounds bounds = IteratorBounds()) {
return std::make_shared<PrefixIteratorImpl>(
prefix,
- get_wholespace_iterator(opts, std::move(bounds)));
+ get_wholespace_iterator(opts));
}
virtual uint64_t get_estimated_size(std::map<std::string,uint64_t> &extra) = 0;
return 0;
}
- WholeSpaceIterator get_wholespace_iterator(IteratorOpts opts = 0, IteratorBounds bounds = IteratorBounds()) override {
+ WholeSpaceIterator get_wholespace_iterator(IteratorOpts opts = 0) override {
return std::shared_ptr<KeyValueDB::WholeSpaceIteratorImpl>(
new MDBWholeSpaceIteratorImpl(&m_map, &m_lock, &iterator_seq_no, m_using_btree));
}
std::move(bounds));
}
} else {
- return KeyValueDB::get_iterator(prefix, opts, std::move(bounds));
+ return KeyValueDB::get_iterator(prefix, opts);
}
}
return db->NewIterator(rocksdb::ReadOptions(), cf);
}
-RocksDBStore::WholeSpaceIterator RocksDBStore::get_wholespace_iterator(IteratorOpts opts, IteratorBounds bounds)
+RocksDBStore::WholeSpaceIterator RocksDBStore::get_wholespace_iterator(IteratorOpts opts)
{
if (cf_handles.size() == 0) {
return std::make_shared<RocksDBWholeSpaceIteratorImpl>(
- this, default_cf, opts, std::move(bounds));
+ this, default_cf, opts);
} else {
return std::make_shared<WholeMergeIteratorImpl>(this);
}
RocksDBStore::WholeSpaceIterator RocksDBStore::get_default_cf_iterator()
{
- return std::make_shared<RocksDBWholeSpaceIteratorImpl>(this, default_cf, 0, IteratorBounds());
+ return std::make_shared<RocksDBWholeSpaceIteratorImpl>(this, default_cf, 0);
}
int RocksDBStore::prepare_for_reshard(const std::string& new_sharding,
public KeyValueDB::WholeSpaceIteratorImpl {
protected:
rocksdb::Iterator *dbiter;
- const KeyValueDB::IteratorBounds bounds;
- const rocksdb::Slice iterate_lower_bound;
- const rocksdb::Slice iterate_upper_bound;
public:
explicit RocksDBWholeSpaceIteratorImpl(const RocksDBStore* db,
rocksdb::ColumnFamilyHandle* cf,
- const KeyValueDB::IteratorOpts opts,
- KeyValueDB::IteratorBounds bounds_) :
- bounds(std::move(bounds_)),
- iterate_lower_bound(make_slice(bounds.lower_bound)),
- iterate_upper_bound(make_slice(bounds.upper_bound))
+ const KeyValueDB::IteratorOpts opts)
{
rocksdb::ReadOptions options = rocksdb::ReadOptions();
if (opts & ITERATOR_NOCACHE)
options.fill_cache=false;
- if (db->cct->_conf->osd_rocksdb_iterator_bounds_enabled) {
- if (bounds.lower_bound) {
- options.iterate_lower_bound = &iterate_lower_bound;
- }
- if (bounds.upper_bound) {
- options.iterate_upper_bound = &iterate_upper_bound;
- }
- }
dbiter = db->db->NewIterator(options, cf);
}
- //virtual ~RocksDBWholeSpaceIteratorImpl() { }
~RocksDBWholeSpaceIteratorImpl() override;
int seek_to_first() override;
return nullptr;
}
- WholeSpaceIterator get_wholespace_iterator(IteratorOpts opts = 0, IteratorBounds bounds = IteratorBounds()) override;
+ WholeSpaceIterator get_wholespace_iterator(IteratorOpts opts = 0) override;
private:
WholeSpaceIterator get_default_cf_iterator();
return 0;
}
-KeyValueDB::WholeSpaceIterator KeyValueDBMemory::get_wholespace_iterator(IteratorOpts opts, IteratorBounds bounds) {
+KeyValueDB::WholeSpaceIterator KeyValueDBMemory::get_wholespace_iterator(IteratorOpts opts) {
return std::shared_ptr<KeyValueDB::WholeSpaceIteratorImpl>(
new WholeSpaceMemIterator(this)
);
friend class WholeSpaceMemIterator;
public:
- WholeSpaceIterator get_wholespace_iterator(IteratorOpts opts = 0, IteratorBounds bounds = IteratorBounds()) override;
+ WholeSpaceIterator get_wholespace_iterator(IteratorOpts opts = 0) override;
};