From: Radoslaw Zarzynski Date: Wed, 28 Aug 2019 11:41:50 +0000 (+0200) Subject: crimson/osd: add support for CEPH_OSD_OP_OMAPGETVALS. X-Git-Tag: v15.1.0~1553^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3daddb8183522649757170cfc73f478b83fd7fd3;p=ceph.git crimson/osd: add support for CEPH_OSD_OP_OMAPGETVALS. Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/crimson/osd/objclass.cc b/src/crimson/osd/objclass.cc index 994cc93b5efb..22690b5f7f34 100644 --- a/src/crimson/osd/objclass.cc +++ b/src/crimson/osd/objclass.cc @@ -297,13 +297,29 @@ int cls_cxx_map_get_keys(cls_method_context_t hctx, } int cls_cxx_map_get_vals(cls_method_context_t hctx, - const string &start_obj, - const string &filter_prefix, - uint64_t max_to_get, - map *vals, - bool *more) + const std::string& start_obj, + const std::string& filter_prefix, + const uint64_t max_to_get, + std::map *vals, + bool* const more) { - return 0; + OSDOp op{ CEPH_OSD_OP_OMAPGETVALS }; + encode(start_obj, op.indata); + encode(max_to_get, op.indata); + encode(filter_prefix, op.indata); + try { + reinterpret_cast(hctx)->do_osd_op(op).get(); + } catch (ceph::osd::error& e) { + return -e.code().value(); + } + try { + auto iter = op.outdata.cbegin(); + decode(*vals, iter); + decode(*more, iter); + } catch (buffer::error&) { + return -EIO; + } + return vals->size(); } int cls_cxx_map_read_header(cls_method_context_t hctx, bufferlist *outbl) diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index 25c5c88734d8..9db3da1cb70a 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -416,6 +416,10 @@ OpsExecuter::do_osd_op(OSDOp& osd_op) return do_read_op([&osd_op] (auto& backend, const auto& os) { return backend.omap_get_keys(os, osd_op); }); + case CEPH_OSD_OP_OMAPGETVALS: + return do_read_op([&osd_op] (auto& backend, const auto& os) { + return backend.omap_get_vals(os, osd_op); + }); case CEPH_OSD_OP_OMAPGETVALSBYKEYS: return do_read_op([&osd_op] (auto& backend, const auto& os) { return backend.omap_get_vals_by_keys(os, osd_op); diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 40d109d448ce..211151f7739c 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -566,6 +566,57 @@ seastar::future<> PGBackend::omap_get_keys( //ctx->delta_stats.num_rd++; } +seastar::future<> PGBackend::omap_get_vals( + const ObjectState& os, + OSDOp& osd_op) const +{ + std::string start_after; + uint64_t max_return; + std::string filter_prefix; + try { + auto p = osd_op.indata.cbegin(); + decode(start_after, p); + decode(max_return, p); + decode(filter_prefix, p); + } catch (buffer::error&) { + throw ceph::osd::invalid_argument{}; + } + + max_return = \ + std::min(max_return, local_conf()->osd_max_omap_entries_per_request); + + // TODO: truly chunk the reading + return maybe_get_omap_vals(store, coll, os.oi, start_after).then( + [=, &osd_op] (const bool done, + ceph::os::FuturizedStore::omap_values_t vals) { + assert(done); + ceph::bufferlist result; + bool truncated = false; + uint32_t num = 0; + auto iter = filter_prefix > start_after ? vals.lower_bound(filter_prefix) + : std::begin(vals); + for (; iter != std::end(vals); ++iter) { + const auto& [key, value] = *iter; + if (key.substr(0, filter_prefix.size()) != filter_prefix) { + break; + } else if (num++ >= max_return || + result.length() >= local_conf()->osd_max_omap_bytes_per_request) { + truncated = true; + break; + } + encode(key, result); + encode(value, result); + } + encode(num, osd_op.outdata); + osd_op.outdata.claim_append(result); + encode(truncated, osd_op.outdata); + return seastar::now(); + }); + + // TODO: + //ctx->delta_stats.num_rd_kb += shift_round_up(osd_op.outdata.length(), 10); + //ctx->delta_stats.num_rd++; +} seastar::future<> PGBackend::omap_get_vals_by_keys( const ObjectState& os, OSDOp& osd_op) const diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index d5c8cbfe54b7..f703b51138a8 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -92,6 +92,9 @@ public: seastar::future<> omap_get_keys( const ObjectState& os, OSDOp& osd_op) const; + seastar::future<> omap_get_vals( + const ObjectState& os, + OSDOp& osd_op) const; seastar::future<> omap_get_vals_by_keys( const ObjectState& os, OSDOp& osd_op) const;