From: Radosław Zarzyński Date: Tue, 21 Jun 2022 14:04:46 +0000 (+0200) Subject: crimson/osd: implement CEPH_OSD_OP_SETALLOCHINT in OpsExecuter X-Git-Tag: v18.0.0~581^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F46770%2Fhead;p=ceph.git crimson/osd: implement CEPH_OSD_OP_SETALLOCHINT in OpsExecuter 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 --- diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index ffe7f0eb6027..54dffa434936 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 51ec276555c3..74e607bffe64 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 da03426b8909..076da7d38433 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,