]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: clear ondisk temp objects on startup 58693/head
authorXuehan Xu <xuxuehan@qianxin.com>
Sat, 20 Jul 2024 09:39:26 +0000 (17:39 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Mon, 29 Jul 2024 10:38:50 +0000 (18:38 +0800)
Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/osd/pg.cc
src/crimson/osd/pg.h
src/crimson/osd/pg_shard_manager.cc

index 6cb3b6f05364970fd485e1345072dceddf43c0aa..e9fef6189fb5bfecf724943c4f7d8e0efca9fb25 100644 (file)
@@ -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<seastar::stop_iteration> PG::trim_snap(
   snapid_t to_trim,
   bool needs_pause)
index ec6bb78fa4e9e064a29734993ae76d7cd2a4132d..dd9b78a5fc76b64187d86a71b6708b57d4cad87e 100644 (file)
@@ -545,6 +545,7 @@ public:
     ObjectContextRef obc,
     const std::error_code e,
     ceph_tid_t rep_tid);
+  seastar::future<> clear_temp_objects();
 
 private:
 
index a32a1581adcdfbc737ac026e3a11a180f46efba4..0d041e91e5e79c87643337a968eda89a6fe52e62 100644 (file)
@@ -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));
+               });
              });
            });
           });