]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: implement CEPH_OSD_OP_SETALLOCHINT in OpsExecuter 46770/head
authorRadosław Zarzyński <rzarzyns@redhat.com>
Tue, 21 Jun 2022 14:04:46 +0000 (16:04 +0200)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Fri, 1 Jul 2022 07:56:23 +0000 (07:56 +0000)
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>
src/crimson/osd/ops_executer.cc
src/crimson/osd/pg_backend.cc
src/crimson/osd/pg_backend.h

index ffe7f0eb60271f69b7906c18d16758401bc20640..54dffa4349366be2799901db1e26190fd1df0209 100644 (file)
@@ -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);
index 51ec276555c3a9438bb9ae634f00c0984405e7d0..74e607bffe649e01dc8e96c6fcbd9f1011c50b42 100644 (file)
@@ -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,
index da03426b8909a7e212c08044eaefeca4a3304c6c..076da7d384332405a6fc103ee0da487424642935 100644 (file)
@@ -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,