From: Xuehan Xu Date: Sat, 17 Aug 2024 10:41:13 +0000 (+0800) Subject: crimson/osd/pg: add PG::remove_object_maybe_snapmapped() X-Git-Tag: v20.0.0~1207^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=32c9183b1f8cb9e57d1e5772de1a6447a6f9ef7f;p=ceph.git crimson/osd/pg: add PG::remove_object_maybe_snapmapped() (recover/backfill)_delete should remove oids in the snap mapper together with the objects Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index bb249b8e10e83..2c73a08bb1c4f 100644 --- a/src/crimson/osd/pg.cc +++ b/src/crimson/osd/pg.cc @@ -1771,4 +1771,20 @@ PG::already_complete(const osd_reqid_t& reqid) } } +void PG::remove_maybe_snapmapped_object( + ceph::os::Transaction &t, + const hobject_t &soid) +{ + t.remove( + coll_ref->get_cid(), + ghobject_t{soid, ghobject_t::NO_GEN, pg_whoami.shard}); + if (soid.snap < CEPH_MAXSNAP) { + OSDriver::OSTransaction _t(osdriver.get_transaction(&t)); + int r = snap_mapper.remove_oid(soid, &_t); + if (!(r == 0 || r == -ENOENT)) { + logger().debug("{}: remove_oid returned {}", __func__, cpp_strerror(r)); + ceph_abort(); + } + } +} } diff --git a/src/crimson/osd/pg.h b/src/crimson/osd/pg.h index 6810803867f15..2fcb728353790 100644 --- a/src/crimson/osd/pg.h +++ b/src/crimson/osd/pg.h @@ -432,15 +432,17 @@ public: } void unreserve_recovery_space() final {} + void remove_maybe_snapmapped_object( + ceph::os::Transaction &t, + const hobject_t &soid); + struct PGLogEntryHandler : public PGLog::LogEntryHandler { PG *pg; ceph::os::Transaction *t; PGLogEntryHandler(PG *pg, ceph::os::Transaction *t) : pg(pg), t(t) {} // LogEntryHandler - void remove(const hobject_t &hoid) override { - // TODO - } + void remove(const hobject_t &soid) override {} void try_stash(const hobject_t &hoid, version_t v) override { // TODO } diff --git a/src/crimson/osd/recovery_backend.cc b/src/crimson/osd/recovery_backend.cc index 1148585ad25f3..8ba2526a1bd0e 100644 --- a/src/crimson/osd/recovery_backend.cc +++ b/src/crimson/osd/recovery_backend.cc @@ -3,6 +3,7 @@ #include +#include "crimson/common/coroutine.h" #include "crimson/common/exception.h" #include "crimson/osd/recovery_backend.h" #include "crimson/osd/pg.h" @@ -206,12 +207,14 @@ RecoveryBackend::handle_backfill_remove( ObjectStore::Transaction t; for ([[maybe_unused]] const auto& [soid, ver] : m.ls) { // TODO: the reserved space management. PG::try_reserve_recovery_space(). - t.remove(pg.get_collection_ref()->get_cid(), - ghobject_t(soid, ghobject_t::NO_GEN, pg.get_pg_whoami().shard)); + co_await interruptor::async([this, soid=soid, &t] { + pg.remove_maybe_snapmapped_object(t, soid); + }); } logger().debug("RecoveryBackend::handle_backfill_remove: do_transaction..."); - return shard_services.get_store().do_transaction( - pg.get_collection_ref(), std::move(t)).or_terminate(); + co_await interruptor::make_interruptible( + shard_services.get_store().do_transaction( + pg.get_collection_ref(), std::move(t)).or_terminate()); } RecoveryBackend::interruptible_future diff --git a/src/crimson/osd/replicated_recovery_backend.cc b/src/crimson/osd/replicated_recovery_backend.cc index 03cf38e6954b6..f59d2f1757d0e 100644 --- a/src/crimson/osd/replicated_recovery_backend.cc +++ b/src/crimson/osd/replicated_recovery_backend.cc @@ -232,8 +232,10 @@ ReplicatedRecoveryBackend::local_recover_delete( (auto lomt) -> interruptible_future<> { if (lomt->os.exists) { return seastar::do_with(ceph::os::Transaction(), - [this, lomt = std::move(lomt)](auto& txn) { - return backend->remove(lomt->os, txn).then_interruptible( + [this, lomt = std::move(lomt)](auto& txn) mutable { + return interruptor::async([this, lomt=std::move(lomt), &txn] { + pg.remove_maybe_snapmapped_object(txn, lomt->os.oi.soid); + }).then_interruptible( [this, &txn]() mutable { logger().debug("ReplicatedRecoveryBackend::local_recover_delete: do_transaction..."); return shard_services.get_store().do_transaction(coll,