From cbdecc1f34defffb213f6f65742cbfbbc318db95 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Sat, 20 Jul 2024 17:39:26 +0800 Subject: [PATCH] crimson/osd: clear ondisk temp objects on startup Signed-off-by: Xuehan Xu --- src/crimson/osd/pg.cc | 29 +++++++++++++++++++++++++++++ src/crimson/osd/pg.h | 1 + src/crimson/osd/pg_shard_manager.cc | 6 ++++-- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index 6cb3b6f053649..e9fef6189fb5b 100644 --- a/src/crimson/osd/pg.cc +++ b/src/crimson/osd/pg.cc @@ -513,6 +513,35 @@ Context *PG::on_clean() return nullptr; } +seastar::future<> PG::clear_temp_objects() +{ + logger().info("{} {}", __func__, pgid); + ghobject_t _next; + ceph::os::Transaction t; + auto max_size = local_conf()->osd_target_transaction_size; + while(true) { + auto [objs, next] = co_await shard_services.get_store().list_objects( + coll_ref, _next, ghobject_t::get_max(), max_size); + if (objs.empty()) { + if (!t.empty()) { + co_await shard_services.get_store().do_transaction( + coll_ref, std::move(t)); + } + break; + } + for (auto &obj : objs) { + if (obj.hobj.is_temp()) { + t.remove(coll_ref->get_cid(), obj); + } + } + _next = next; + if (t.get_num_ops() >= max_size) { + co_await shard_services.get_store().do_transaction( + coll_ref, t.claim_and_reset()); + } + } +} + PG::interruptible_future PG::trim_snap( snapid_t to_trim, bool needs_pause) diff --git a/src/crimson/osd/pg.h b/src/crimson/osd/pg.h index ec6bb78fa4e9e..dd9b78a5fc76b 100644 --- a/src/crimson/osd/pg.h +++ b/src/crimson/osd/pg.h @@ -545,6 +545,7 @@ class PG : public boost::intrusive_ref_counter< ObjectContextRef obc, const std::error_code e, ceph_tid_t rep_tid); + seastar::future<> clear_temp_objects(); private: diff --git a/src/crimson/osd/pg_shard_manager.cc b/src/crimson/osd/pg_shard_manager.cc index a32a1581adcdf..0d041e91e5e79 100644 --- a/src/crimson/osd/pg_shard_manager.cc +++ b/src/crimson/osd/pg_shard_manager.cc @@ -35,8 +35,10 @@ seastar::future<> PGShardManager::load_pgs(crimson::os::FuturizedStore& store) pgid ).then([pgid, &per_shard_state](auto &&pg) { logger().info("load_pgs: loaded {}", pgid); - per_shard_state.pg_map.pg_loaded(pgid, std::move(pg)); - return seastar::now(); + return pg->clear_temp_objects( + ).then([&per_shard_state, pg, pgid] { + per_shard_state.pg_map.pg_loaded(pgid, std::move(pg)); + }); }); }); });