]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson: keep track of clean_regions/dirty_regions of modifications
authorXuehan Xu <xxhdx1985126@163.com>
Tue, 31 Mar 2020 10:10:33 +0000 (18:10 +0800)
committerXuehan Xu <xxhdx1985126@163.com>
Sun, 26 Apr 2020 07:46:35 +0000 (15:46 +0800)
Signed-off-by: Xuehan Xu <xxhdx1985126@163.com>
src/crimson/osd/ops_executer.cc
src/crimson/osd/ops_executer.h
src/crimson/osd/osd_operations/osdop_params.h
src/crimson/osd/pg.cc
src/crimson/osd/pg_backend.cc
src/crimson/osd/pg_backend.h

index 039d39d1730c79e3c54dafc123c2745b01674ad1..19a3292118c3329d91a7e5de5b70c1663a5afc3a 100644 (file)
@@ -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
index 93fb96dd6e4b663ae69940d59c9811b92226941d..2e9e74f4f7434c05c924eb3a10176983f6b8f108 100644 (file)
@@ -84,6 +84,7 @@ private:
   PG& pg;
   PGBackend& backend;
   Ref<MOSDOp> msg;
+  std::optional<osd_op_params_t> osd_op_params;
   bool user_modify = false;
   ceph::os::Transaction txn;
 
@@ -225,20 +226,22 @@ auto OpsExecuter::with_effect_on_obc(
 template <typename Func>
 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<Func>(f)(std::move(txn), std::move(obc), std::move(osd_op_params));
+    return std::forward<Func>(f)(std::move(txn), std::move(obc), std::move(*osd_op_params));
   }
-  return std::forward<Func>(f)(std::move(txn), std::move(obc), std::move(osd_op_params)).safe_then([this] {
+  return std::forward<Func>(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();
index b50fb2b5f784495fa7b6e9581e425bb025af9d75..a0bd9dcbb3543bde6b71a31ede4fb98d8e910248 100644 (file)
@@ -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<MOSDOp>&& req) : req(req) {}
   osd_op_params_t(Ref<MOSDOp>&& req, eversion_t at_version, eversion_t pg_trim_to,
       eversion_t mlcod, eversion_t lc, version_t user_at_version) :
index 8ee14f17741a382048fa0fb855a57f17090af2e0..88a6b5b9e5280f2efb7fbbccaf2e6ab30c771901 100644 (file)
@@ -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);
 
index a079ff5e9991533ab02c2e5e7f458d295455c014..a308c41557c4c2463ce80bcd295fa02a02172a77 100644 (file)
@@ -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();
 }
 
index 289c67f27bd6ff6eae5b324d36fb6322d0fb6fcd..5753a2eb5edaeb0cbbc16ca9a6cc13ca5a5a0fdc 100644 (file)
@@ -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<crimson::osd::acked_peers_t> mutate_object(
     std::set<pg_shard_t> 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<ceph::bufferlist> omap_get_header(
     crimson::os::CollectionRef& c,
     const ghobject_t& oid);