Details
-
Bug
-
Status: Closed (View Workflow)
-
Major
-
Resolution: Fixed
-
10.5.2
Description
MDEV-12353 deliberately tries to avoid memory alignment overhead in log_phys_t, storing the stream of log records bytes straight after a header object. But, the code triggers WITH_UBSAN errors:
10.5 e9b3d44c6eef3d7b4944d724ba597035798324ad |
storage/innobase/log/log0recv.cc:118:71: runtime error: member call on null pointer of type 'struct log_phys_t'
|
storage/innobase/log/log0recv.cc:103:50: runtime error: member access within null pointer of type 'struct log_phys_t'
|
It turns out that we can move the uint16_t len data member to be part of the byte stream that immediately follows the object, and use memcpy to access that. Even on systems whose ABI does not allow unaligned memory access (such as ARM or POWER) there should be no additional overhead (no actual call to memcpy()) if we use my_assume_aligned to explicitly declare the alignment.
The motivation of this tight packing is related to MDEV-19176 and MDEV-21351, and we definitely do not want to waste 6 bytes per redo log snippet due to uint16_t len being padded to 8 bytes.
Attachments
Issue Links
- is caused by
-
MDEV-12353 Efficient InnoDB redo log record format
- Closed