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 <rzarzyns@redhat.com>
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);
}
}
+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,
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,