uint32_t num = 0;
bool truncated = false;
if (oi.is_omap()) {
- ObjectMap::ObjectMapIterator iter = osd->store->get_omap_iterator(
- ch, ghobject_t(soid)
- );
- ceph_assert(iter);
- iter->upper_bound(start_after);
- for (num = 0; iter->valid(); ++num, iter->next()) {
- if (num >= max_return ||
- bl.length() >= cct->_conf->osd_max_omap_bytes_per_request) {
- truncated = true;
- break;
- }
- encode(iter->key(), bl);
+ const auto result = osd->store->omap_iterate(
+ ch, ghobject_t(soid),
+ ObjectStore::omap_iter_seek_t{
+ .seek_position = start_after,
+ .seek_type = ObjectStore::omap_iter_seek_t::UPPER_BOUND
+ },
+ [&bl, &num, max_return,
+ max_bytes=cct->_conf->osd_max_omap_bytes_per_request]
+ (std::string_view key, std::string_view value) mutable {
+ if (num >= max_return || bl.length() >= max_bytes) {
+ return ObjectStore::omap_iter_ret_t::STOP;
+ }
+ encode(key, bl);
+ ++num;
+ return ObjectStore::omap_iter_ret_t::NEXT;
+ });
+ if (result < 0) {
+ ceph_abort();
+ } else if (const auto more = static_cast<bool>(result); more) {
+ truncated = true;
}
} // else return empty out_set
encode(num, osd_op.outdata);
&reply_obj.omap_header);
}
bufferlist omap_data;
- ObjectMap::ObjectMapIterator iter =
- osd->store->get_omap_iterator(ch, ghobject_t(oi.soid));
- ceph_assert(iter);
- iter->upper_bound(cursor.omap_offset);
- for (; iter->valid(); iter->next()) {
- ++omap_keys;
- encode(iter->key(), omap_data);
- encode(iter->value(), omap_data);
- left -= iter->key().length() + 4 + iter->value().length() + 4;
- if (left <= 0)
- break;
+ const auto result = osd->store->omap_iterate(
+ ch, ghobject_t(oi.soid),
+ ObjectStore::omap_iter_seek_t{
+ .seek_position = cursor.omap_offset,
+ .seek_type = ObjectStore::omap_iter_seek_t::UPPER_BOUND
+ },
+ [&omap_data, &omap_keys, &left, &cursor]
+ (std::string_view key, std::string_view value) mutable {
+ ++omap_keys;
+ encode(key, omap_data);
+ encode(value, omap_data);
+ left -= key.length() + 4 + value.length() + 4;
+ if (left <= 0) {
+ cursor.omap_offset = key;
+ return ObjectStore::omap_iter_ret_t::STOP;
+ }
+ return ObjectStore::omap_iter_ret_t::NEXT;
+ });
+ if (result < 0) {
+ ceph_abort();
+ } else if (const auto more = static_cast<bool>(result); !more) {
+ cursor.omap_complete = true;
+ dout(20) << " got omap" << dendl;
}
if (omap_keys) {
encode(omap_keys, reply_obj.omap_data);
reply_obj.omap_data.claim_append(omap_data);
}
- if (iter->valid()) {
- cursor.omap_offset = iter->key();
- } else {
- cursor.omap_complete = true;
- dout(20) << " got omap" << dendl;
- }
}
}