From: Xuehan Xu Date: Tue, 31 Mar 2020 10:10:33 +0000 (+0800) Subject: crimson: keep track of clean_regions/dirty_regions of modifications X-Git-Tag: v16.1.0~2488^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8ff09f2da93b8162b6ce8b33e1387fde8908455b;p=ceph.git crimson: keep track of clean_regions/dirty_regions of modifications Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index 039d39d1730c..19a3292118c3 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -697,12 +697,14 @@ OpsExecuter::execute_osd_op(OSDOp& osd_op) return backend.create(os, osd_op, txn); }, true); case CEPH_OSD_OP_WRITE: - return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) { - return backend.write(os, osd_op, txn); + return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) { + osd_op_params = osd_op_params_t(); + return backend.write(os, osd_op, txn, *osd_op_params); }, true); case CEPH_OSD_OP_WRITEFULL: - return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) { - return backend.writefull(os, osd_op, txn); + return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) { + osd_op_params = osd_op_params_t(); + return backend.writefull(os, osd_op, txn, *osd_op_params); }, true); case CEPH_OSD_OP_SETALLOCHINT: return osd_op_errorator::now(); @@ -746,8 +748,9 @@ OpsExecuter::execute_osd_op(OSDOp& osd_op) return crimson::ct_error::operation_not_supported::make(); } #endif - return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) { - return backend.omap_set_vals(os, osd_op, txn); + return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) { + osd_op_params = osd_op_params_t(); + return backend.omap_set_vals(os, osd_op, txn, *osd_op_params); }, true); // watch/notify diff --git a/src/crimson/osd/ops_executer.h b/src/crimson/osd/ops_executer.h index 93fb96dd6e4b..2e9e74f4f743 100644 --- a/src/crimson/osd/ops_executer.h +++ b/src/crimson/osd/ops_executer.h @@ -84,6 +84,7 @@ private: PG& pg; PGBackend& backend; Ref msg; + std::optional osd_op_params; bool user_modify = false; ceph::os::Transaction txn; @@ -225,20 +226,22 @@ auto OpsExecuter::with_effect_on_obc( template OpsExecuter::osd_op_errorator::future<> OpsExecuter::submit_changes(Func&& f) && { assert(obc); - osd_op_params_t osd_op_params(std::move(msg)); + if (!osd_op_params) { + osd_op_params = osd_op_params_t(); + } + osd_op_params->req = std::move(msg); eversion_t at_version = pg.next_version(); - osd_op_params.at_version = at_version; - osd_op_params.pg_trim_to = pg.get_pg_trim_to(); - osd_op_params.min_last_complete_ondisk = pg.get_min_last_complete_ondisk(); - osd_op_params.last_complete = pg.get_info().last_complete; + osd_op_params->at_version = at_version; + osd_op_params->pg_trim_to = pg.get_pg_trim_to(); + osd_op_params->min_last_complete_ondisk = pg.get_min_last_complete_ondisk(); + osd_op_params->last_complete = pg.get_info().last_complete; if (user_modify) - osd_op_params.user_at_version = at_version.version; - + osd_op_params->user_at_version = at_version.version; if (__builtin_expect(op_effects.empty(), true)) { - return std::forward(f)(std::move(txn), std::move(obc), std::move(osd_op_params)); + return std::forward(f)(std::move(txn), std::move(obc), std::move(*osd_op_params)); } - return std::forward(f)(std::move(txn), std::move(obc), std::move(osd_op_params)).safe_then([this] { + return std::forward(f)(std::move(txn), std::move(obc), std::move(*osd_op_params)).safe_then([this] { // let's do the cleaning of `op_effects` in destructor return crimson::do_for_each(op_effects, [] (auto& op_effect) { return op_effect->execute(); diff --git a/src/crimson/osd/osd_operations/osdop_params.h b/src/crimson/osd/osd_operations/osdop_params.h index b50fb2b5f784..a0bd9dcbb354 100644 --- a/src/crimson/osd/osd_operations/osdop_params.h +++ b/src/crimson/osd/osd_operations/osdop_params.h @@ -13,9 +13,11 @@ struct osd_op_params_t { eversion_t pg_trim_to; eversion_t min_last_complete_ondisk; eversion_t last_complete; - version_t user_at_version; + version_t user_at_version = 0; bool user_modify = false; + ObjectCleanRegions clean_regions; + osd_op_params_t() = default; osd_op_params_t(Ref&& req) : req(req) {} osd_op_params_t(Ref&& req, eversion_t at_version, eversion_t pg_trim_to, eversion_t mlcod, eversion_t lc, version_t user_at_version) : diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index 8ee14f17741a..88a6b5b9e528 100644 --- a/src/crimson/osd/pg.cc +++ b/src/crimson/osd/pg.cc @@ -520,6 +520,7 @@ seastar::future<> PG::submit_transaction(const OpInfo& op_info, logger().debug("{} op_returns: {}", __func__, log_entries.back().op_returns); } + log_entries.back().clean_regions = std::move(osd_op_p.clean_regions); peering_state.append_log_with_trim_to_updated(std::move(log_entries), osd_op_p.at_version, txn, true, false); diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index a079ff5e9991..a308c41557c4 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -245,7 +245,8 @@ bool PGBackend::maybe_create_new_object( seastar::future<> PGBackend::write( ObjectState& os, const OSDOp& osd_op, - ceph::os::Transaction& txn) + ceph::os::Transaction& txn, + osd_op_params_t& osd_op_params) { const ceph_osd_op& op = osd_op.op; uint64_t offset = op.extent.offset; @@ -274,6 +275,13 @@ seastar::future<> PGBackend::write( if (op.extent.truncate_size != os.oi.size) { os.oi.size = length; // TODO: truncate_update_size_and_usage() + if (op.extent.truncate_size > os.oi.size) { + osd_op_params.clean_regions.mark_data_region_dirty(os.oi.size, + op.extent.truncate_size - os.oi.size); + } else { + osd_op_params.clean_regions.mark_data_region_dirty(op.extent.truncate_size, + os.oi.size - op.extent.truncate_size); + } } } os.oi.truncate_seq = op.extent.truncate_seq; @@ -291,13 +299,17 @@ seastar::future<> PGBackend::write( offset, length, std::move(buf), op.flags); os.oi.size = std::max(offset + length, os.oi.size); } + osd_op_params.clean_regions.mark_data_region_dirty(op.extent.offset, + op.extent.length); + return seastar::now(); } seastar::future<> PGBackend::writefull( ObjectState& os, const OSDOp& osd_op, - ceph::os::Transaction& txn) + ceph::os::Transaction& txn, + osd_op_params_t& osd_op_params) { const ceph_osd_op& op = osd_op.op; if (op.extent.length != osd_op.indata.length()) { @@ -307,11 +319,15 @@ seastar::future<> PGBackend::writefull( const bool existing = maybe_create_new_object(os, txn); if (existing && op.extent.length < os.oi.size) { txn.truncate(coll->get_cid(), ghobject_t{os.oi.soid}, op.extent.length); + osd_op_params.clean_regions.mark_data_region_dirty(op.extent.length, + os.oi.size - op.extent.length); } if (op.extent.length) { txn.write(coll->get_cid(), ghobject_t{os.oi.soid}, 0, op.extent.length, osd_op.indata, op.flags); os.oi.size = op.extent.length; + osd_op_params.clean_regions.mark_data_region_dirty(0, + std::max((uint64_t) op.extent.length, os.oi.size)); } return seastar::now(); } @@ -606,7 +622,8 @@ seastar::future<> PGBackend::omap_get_vals_by_keys( seastar::future<> PGBackend::omap_set_vals( ObjectState& os, const OSDOp& osd_op, - ceph::os::Transaction& txn) + ceph::os::Transaction& txn, + osd_op_params_t& osd_op_params) { maybe_create_new_object(os, txn); @@ -628,6 +645,7 @@ seastar::future<> PGBackend::omap_set_vals( //ctx->delta_stats.num_wr_kb += shift_round_up(to_set_bl.length(), 10); os.oi.set_flag(object_info_t::FLAG_OMAP); os.oi.clear_omap_digest(); + osd_op_params.clean_regions.mark_omap_dirty(); return seastar::now(); } diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index 289c67f27bd6..5753a2eb5eda 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -76,11 +76,13 @@ public: seastar::future<> write( ObjectState& os, const OSDOp& osd_op, - ceph::os::Transaction& trans); + ceph::os::Transaction& trans, + osd_op_params_t& osd_op_params); seastar::future<> writefull( ObjectState& os, const OSDOp& osd_op, - ceph::os::Transaction& trans); + ceph::os::Transaction& trans, + osd_op_params_t& osd_op_params); seastar::future mutate_object( std::set pg_shards, crimson::osd::ObjectContextRef &&obc, @@ -125,7 +127,8 @@ public: seastar::future<> omap_set_vals( ObjectState& os, const OSDOp& osd_op, - ceph::os::Transaction& trans); + ceph::os::Transaction& trans, + osd_op_params_t& osd_op_params); seastar::future omap_get_header( crimson::os::CollectionRef& c, const ghobject_t& oid);