From 8728464364c314cf7120dc8c3d8e71b98a5d2e00 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 23 Jul 2018 10:07:55 -0500 Subject: [PATCH] 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 (cherry picked from commit 49207a6cb388446361aafacfaa863d66dd452ded) # Conflicts: # src/osd/PrimaryLogPG.cc - one of the do_read() cases moved - osd->osd_skip_data_digest (observed), not g_conf->... --- src/osd/PrimaryLogPG.cc | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index ffadcde38c8d9..eafd3a32b1c1e 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -5082,6 +5082,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() && + osd->osd_skip_data_digest; auto& op = osd_op.op; if (op.checksum.chunk_size > 0) { @@ -5149,7 +5151,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; } @@ -5297,6 +5300,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() && + osd->osd_skip_data_digest; auto& oi = ctx->new_obs.oi; uint64_t size = oi.size; @@ -5321,7 +5326,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; } @@ -5379,6 +5385,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() && + osd->osd_skip_data_digest; // are we beyond truncate_size? if ( (seq < op.extent.truncate_seq) && @@ -5409,7 +5417,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( @@ -5427,7 +5436,8 @@ int PrimaryLogPG::do_read(OpContext *ctx, OSDOp& osd_op) { int r = pgbackend->objects_read_sync( soid, op.extent.offset, op.extent.length, op.flags, &osd_op.outdata); // whole object? can we verify the checksum? - if (r >= 0 && op.extent.length == oi.size && oi.is_data_digest()) { + if (!skip_data_digest && + r >= 0 && 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 @@ -5462,6 +5472,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() && + osd->osd_skip_data_digest; if (op.extent.truncate_seq) { dout(0) << "sparse_read does not support truncation sequence " << dendl; @@ -5572,7 +5584,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 @@ -8516,6 +8529,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() && + osd->osd_skip_data_digest; + try { decode(cursor, bp); decode(out_max, bp); @@ -8546,7 +8562,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; } -- 2.39.5