}
}
+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();
+ }
+ }
+}
}
}
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
}
#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"
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>
(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,