mirror of
https://github.com/ceph/ceph
synced 2026-08-02 07:03:18 +00:00
crimson/seastore: keep on-page checksum in sync after merge_content_to
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>
This commit is contained in:
parent
57f86c05a0
commit
f7b898ab6c
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user