* object's OMAP or till the iteration is stopped
* by `STOP`. Please note that if there is no such
* entry, `visitor` will be called 0 times.
- * @return error code, zero on success
+ * @return - error code (negative value) on failure,
+ * - positive value when the iteration has been
+ * stopped (omap_iter_ret_t::STOP) by the callable,
+ * - 0 otherwise.
*/
virtual int omap_iterate(
CollectionHandle &c,
}
// iterate!
+ bool more = false;
ceph::timespan next_lat_acc{0};
while (it->valid()) {
const auto& db_key = it->raw_key_as_sv().second;
std::string_view user_key = db_key.substr(userkey_offset_in_dbkey);
omap_iter_ret_t ret = f(user_key, it->value_as_sv());
if (ret == omap_iter_ret_t::STOP) {
+ more = true;
break;
} else if (ret == omap_iter_ret_t::NEXT) {
ceph::time_guard<ceph::mono_clock> measure_next{next_lat_acc};
l_bluestore_omap_next_lat,
next_lat_acc,
c->store->cct->_conf->bluestore_log_omap_iterator_age);
- return 0;
+ return more;
}
// -----------------
// omap
using omap_iter_seek_t = ObjectStore::omap_iter_seek_t;
- bool more = false;
auto result = store->omap_iterate(
ch,
ghobject_t{
.seek_position = pos.omap_pos,
.seek_type = omap_iter_seek_t::LOWER_BOUND
},
- [&pos, &more, first=true, max=cct->_conf->osd_deep_scrub_keys]
+ [&pos, first=true, max=cct->_conf->osd_deep_scrub_keys]
(std::string_view key, std::string_view value) mutable {
--max;
if (first) {
first = false; // preserve exact compat on `max` with old code
} else if (max == 0) {
- more = true;
pos.omap_pos = key;
return ObjectStore::omap_iter_ret_t::STOP;
}
});
if (result < 0) {
return -EIO;
- } else if (more) {
+ } else if (const auto more = static_cast<bool>(result); more) {
return -EINPROGRESS;
}
uint64_t available = cct->_conf->osd_recovery_max_chunk;
if (!progress.omap_complete) {
- std::optional<std::string> more_from;
using omap_iter_seek_t = ObjectStore::omap_iter_seek_t;
auto result = store->omap_iterate(
ch,
.seek_position = progress.omap_recovered_to,
.seek_type = omap_iter_seek_t::LOWER_BOUND
},
- [&available, &more_from, &omap_entries=out_op->omap_entries,
+ [&available, &new_progress, &omap_entries=out_op->omap_entries,
max_entries=cct->_conf->osd_recovery_max_omap_entries_per_chunk]
(std::string_view key, std::string_view value) mutable {
const auto num_new_bytes = key.size() + value.size();
if (auto cur_num_entries = omap_entries.size(); cur_num_entries > 0) {
if (max_entries > 0 && cur_num_entries >= max_entries) {
- more_from = key;
- return ObjectStore::omap_iter_ret_t::STOP;
+ new_progress.omap_recovered_to = key;
+ return ObjectStore::omap_iter_ret_t::STOP; // want more!
}
if (num_new_bytes >= available) {
- more_from = key;
+ new_progress.omap_recovered_to = key;
return ObjectStore::omap_iter_ret_t::STOP;
}
}
});
if (result < 0) {
return -EIO;
- } else if (more_from) {
- new_progress.omap_recovered_to = *more_from;
- } else {
+ } else if (const auto more = static_cast<bool>(result); !more) {
new_progress.omap_complete = true;
}
}