From b6436f47e871d787535ea80a301aff543fd77739 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Fri, 19 Jan 2024 17:41:01 -0800 Subject: [PATCH] crimson/osd/ops_executor: simplify prepare_clone, use set_clone_state - Remove static_snap_oi name -- left over from old classic implementation, misleading. - OpsExecutor::prepare_clone can only be invoked on a primary, remove the branch. - Create the obs directly and pass to obc via set_clone_state, which sets fully_loaded. Signed-off-by: Samuel Just --- src/crimson/osd/ops_executer.cc | 47 +++++++++++++-------------------- src/crimson/osd/ops_executer.h | 2 +- 2 files changed, 20 insertions(+), 29 deletions(-) diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index 034fdde716935..5fe7ab4a7178f 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -931,12 +931,12 @@ std::unique_ptr OpsExecuter::execute_clone( return std::vector{std::begin(snapc.snaps), last}; }(); - auto [snap_oi, clone_obc] = prepare_clone(coid); + auto clone_obc = prepare_clone(coid); // make clone - backend.clone(snap_oi, initial_obs, clone_obc->obs, txn); + backend.clone(clone_obc->obs.oi, initial_obs, clone_obc->obs, txn); delta_stats.num_objects++; - if (snap_oi.is_omap()) { + if (clone_obc->obs.oi.is_omap()) { delta_stats.num_objects_omap++; } delta_stats.num_object_clones++; @@ -960,7 +960,7 @@ std::unique_ptr OpsExecuter::execute_clone( cloning_ctx->log_entry = { pg_log_entry_t::CLONE, coid, - snap_oi.version, + clone_obc->obs.oi.version, initial_obs.oi.version, initial_obs.oi.user_version, osd_reqid_t(), @@ -1028,32 +1028,23 @@ OpsExecuter::flush_clone_metadata( }); } -// TODO: make this static -std::pair OpsExecuter::prepare_clone( +ObjectContextRef OpsExecuter::prepare_clone( const hobject_t& coid) { - object_info_t static_snap_oi(coid); - static_snap_oi.version = osd_op_params->at_version; - static_snap_oi.prior_version = obc->obs.oi.version; - static_snap_oi.copy_user_bits(obc->obs.oi); - if (static_snap_oi.is_whiteout()) { - // clone shouldn't be marked as whiteout - static_snap_oi.clear_flag(object_info_t::FLAG_WHITEOUT); - } - - ObjectContextRef clone_obc; - if (pg->is_primary()) { - // lookup_or_create - auto [c_obc, existed] = - pg->obc_registry.get_cached_obc(std::move(coid)); - assert(!existed); - c_obc->obs.oi = static_snap_oi; - c_obc->obs.exists = true; - c_obc->ssc = obc->ssc; - logger().debug("clone_obc: {}", c_obc->obs.oi); - clone_obc = std::move(c_obc); - } - return std::make_pair(std::move(static_snap_oi), std::move(clone_obc)); + ceph_assert(pg->is_primary()); + ObjectState clone_obs{coid}; + clone_obs.exists = true; + clone_obs.oi.version = osd_op_params->at_version; + clone_obs.oi.prior_version = obc->obs.oi.version; + clone_obs.oi.copy_user_bits(obc->obs.oi); + clone_obs.oi.clear_flag(object_info_t::FLAG_WHITEOUT); + + auto [clone_obc, existed] = pg->obc_registry.get_cached_obc(std::move(coid)); + ceph_assert(!existed); + + clone_obc->set_clone_state(std::move(clone_obs)); + clone_obc->ssc = obc->ssc; + return clone_obc; } void OpsExecuter::apply_stats() diff --git a/src/crimson/osd/ops_executer.h b/src/crimson/osd/ops_executer.h index 1230b1c5a2e58..1d861d49bf1ff 100644 --- a/src/crimson/osd/ops_executer.h +++ b/src/crimson/osd/ops_executer.h @@ -449,7 +449,7 @@ public: version_t get_last_user_version() const; - std::pair prepare_clone( + ObjectContextRef prepare_clone( const hobject_t& coid); void apply_stats(); -- 2.39.5