OPTION(osd_op_num_threads_per_shard, OPT_INT, 2)
OPTION(osd_op_num_shards, OPT_INT, 5)
+OPTION(osd_read_eio_on_bad_digest, OPT_BOOL, true) // return EIO if object digest is bad
+
// Only use clone_overlap for recovery if there are fewer than
// osd_recover_clone_overlap_limit entries in the overlap set
OPTION(osd_recover_clone_overlap_limit, OPT_INT, 10)
}
dout(10) << " read got " << r << " / " << op.extent.length
<< " bytes from obj " << soid << dendl;
+
+ // whole object? can we verify the checksum?
+ if (result >= 0 &&
+ op.extent.offset == 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
+ << " full-object read crc " << crc
+ << " != expected " << oi.data_digest
+ << std::dec << " on " << soid;
+ // FIXME fall back to replica or something?
+ if (g_conf->osd_read_eio_on_bad_digest)
+ result = -EIO;
+ }
+ }
}
if (first_read) {
first_read = false;