]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/Transaction: initialize unused fields in TransactionData 65075/head
authorKefu Chai <tchaikov@gmail.com>
Mon, 18 Aug 2025 02:41:07 +0000 (10:41 +0800)
committerKefu Chai <tchaikov@gmail.com>
Wed, 20 Aug 2025 02:57:09 +0000 (10:57 +0800)
Initialize unused1, unused2, and unused3 fields to zero in TransactionData
to ensure consistent encoding/decoding behavior.

Background:
In commit a0c9fec7, we updated TransactionData encoding/decoding and bumped
the Transaction encoding version from 9 to 10. As part of this change, we
renamed three fields to mark them as unused:
- largest_data_len → unused1
- largest_data_off → unused2
- largest_data_off_in_data_bl → unused3

The move constructor was also updated to stop setting these fields, leaving
them uninitialized after move operations.

Problem:
This worked with existing tests because check-generated.sh reused struct
instances, preserving stale values across encode/decode cycles. However,
an upcoming test change will stop reusing instances and compare hexdumps
of encoded/re-encoded values to verify consistency. Uninitialized fields
cause these comparisons to fail due to garbage values.

Solution:
Initialize the unused fields to zero in the move constructor. This preserves
existing behavior while ensuring consistent encoding. These fields can be
removed entirely in a future change.

Signed-off-by: Kefu Chai <tchaikov@gmail.com>
src/os/Transaction.h

index 91c7811f11542fc75aba115c0375f221d77f076d..dc0c03949e3577658f6f9e840d699b7c144f23f7 100644 (file)
@@ -195,6 +195,7 @@ public:
     TransactionData(TransactionData&& other) noexcept :
       ops(other.ops),
       fadvise_flags(other.fadvise_flags) {
+      unused1 = unused2 = unused3 = 0;
       other.ops = 0;
       other.fadvise_flags = 0;
     }