]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: add the delete-head special case of CEPH_OSD_OP_ROLLBACK
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Thu, 13 Oct 2022 11:54:35 +0000 (11:54 +0000)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Thu, 20 Oct 2022 14:48:54 +0000 (14:48 +0000)
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 <rzarzyns@redhat.com>
src/crimson/osd/ops_executer.cc
src/crimson/osd/pg_backend.cc
src/crimson/osd/pg_backend.h

index fdf9d3837d88cdd25129d19a4e230224ea56ca9d..92ee5ef414da49e19305791cd58a02b4660b1106 100644 (file)
@@ -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);
index bdadabb8e19315a11d72771fbe393bc5fbdcbd4e..264340ad35add48b6f9bd0c2f74e15b722f1e507 100644 (file)
@@ -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<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,
index 7f38cb03873756a7a12c466caefc7b5e1933a2be..7a3066b68ff6b2fcac8af2d81d9c89fa7d697f1d 100644 (file)
@@ -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,