From: Sage Weil Date: Sat, 14 Jul 2018 18:12:54 +0000 (-0500) Subject: osd: apply osd_skip_data_digest to read operations X-Git-Tag: v12.2.7~1^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=49207a6cb388446361aafacfaa863d66dd452ded;p=ceph.git osd: apply osd_skip_data_digest to read operations If we would skip updating data digests, apply that same decision to read operations as well. Signed-off-by: Sage Weil --- diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 8ede71346e1a..a4e4686e5450 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -4532,6 +4532,8 @@ int PrimaryLogPG::do_checksum(OpContext *ctx, OSDOp& osd_op, bufferlist::iterator *bl_it) { dout(20) << __func__ << dendl; + bool skip_data_digest = osd->store->has_builtin_csum() && + g_conf->osd_skip_data_digest; auto& op = osd_op.op; if (op.checksum.chunk_size > 0) { @@ -4586,7 +4588,8 @@ int PrimaryLogPG::do_checksum(OpContext *ctx, OSDOp& osd_op, // If there is a data digest and it is possible we are reading // entire object, pass the digest. boost::optional maybe_crc; - if (oi.is_data_digest() && op.checksum.offset == 0 && + if (!skip_data_digest && + oi.is_data_digest() && op.checksum.offset == 0 && op.checksum.length >= oi.size) { maybe_crc = oi.data_digest; } @@ -4734,6 +4737,8 @@ int PrimaryLogPG::do_extent_cmp(OpContext *ctx, OSDOp& osd_op) { dout(20) << __func__ << dendl; ceph_osd_op& op = osd_op.op; + bool skip_data_digest = osd->store->has_builtin_csum() && + g_conf->osd_skip_data_digest; auto& oi = ctx->new_obs.oi; uint64_t size = oi.size; @@ -4758,7 +4763,8 @@ int PrimaryLogPG::do_extent_cmp(OpContext *ctx, OSDOp& osd_op) // If there is a data digest and it is possible we are reading // entire object, pass the digest. boost::optional maybe_crc; - if (oi.is_data_digest() && op.checksum.offset == 0 && + if (!skip_data_digest && + oi.is_data_digest() && op.checksum.offset == 0 && op.checksum.length >= oi.size) { maybe_crc = oi.data_digest; } @@ -4816,6 +4822,8 @@ int PrimaryLogPG::do_read(OpContext *ctx, OSDOp& osd_op) { __u32 seq = oi.truncate_seq; uint64_t size = oi.size; bool trimmed_read = false; + bool skip_data_digest = osd->store->has_builtin_csum() && + g_conf->osd_skip_data_digest; // are we beyond truncate_size? if ( (seq < op.extent.truncate_seq) && @@ -4844,7 +4852,8 @@ int PrimaryLogPG::do_read(OpContext *ctx, OSDOp& osd_op) { // If there is a data digest and it is possible we are reading // entire object, pass the digest. FillInVerifyExtent will // will check the oi.size again. - if (oi.is_data_digest() && op.extent.offset == 0 && + if (!skip_data_digest && + oi.is_data_digest() && op.extent.offset == 0 && op.extent.length >= oi.size) maybe_crc = oi.data_digest; ctx->pending_async_reads.push_back( @@ -4874,7 +4883,8 @@ int PrimaryLogPG::do_read(OpContext *ctx, OSDOp& osd_op) { << " bytes from obj " << soid << dendl; // whole object? can we verify the checksum? - if (op.extent.length == oi.size && oi.is_data_digest()) { + if (!skip_data_digest && + op.extent.length == oi.size && oi.is_data_digest()) { uint32_t crc = osd_op.outdata.crc32c(-1); if (oi.data_digest != crc) { osd->clog->error() << info.pgid << std::hex @@ -4899,6 +4909,8 @@ int PrimaryLogPG::do_sparse_read(OpContext *ctx, OSDOp& osd_op) { auto& op = osd_op.op; auto& oi = ctx->new_obs.oi; auto& soid = oi.soid; + bool skip_data_digest = osd->store->has_builtin_csum() && + g_conf->osd_skip_data_digest; if (op.extent.truncate_seq) { dout(0) << "sparse_read does not support truncation sequence " << dendl; @@ -5012,7 +5024,8 @@ int PrimaryLogPG::do_sparse_read(OpContext *ctx, OSDOp& osd_op) { // Maybe at first, there is no much whole objects. With continued use, more // and more whole object exist. So from this point, for spare-read add // checksum make sense. - if (total_read == oi.size && oi.is_data_digest()) { + if (!skip_data_digest && + total_read == oi.size && oi.is_data_digest()) { uint32_t crc = data_bl.crc32c(-1); if (oi.data_digest != crc) { osd->clog->error() << info.pgid << std::hex @@ -7836,6 +7849,9 @@ int PrimaryLogPG::do_copy_get(OpContext *ctx, bufferlist::iterator& bp, int result = 0; object_copy_cursor_t cursor; uint64_t out_max; + bool skip_data_digest = osd->store->has_builtin_csum() && + g_conf->osd_skip_data_digest; + try { ::decode(cursor, bp); ::decode(out_max, bp); @@ -7870,7 +7886,7 @@ int PrimaryLogPG::do_copy_get(OpContext *ctx, bufferlist::iterator& bp, } else { reply_obj.snap_seq = obc->ssc->snapset.seq; } - if (oi.is_data_digest()) { + if (!skip_data_digest && oi.is_data_digest()) { reply_obj.flags |= object_copy_data_t::FLAG_DATA_DIGEST; reply_obj.data_digest = oi.data_digest; }