From 0a50efbe36fefa601edc4c1c17be3d2620080166 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rados=C5=82aw=20Zarzy=C5=84ski?= Date: Tue, 21 Jun 2022 16:04:46 +0200 Subject: [PATCH] crimson/osd: implement CEPH_OSD_OP_SETALLOCHINT in OpsExecuter MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This commits brings support setting allocation hints to `OpsExecuter`. What is important to note that `SETALLOCHINTS`, at the ops execution layer, behaves basically like `TOUCH`, and thus should be ignored (for now) at the object store layer to not miss the part constituted by `PGBackend::maybe_create_new_object()`. Fixes: https://tracker.ceph.com/issues/56115 Signed-off-by: Radosław Zarzyński --- src/crimson/osd/ops_executer.cc | 4 +++- src/crimson/osd/pg_backend.cc | 19 +++++++++++++++++++ src/crimson/osd/pg_backend.h | 5 +++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index ffe7f0eb60271..54dffa4349366 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -566,7 +566,9 @@ OpsExecuter::do_execute_op(OSDOp& osd_op) return backend.zero(os, osd_op, txn, *osd_op_params, delta_stats); }, true); case CEPH_OSD_OP_SETALLOCHINT: - return osd_op_errorator::now(); + return do_write_op([this, &osd_op](auto& backend, auto& os, auto& txn) { + return backend.set_allochint(os, osd_op, txn, delta_stats); + }, true); case CEPH_OSD_OP_SETXATTR: return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) { return backend.setxattr(os, osd_op, txn, delta_stats); diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 51ec276555c3a..74e607bffe649 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -510,6 +510,25 @@ static bool is_offset_and_length_valid( } } +PGBackend::interruptible_future<> PGBackend::set_allochint( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& txn, + object_stat_sum_t& delta_stats) +{ + maybe_create_new_object(os, txn, delta_stats); + + os.oi.expected_object_size = osd_op.op.alloc_hint.expected_object_size; + os.oi.expected_write_size = osd_op.op.alloc_hint.expected_write_size; + os.oi.alloc_hint_flags = osd_op.op.alloc_hint.flags; + txn.set_alloc_hint(coll->get_cid(), + ghobject_t{os.oi.soid}, + os.oi.expected_object_size, + os.oi.expected_write_size, + os.oi.alloc_hint_flags); + return seastar::now(); +} + PGBackend::write_iertr::future<> PGBackend::write( ObjectState& os, const OSDOp& osd_op, diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index da03426b8909a..076da7d384332 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -151,6 +151,11 @@ public: interruptible_future<> remove( ObjectState& os, ceph::os::Transaction& txn); + interruptible_future<> set_allochint( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& trans, + object_stat_sum_t& delta_stats); write_iertr::future<> write( ObjectState& os, const OSDOp& osd_op, -- 2.39.5