From: Xuehan Xu Date: Sat, 20 Jul 2024 09:39:26 +0000 (+0800) Subject: crimson/osd: clear ondisk temp objects on startup X-Git-Tag: v20.0.0~1319^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cbdecc1f34defffb213f6f65742cbfbbc318db95;p=ceph.git crimson/osd: clear ondisk temp objects on startup Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index 6cb3b6f0536..e9fef6189fb 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 ec6bb78fa4e..dd9b78a5fc7 100644 --- a/src/crimson/osd/pg.h +++ b/src/crimson/osd/pg.h @@ -545,6 +545,7 @@ public: 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 a32a1581adc..0d041e91e5e 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)); + }); }); }); });