From 930b30f83bd67b1fdb484a450fb37c36644c9f05 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Tue, 27 Aug 2019 21:33:30 +0200 Subject: [PATCH] crimson/osd: add support for CEPH_OSD_OP_OMAPGETKEYS. Signed-off-by: Radoslaw Zarzynski --- src/crimson/osd/objclass.cc | 27 ++++++++++++---- src/crimson/osd/ops_executer.cc | 4 +++ src/crimson/osd/pg_backend.cc | 56 +++++++++++++++++++++++++++++++++ src/crimson/osd/pg_backend.h | 3 ++ 4 files changed, 84 insertions(+), 6 deletions(-) diff --git a/src/crimson/osd/objclass.cc b/src/crimson/osd/objclass.cc index 417d69135a84..994cc93b5efb 100644 --- a/src/crimson/osd/objclass.cc +++ b/src/crimson/osd/objclass.cc @@ -273,12 +273,27 @@ int cls_cxx_map_get_all_vals(cls_method_context_t hctx, } int cls_cxx_map_get_keys(cls_method_context_t hctx, - const string &start_obj, - uint64_t max_to_get, - set *keys, - bool *more) -{ - return 0; + const std::string& start_obj, + const uint64_t max_to_get, + std::set* const keys, + bool* const more) +{ + OSDOp op{ CEPH_OSD_OP_OMAPGETKEYS }; + encode(start_obj, op.indata); + encode(max_to_get, 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(*keys, iter); + decode(*more, iter); + } catch (buffer::error&) { + return -EIO; + } + return keys->size(); } int cls_cxx_map_get_vals(cls_method_context_t hctx, diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index d2cae201fb38..25c5c88734d8 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -412,6 +412,10 @@ OpsExecuter::do_osd_op(OSDOp& osd_op) return dont_do_legacy_op(); // OMAP + case CEPH_OSD_OP_OMAPGETKEYS: + return do_read_op([&osd_op] (auto& backend, const auto& os) { + return backend.omap_get_keys(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 1308c2b74159..b0af08417973 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -505,6 +505,62 @@ maybe_get_omap_vals_by_keys( } } +static seastar::future +maybe_get_omap_vals( + auto& store, + const auto& coll, + const auto& oi, + const auto& start_after) +{ + if (oi.is_omap()) { + return store->omap_get_values(coll, ghobject_t{oi.soid}, start_after); + } else { + return seastar::make_ready_future( + true, ceph::os::FuturizedStore::omap_values_t{}); + } +} + +seastar::future<> PGBackend::omap_get_keys( + const ObjectState& os, + OSDOp& osd_op) const +{ + std::string start_after; + uint64_t max_return; + try { + auto p = osd_op.indata.cbegin(); + decode(start_after, p); + decode(max_return, 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] (bool, ceph::os::FuturizedStore::omap_values_t vals) { + ceph::bufferlist result; + bool truncated = false; + uint32_t num = 0; + for (auto& [key, val] : vals) { + if (num++ >= max_return || + result.length() >= local_conf()->osd_max_omap_bytes_per_request) { + truncated = true; + break; + } + encode(key, 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 9fdfb0f1b81a..d5c8cbfe54b7 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -89,6 +89,9 @@ public: std::string_view key) const; // OMAP + seastar::future<> omap_get_keys( + const ObjectState& os, + OSDOp& osd_op) const; seastar::future<> omap_get_vals_by_keys( const ObjectState& os, OSDOp& osd_op) const; -- 2.47.3