From 66fa95f318455057c280c028f097bbcd82d00e83 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Tue, 8 Mar 2022 17:25:29 +0000 Subject: [PATCH] crimson/osd: fix no ENOENT when removing already removed object This patch deals with the following problem: ``` [rzarzynski@o06 build]$ RBD_FEATURES="21" ./bin/ceph_test_cls_rbd --gtest_filter=TestClsRbd.create Running main() from gmock_main.cc Note: Google Test filter = TestClsRbd.create [==========] Running 1 test from 1 test suite. [----------] Global test environment set-up. [----------] 1 test from TestClsRbd [ RUN ] TestClsRbd.create ../src/test/cls_rbd/test_cls_rbd.cc:467: Failure Expected equality of these values: -2 ioctx.remove(oid) Which is: 0 [ FAILED ] TestClsRbd.create (10 ms) [----------] 1 test from TestClsRbd (10 ms total) [----------] Global test environment tear-down [==========] 1 test from 1 test suite ran. (2805 ms total) [ PASSED ] 0 tests. [ FAILED ] 1 test, listed below: [ FAILED ] TestClsRbd.create 1 FAILED TEST ``` Signed-off-by: Radoslaw Zarzynski --- src/crimson/osd/pg_backend.cc | 5 ++++- src/crimson/osd/pg_backend.h | 8 +++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index e45b935bb323f..55f43f4c21e7b 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -758,10 +758,13 @@ PGBackend::remove(ObjectState& os, ceph::os::Transaction& txn) return seastar::now(); } -PGBackend::interruptible_future<> +PGBackend::remove_iertr::future<> PGBackend::remove(ObjectState& os, ceph::os::Transaction& txn, object_stat_sum_t& delta_stats) { + if (!os.exists) { + return crimson::ct_error::enoent::make(); + } // todo: snapset txn.remove(coll->get_cid(), ghobject_t{os.oi.soid, ghobject_t::NO_GEN, shard}); diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index 1d7e6219ee5bf..ce551a55aae70 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -128,7 +128,13 @@ public: const OSDOp& osd_op, ceph::os::Transaction& trans, object_stat_sum_t& delta_stats); - interruptible_future<> remove( + using remove_ertr = crimson::errorator< + crimson::ct_error::enoent>; + using remove_iertr = + ::crimson::interruptible::interruptible_errorator< + ::crimson::osd::IOInterruptCondition, + remove_ertr>; + remove_iertr::future<> remove( ObjectState& os, ceph::os::Transaction& txn, object_stat_sum_t& delta_stats); -- 2.39.5