]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: Check CRC when possile in build_push_op()
authorDavid Zafman <dzafman@redhat.com>
Thu, 9 Aug 2018 23:11:00 +0000 (16:11 -0700)
committerDavid Zafman <dzafman@redhat.com>
Wed, 15 Aug 2018 22:45:44 +0000 (15:45 -0700)
Fixes: http://tracker.ceph.com/issues/25084
Signed-off-by: David Zafman <dzafman@redhat.com>
src/osd/ReplicatedBackend.cc

index 62f89eba14effc966cbb58d8f6a5df59f00536ad..845ebc0b3296827b4b5b3b0d02e4da3d71e2368e 100644 (file)
@@ -1828,6 +1828,7 @@ int ReplicatedBackend::build_push_op(const ObjectRecoveryInfo &recovery_info,
           << dendl;
 
   eversion_t v  = recovery_info.version;
+  object_info_t oi;
   if (progress.first) {
     int r = store->omap_get_header(ch, ghobject_t(recovery_info.soid), &out_op->omap_header);
     if(r < 0) {
@@ -1842,7 +1843,6 @@ int ReplicatedBackend::build_push_op(const ObjectRecoveryInfo &recovery_info,
 
     // Debug
     bufferlist bv = out_op->attrset[OI_ATTR];
-    object_info_t oi;
     try {
      auto bliter = bv.cbegin();
      decode(oi, bliter);
@@ -1956,6 +1956,17 @@ int ReplicatedBackend::build_push_op(const ObjectRecoveryInfo &recovery_info,
     }
     out_op->data.claim_append(bit);
   }
+  if (progress.first && out_op->data_included.begin().get_start() == 0 &&
+      out_op->data.length() == oi.size && oi.is_data_digest()) {
+    uint32_t crc = out_op->data.crc32c(-1);
+    if (oi.data_digest != crc) {
+      dout(0) << __func__ << " " << coll << std::hex
+                         << " full-object read crc 0x" << crc
+                         << " != expected 0x" << oi.data_digest
+                         << std::dec << " on " << recovery_info.soid << dendl;
+      return -EIO;
+    }
+  }
 
   if (new_progress.is_complete(recovery_info)) {
     new_progress.data_complete = true;