]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
Merge pull request #48477 from rzarzynski/wip-crimson-rollback-delete-head
authorSamuel Just <sjust@redhat.com>
Fri, 21 Oct 2022 01:27:55 +0000 (18:27 -0700)
committerGitHub <noreply@github.com>
Fri, 21 Oct 2022 01:27:55 +0000 (18:27 -0700)
crimson/osd: add the delete-head special case of CEPH_OSD_OP_ROLLBACK

Reviewed-by: Matan Breizman <mbreizma@redhat.com>
Reviewed-by: Samuel Just <sjust@redhat.com>
1  2 
src/crimson/osd/ops_executer.cc
src/crimson/osd/pg_backend.cc
src/crimson/osd/pg_backend.h

Simple merge
index 3497379dd349e1074cccfb454f3669b02814e9d5,264340ad35add48b6f9bd0c2f74e15b722f1e507..52e1503e4c23b473d5b956189d44e2d26c9b0d2f
@@@ -756,16 -682,73 +756,65 @@@ PGBackend::write_iertr::future<> PGBack
      return crimson::ct_error::file_too_large::make();
    }
  
 -  const bool existing = maybe_create_new_object(os, txn, delta_stats);
 -  if (existing && op.extent.length < os.oi.size) {
 -    txn.truncate(coll->get_cid(), ghobject_t{os.oi.soid}, op.extent.length);
 -    truncate_update_size_and_usage(delta_stats, os.oi, op.extent.truncate_size);
 -    osd_op_params.clean_regions.mark_data_region_dirty(op.extent.length,
 -      os.oi.size - op.extent.length);
 -  }
 -  if (op.extent.length) {
 -    txn.write(coll->get_cid(), ghobject_t{os.oi.soid}, 0, op.extent.length,
 -              osd_op.indata, op.flags);
 -    update_size_and_usage(delta_stats, os.oi, 0,
 -      op.extent.length, true);
 -    osd_op_params.clean_regions.mark_data_region_dirty(0,
 -      std::max((uint64_t) op.extent.length, os.oi.size));
 -  }
 -  return seastar::now();
 +  return _writefull(
 +    os,
 +    op.extent.truncate_size,
 +    osd_op.indata,
 +    txn,
 +    osd_op_params,
 +    delta_stats,
 +    op.flags);
  }
  
+ using mocked_load_clone_obc_ertr = crimson::errorator<
+   crimson::ct_error::enoent,
+   crimson::ct_error::object_corrupted>;
+ using mocked_lock_clone_obc_iertr =
+   ::crimson::interruptible::interruptible_errorator<
+     ::crimson::osd::IOInterruptCondition,
+     mocked_load_clone_obc_ertr>;
+ static mocked_lock_clone_obc_iertr::future<crimson::osd::ObjectContextRef>
+ mocked_load_clone_obc(const auto& coid)
+ {
+   return crimson::ct_error::enoent::make();
+ }
+ static auto head2clone(const hobject_t& hoid)
+ {
+   // TODO: transform hoid into coid
+   return hoid;
+ }
+ PGBackend::rollback_iertr::future<> PGBackend::rollback(
+   const SnapSet &ss,
+   ObjectState& os,
+   const OSDOp& osd_op,
+   ceph::os::Transaction& txn,
+   osd_op_params_t& osd_op_params,
+   object_stat_sum_t& delta_stats)
+ {
+   assert(os.oi.soid.is_head());
+   logger().debug("{} deleting {} and rolling back to old snap {}",
+                   __func__, os.oi.soid, osd_op.op.snap.snapid);
+   return mocked_load_clone_obc(
+     head2clone(os.oi.soid)
+   ).safe_then_interruptible([](auto clone_obc) {
+     // TODO: implement me!
+     static_cast<void>(clone_obc);
+     return remove_iertr::now();
+   }, crimson::ct_error::enoent::handle([this, &os, &txn, &delta_stats] {
+     // there's no snapshot here, or there's no object.
+     // if there's no snapshot, we delete the object; otherwise, do nothing.
+     logger().debug("rollback: deleting head on {}"
+                    " because got ENOENT|whiteout on obc lookup",
+                    os.oi.soid);
+     return remove(os, txn, delta_stats, true /*whiteout*/);
+   }), mocked_load_clone_obc_ertr::assert_all{
+     "unexpected error code in rollback"
+   });
+ }
  PGBackend::append_ierrorator::future<> PGBackend::append(
    ObjectState& os,
    OSDOp& osd_op,
Simple merge