From: Samuel Just Date: Fri, 21 Oct 2022 01:27:55 +0000 (-0700) Subject: Merge pull request #48477 from rzarzynski/wip-crimson-rollback-delete-head X-Git-Tag: v18.1.0~977 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=67d89f28e8dcb7ecd80e73c141d1841efc0b87a9;p=ceph.git Merge pull request #48477 from rzarzynski/wip-crimson-rollback-delete-head crimson/osd: add the delete-head special case of CEPH_OSD_OP_ROLLBACK Reviewed-by: Matan Breizman Reviewed-by: Samuel Just --- 67d89f28e8dcb7ecd80e73c141d1841efc0b87a9 diff --cc src/crimson/osd/pg_backend.cc index 3497379dd349,264340ad35ad..52e1503e4c23 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@@ -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 + 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(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,