From: Kefu Chai Date: Fri, 21 Aug 2020 05:08:42 +0000 (+0800) Subject: crimson/osd: update oi.size after truncating an object X-Git-Tag: v16.1.0~1347^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=709ed943cc8bac8ba34c94fd6fc9ceab445c440b;p=ceph.git crimson/osd: update oi.size after truncating an object * update oi.size if object size changes after the object is truncated * do not add a truncate op to trasaction of the size of object does not change because of truncate op. Signed-off-by: Kefu Chai --- diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index c14c8c52213e..38ac951a3e1d 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -471,13 +471,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); - } + 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; @@ -607,21 +607,27 @@ PGBackend::write_ertr::future<> PGBackend::truncate( } } maybe_create_new_object(os, txn); - txn.truncate(coll->get_cid(), - ghobject_t{os.oi.soid}, op.extent.offset); - if (os.oi.size > op.extent.offset) { - // TODO: modified_ranges.union_of(trim); - osd_op_params.clean_regions.mark_data_region_dirty(op.extent.offset, - os.oi.size - op.extent.offset); - } else if (os.oi.size < op.extent.offset) { - osd_op_params.clean_regions.mark_data_region_dirty(os.oi.size, + if (os.oi.size != op.extent.offset) { + txn.truncate(coll->get_cid(), + ghobject_t{os.oi.soid}, op.extent.offset); + if (os.oi.size > op.extent.offset) { + // TODO: modified_ranges.union_of(trim); + osd_op_params.clean_regions.mark_data_region_dirty( + op.extent.offset, + os.oi.size - op.extent.offset); + } else { + // os.oi.size < op.extent.offset + osd_op_params.clean_regions.mark_data_region_dirty( + os.oi.size, op.extent.offset - os.oi.size); + } + os.oi.size = op.extent.offset; + os.oi.clear_data_digest(); } // TODO: truncate_update_size_and_usage() // TODO: ctx->delta_stats.num_wr++; // ---- // do no set exists, or we will break above DELETE -> TRUNCATE munging. - os.oi.clear_data_digest(); return write_ertr::now(); }