]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd/pg: add PG::remove_object_maybe_snapmapped()
authorXuehan Xu <xuxuehan@qianxin.com>
Sat, 17 Aug 2024 10:41:13 +0000 (18:41 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Tue, 20 Aug 2024 07:21:57 +0000 (15:21 +0800)
(recover/backfill)_delete should remove oids in the snap mapper together
with the objects

Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/osd/pg.cc
src/crimson/osd/pg.h
src/crimson/osd/recovery_backend.cc
src/crimson/osd/replicated_recovery_backend.cc

index bb249b8e10e830927e60c5e739f529cdeff22937..2c73a08bb1c4f78fe64df67d2f58fcc29796edcb 100644 (file)
@@ -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();
+    }
+  }
+}
 }
index 6810803867f15df45a9c8c8681d24c6cda2666b6..2fcb7283537902933890ccf3072bb1677b5e3929 100644 (file)
@@ -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
     }
index 1148585ad25f3d4d2791114ad210d6ac7e351155..8ba2526a1bd0e5eca7ff5ed21b6d60ac04b6beea 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <fmt/format.h>
 
+#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<BackfillInterval>
index 03cf38e6954b6d31e28e4b3b04a564b3df75945d..f59d2f1757d0eb54ba8e7c973b095de4fc59ce30 100644 (file)
@@ -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,