From c105b4bea33ab7524ca69dc2db3a91c25ba9c197 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Thu, 13 Oct 2022 11:54:35 +0000 Subject: [PATCH] crimson/osd: add the delete-head special case of CEPH_OSD_OP_ROLLBACK This allows to pass `TestLibRBD.TestIOToSnapshot`: ``` [rzarzynski@o06 build]$ CRIMSON_COMPAT=true RBD_FEATURES=1 bin/ceph_test_librbd --gtest_filter=TestLibRBD.TestIOToSnapshot seed 3954016 Note: Google Test filter = TestLibRBD.TestIOToSnapshot [==========] Running 1 test from 1 test suite. [----------] Global test environment set-up. [----------] 1 test from TestLibRBD [ RUN ] TestLibRBD.TestIOToSnapshot using new format! ... opening testimg@orig read: 80 write to snapshot returned -30 Read-only file system num snaps is: 2 expected: 2 snap: orig snap: written found orig with size 2097152 found written with size 2097152 num snaps is: 1 expected: 1 snap: orig found orig with size 2097152 num snaps is: 0 expected: 0 [ OK ] TestLibRBD.TestIOToSnapshot (7510 ms) [----------] 1 test from TestLibRBD (7510 ms total) [----------] Global test environment tear-down [==========] 1 test from 1 test suite ran. (8504 ms total) [ PASSED ] 1 test. ``` Signed-off-by: Radoslaw Zarzynski --- src/crimson/osd/ops_executer.cc | 5 ++++ src/crimson/osd/pg_backend.cc | 49 +++++++++++++++++++++++++++++++++ src/crimson/osd/pg_backend.h | 13 +++++++++ 3 files changed, 67 insertions(+) diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index fdf9d3837d8..92ee5ef414d 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -566,6 +566,11 @@ OpsExecuter::do_execute_op(OSDOp& osd_op) return do_write_op([this, &osd_op](auto& backend, auto& os, auto& txn) { return backend.writefull(os, osd_op, txn, *osd_op_params, delta_stats); }); + case CEPH_OSD_OP_ROLLBACK: + return do_write_op([this, &ss=obc->get_ro_ss(), + &osd_op](auto& backend, auto& os, auto& txn) { + return backend.rollback(ss, os, osd_op, txn, *osd_op_params, delta_stats); + }); case CEPH_OSD_OP_APPEND: return do_write_op([this, &osd_op](auto& backend, auto& os, auto& txn) { return backend.append(os, osd_op, txn, *osd_op_params, delta_stats); diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index bdadabb8e19..264340ad35a 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -700,6 +700,55 @@ PGBackend::write_iertr::future<> PGBackend::writefull( return seastar::now(); } +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, diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index 7f38cb03873..7a3066b68ff 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -186,6 +186,19 @@ public: ceph::os::Transaction& trans, osd_op_params_t& osd_op_params, object_stat_sum_t& delta_stats); + using rollback_ertr = crimson::errorator< + crimson::ct_error::enoent>; + using rollback_iertr = + ::crimson::interruptible::interruptible_errorator< + ::crimson::osd::IOInterruptCondition, + rollback_ertr>; + rollback_iertr::future<> 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); write_iertr::future<> truncate( ObjectState& os, const OSDOp& osd_op, -- 2.39.5