]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/seastore: keep on-page checksum in sync after merge_content_to 70418/head
authorKautilya Tripathi <kautilya.tripathi@ibm.com>
Wed, 22 Jul 2026 06:01:51 +0000 (11:31 +0530)
committerKautilya Tripathi <kautilya.tripathi@ibm.com>
Wed, 22 Jul 2026 06:02:25 +0000 (11:32 +0530)
When a rewrite transaction publishes via no-conflict handoff, merge_content_to
can update an already CRC-stamped initial-pending fixedkv page (copy-dest of a
concurrent split). It refreshed last_committed_crc but not the in-extent phy
checksum, so the page could be written with new content and a stale stamp.
Debug asserts only compare last_committed_crc to calc_crc32c(), so the mismatch
survived until a later cold read aborted with "fixedkv extent checksum
inconsistent".

Recalculate the CRC and call update_in_extent_chksum_field together in both
LBALeafNode and FixedKVInternalNode merge_content_to, matching
apply_delta_and_adjust_crc / update_lba_mappings.

Fixes: https://tracker.ceph.com/issues/77022
Signed-off-by: Kautilya Tripathi <kautilya.tripathi@ibm.com>
src/crimson/os/seastore/btree/fixed_kv_node.h
src/crimson/os/seastore/lba/lba_btree_node.h

index 24475157938adb9e47cf91cb8ede2aeab978e793..5a729c705201d0d162544d4b10e0f8feaf3425db 100644 (file)
@@ -543,8 +543,10 @@ struct FixedKVInternalNode
       }
       if (pending_version.get_last_committed_crc()) {
         // if pending_version has already calculated its crc,
-        // calculate it again.
-        pending_version.set_last_committed_crc(pending_version.calc_crc32c());
+        // calculate it again and keep the on-page checksum in sync.
+        auto crc = pending_version.calc_crc32c();
+        pending_version.set_last_committed_crc(crc);
+        pending_version.update_in_extent_chksum_field(crc);
       }
     }
   }
index 7dad89038a3990daf82669d753667f6a81a16082..4513afdc4ef988796c0da23773030e6f932f5e3c 100644 (file)
@@ -394,8 +394,10 @@ struct LBALeafNode
     if (pending_version.is_initial_pending() &&
         pending_version.get_last_committed_crc()) {
       // if pending_version has already calculated its crc,
-      // calculate it again.
-      pending_version.set_last_committed_crc(pending_version.calc_crc32c());
+      // calculate it again and keep the on-page checksum in sync.
+      auto crc = pending_version.calc_crc32c();
+      pending_version.set_last_committed_crc(crc);
+      pending_version.update_in_extent_chksum_field(crc);
     }
     return modified;
   }