}
};
public:
-
- virtual WholeSpaceIterator get_wholespace_iterator() = 0;
- virtual Iterator get_iterator(const std::string &prefix) {
+ typedef uint32_t IteratorOpts;
+ static const uint32_t ITERATOR_NOCACHE = 1;
+ virtual WholeSpaceIterator get_wholespace_iterator(IteratorOpts opts = 0) = 0;
+ virtual Iterator get_iterator(const std::string &prefix, IteratorOpts opts = 0) {
return std::make_shared<PrefixIteratorImpl>(
prefix,
- get_wholespace_iterator());
+ get_wholespace_iterator(opts));
}
virtual uint64_t get_estimated_size(std::map<std::string,uint64_t> &extra) = 0;
}
};
-KeyValueDB::Iterator RocksDBStore::get_iterator(const std::string& prefix)
+KeyValueDB::Iterator RocksDBStore::get_iterator(const std::string& prefix, IteratorOpts opts)
{
auto cf_it = cf_handles.find(prefix);
if (cf_it != cf_handles.end()) {
cf_it->second.handles);
}
} else {
- return KeyValueDB::get_iterator(prefix);
+ return KeyValueDB::get_iterator(prefix, opts);
}
}
return db->NewIterator(rocksdb::ReadOptions(), cf);
}
-RocksDBStore::WholeSpaceIterator RocksDBStore::get_wholespace_iterator()
+RocksDBStore::WholeSpaceIterator RocksDBStore::get_wholespace_iterator(IteratorOpts opts)
{
if (cf_handles.size() == 0) {
+ rocksdb::ReadOptions opt = rocksdb::ReadOptions();
+ if (opts & ITERATOR_NOCACHE)
+ opt.fill_cache=false;
return std::make_shared<RocksDBWholeSpaceIteratorImpl>(
- db->NewIterator(rocksdb::ReadOptions(), default_cf));
+ db->NewIterator(opt, default_cf));
} else {
return std::make_shared<WholeMergeIteratorImpl>(this);
}
{
if (collections_had_errors) {
dout(10) << __func__ << dendl;
- KeyValueDB::Iterator it = db->get_iterator(PREFIX_COLL);
+ KeyValueDB::Iterator it = db->get_iterator(PREFIX_COLL, KeyValueDB::ITERATOR_NOCACHE);
for (it->upper_bound(string());
it->valid();
it->next()) {
} else {
per_pool_stat_collection = true;
dout(10) << __func__ << " per-pool statfs is enabled" << dendl;
- KeyValueDB::Iterator it = db->get_iterator(PREFIX_STAT);
+ KeyValueDB::Iterator it = db->get_iterator(PREFIX_STAT, KeyValueDB::ITERATOR_NOCACHE);
for (it->upper_bound(string());
it->valid();
it->next()) {
int64_t& warnings,
BlueStoreRepairer* repairer)
{
- auto it = db->get_iterator(PREFIX_STAT);
+ auto it = db->get_iterator(PREFIX_STAT, KeyValueDB::ITERATOR_NOCACHE);
if (it) {
for (it->lower_bound(string()); it->valid(); it->next()) {
string key = it->key();
size_t processed_myself = 0;
- auto it = db->get_iterator(PREFIX_OBJ);
+ auto it = db->get_iterator(PREFIX_OBJ, KeyValueDB::ITERATOR_NOCACHE);
mempool::bluestore_fsck::list<string> expecting_shards;
if (it) {
const size_t thread_count = cct->_conf->bluestore_fsck_quick_fix_threads;
}
dout(1) << __func__ << " checking shared_blobs" << dendl;
- it = db->get_iterator(PREFIX_SHARED_BLOB);
+ it = db->get_iterator(PREFIX_SHARED_BLOB, KeyValueDB::ITERATOR_NOCACHE);
if (it) {
// FIXME minor: perhaps simplify for shallow mode?
// fill global if not overriden below
auto& space_tracker = repairer.get_space_usage_tracker();
auto& misref_extents = repairer.get_misreferences();
interval_set<uint64_t> to_release;
- it = db->get_iterator(PREFIX_OBJ);
+ it = db->get_iterator(PREFIX_OBJ, KeyValueDB::ITERATOR_NOCACHE);
if (it) {
// fill global if not overriden below
auto expected_statfs = &expected_store_statfs;
if (depth != FSCK_SHALLOW) {
dout(1) << __func__ << " checking for stray omap data " << dendl;
- it = db->get_iterator(PREFIX_OMAP);
+ it = db->get_iterator(PREFIX_OMAP, KeyValueDB::ITERATOR_NOCACHE);
if (it) {
uint64_t last_omap_head = 0;
for (it->lower_bound(string()); it->valid(); it->next()) {
}
}
}
- it = db->get_iterator(PREFIX_PGMETA_OMAP);
+ it = db->get_iterator(PREFIX_PGMETA_OMAP, KeyValueDB::ITERATOR_NOCACHE);
if (it) {
uint64_t last_omap_head = 0;
for (it->lower_bound(string()); it->valid(); it->next()) {
}
}
}
- it = db->get_iterator(PREFIX_PERPOOL_OMAP);
+ it = db->get_iterator(PREFIX_PERPOOL_OMAP, KeyValueDB::ITERATOR_NOCACHE);
if (it) {
uint64_t last_omap_head = 0;
for (it->lower_bound(string()); it->valid(); it->next()) {
}
}
dout(1) << __func__ << " checking deferred events" << dendl;
- it = db->get_iterator(PREFIX_DEFERRED);
+ it = db->get_iterator(PREFIX_DEFERRED, KeyValueDB::ITERATOR_NOCACHE);
if (it) {
for (it->lower_bound(string()); it->valid(); it->next()) {
bufferlist bl = it->value();