From 8994632d36ee3a8db5fb711b838eace49e38c859 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Fri, 29 Nov 2024 20:21:26 +0000 Subject: [PATCH] osd: switch rest of PrimaryLogPG to omap_iterate Signed-off-by: Radoslaw Zarzynski --- src/osd/PrimaryLogPG.cc | 72 ++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 29 deletions(-) diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 06da8a4daf938..1340ec88679a7 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -7733,18 +7733,26 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector& ops) 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(result); more) { + truncated = true; } } // else return empty out_set encode(num, osd_op.outdata); @@ -9384,28 +9392,34 @@ int PrimaryLogPG::do_copy_get(OpContext *ctx, bufferlist::const_iterator& bp, &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(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; - } } } -- 2.39.5