From d47055575a116d5212a252327d2332d6b61f98d6 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Thu, 6 Aug 2020 14:31:25 +0800 Subject: [PATCH] crimson/osd: support CEPH_OSD_OP_ZERO op Signed-off-by: Kefu Chai --- src/crimson/osd/ops_executer.cc | 4 ++++ src/crimson/osd/pg_backend.cc | 27 +++++++++++++++++++++++++++ src/crimson/osd/pg_backend.h | 5 +++++ 3 files changed, 36 insertions(+) diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index a313beaf348..d6e6fbc72d1 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -716,6 +716,10 @@ OpsExecuter::execute_osd_op(OSDOp& osd_op) osd_op_params = osd_op_params_t(); return backend.truncate(os, osd_op, txn, *osd_op_params); }, true); + case CEPH_OSD_OP_ZERO: + return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) { + return backend.zero(os, osd_op, txn, *osd_op_params); + }, true); case CEPH_OSD_OP_SETALLOCHINT: return osd_op_errorator::now(); case CEPH_OSD_OP_SETXATTR: diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index bb1e36c7684..fa78e139544 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -401,6 +401,33 @@ PGBackend::write_ertr::future<> PGBackend::truncate( return write_ertr::now(); } +PGBackend::write_ertr::future<> PGBackend::zero( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& txn, + osd_op_params_t& osd_op_params) +{ + if (!os.exists || os.oi.is_whiteout()) { + logger().debug("{} object dne, zero is a no-op", __func__); + return write_ertr::now(); + } + const ceph_osd_op& op = osd_op.op; + if (!is_offset_and_length_valid(op.extent.offset, op.extent.length)) { + return crimson::ct_error::file_too_large::make(); + } + assert(op.extent.length); + txn.zero(coll->get_cid(), + ghobject_t{os.oi.soid}, + op.extent.offset, + op.extent.length); + // TODO: modified_ranges.union_of(zeroed); + osd_op_params.clean_regions.mark_data_region_dirty(op.extent.offset, + op.extent.length); + // TODO: ctx->delta_stats.num_wr++; + os.oi.clear_data_digest(); + return write_ertr::now(); +} + seastar::future<> PGBackend::create( ObjectState& os, const OSDOp& osd_op, diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index dec58406eb3..47337622db7 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -93,6 +93,11 @@ public: const OSDOp& osd_op, ceph::os::Transaction& trans, osd_op_params_t& osd_op_params); + write_ertr::future<> zero( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& trans, + osd_op_params_t& osd_op_params); seastar::future mutate_object( std::set pg_shards, crimson::osd::ObjectContextRef &&obc, -- 2.47.3