Skip to content

Commit 3265158

Browse files
committed
MDEV-21133: Alignment hints for ROW_FORMAT=COMPRESSED
page_zip_compress(), page_zip_decompress_low(), page_zip_reorganize(): Make use of memcpy_aligned() and memset_aligned(), so that some operations can be translated more efficiently. No difference was observed for AMD64 on GCC 9.2.1. But, such hints could enable more efficient code on less common instruction set architectures, such as 32-bit ARM, POWER or MIPS.
1 parent 5a00792 commit 3265158

File tree

1 file changed

+32
-26
lines changed

1 file changed

+32
-26
lines changed

storage/innobase/page/page0zip.cc

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1544,14 +1544,15 @@ page_zip_compress(
15441544
page_zip->n_blobs = unsigned(n_blobs);
15451545
/* Copy those header fields that will not be written
15461546
in buf_flush_init_for_writing() */
1547-
memcpy(page_zip->data + FIL_PAGE_PREV, page + FIL_PAGE_PREV,
1548-
FIL_PAGE_LSN - FIL_PAGE_PREV);
1549-
memcpy(page_zip->data + FIL_PAGE_TYPE, page + FIL_PAGE_TYPE, 2);
1550-
memcpy(page_zip->data + FIL_PAGE_DATA, page + FIL_PAGE_DATA,
1551-
PAGE_DATA - FIL_PAGE_DATA);
1547+
memcpy_aligned<8>(page_zip->data + FIL_PAGE_PREV, page + FIL_PAGE_PREV,
1548+
FIL_PAGE_LSN - FIL_PAGE_PREV);
1549+
memcpy_aligned<2>(page_zip->data + FIL_PAGE_TYPE, page + FIL_PAGE_TYPE,
1550+
2);
1551+
memcpy_aligned<2>(page_zip->data + FIL_PAGE_DATA, page + FIL_PAGE_DATA,
1552+
PAGE_DATA - FIL_PAGE_DATA);
15521553
/* Copy the rest of the compressed page */
1553-
memcpy(page_zip->data + PAGE_DATA, buf,
1554-
page_zip_get_size(page_zip) - PAGE_DATA);
1554+
memcpy_aligned<2>(page_zip->data + PAGE_DATA, buf,
1555+
page_zip_get_size(page_zip) - PAGE_DATA);
15551556
mem_heap_free(heap);
15561557
#ifdef UNIV_ZIP_DEBUG
15571558
ut_a(page_zip_validate(page_zip, page, index));
@@ -3021,7 +3022,7 @@ page_zip_decompress_low(
30213022

30223023
if (all) {
30233024
/* Copy the page header. */
3024-
memcpy(page, page_zip->data, PAGE_DATA);
3025+
memcpy_aligned<2>(page, page_zip->data, PAGE_DATA);
30253026
} else {
30263027
/* Check that the bytes that we skip are identical. */
30273028
#if defined UNIV_DEBUG || defined UNIV_ZIP_DEBUG
@@ -3034,9 +3035,10 @@ page_zip_decompress_low(
30343035
#endif /* UNIV_DEBUG || UNIV_ZIP_DEBUG */
30353036

30363037
/* Copy the mutable parts of the page header. */
3037-
memcpy(page, page_zip->data, FIL_PAGE_TYPE);
3038-
memcpy(PAGE_HEADER + page, PAGE_HEADER + page_zip->data,
3039-
PAGE_LEVEL - PAGE_N_DIR_SLOTS);
3038+
memcpy_aligned<8>(page, page_zip->data, FIL_PAGE_TYPE);
3039+
memcpy_aligned<2>(PAGE_HEADER + page,
3040+
PAGE_HEADER + page_zip->data,
3041+
PAGE_LEVEL - PAGE_N_DIR_SLOTS);
30403042

30413043
#if defined UNIV_DEBUG || defined UNIV_ZIP_DEBUG
30423044
/* Check that the page headers match after copying. */
@@ -3070,8 +3072,9 @@ page_zip_decompress_low(
30703072
& PAGE_ZIP_DIR_SLOT_MASK);
30713073
}
30723074
memcpy(page + PAGE_NEW_INFIMUM, infimum_data, sizeof infimum_data);
3073-
memcpy(page + (PAGE_NEW_SUPREMUM - REC_N_NEW_EXTRA_BYTES + 1),
3074-
supremum_extra_data, sizeof supremum_extra_data);
3075+
memcpy_aligned<4>(PAGE_NEW_SUPREMUM - REC_N_NEW_EXTRA_BYTES + 1
3076+
+ page, supremum_extra_data,
3077+
sizeof supremum_extra_data);
30753078

30763079
page_zip_set_alloc(&d_stream, heap);
30773080

@@ -4737,8 +4740,8 @@ page_zip_reorganize(
47374740
index, mtr);
47384741

47394742
/* Copy the PAGE_MAX_TRX_ID or PAGE_ROOT_AUTO_INC. */
4740-
memcpy(page + (PAGE_HEADER + PAGE_MAX_TRX_ID),
4741-
temp_page + (PAGE_HEADER + PAGE_MAX_TRX_ID), 8);
4743+
memcpy_aligned<8>(page + (PAGE_HEADER + PAGE_MAX_TRX_ID),
4744+
temp_page + (PAGE_HEADER + PAGE_MAX_TRX_ID), 8);
47424745
/* PAGE_MAX_TRX_ID must be set on secondary index leaf pages. */
47434746
ut_ad(dict_index_is_clust(index) || !page_is_leaf(temp_page)
47444747
|| page_get_max_trx_id(page) != 0);
@@ -4806,21 +4809,24 @@ page_zip_copy_recs(
48064809
PAGE_MAX_TRX_ID. Skip the rest of the page header and
48074810
trailer. On the compressed page, there is no trailer. */
48084811
compile_time_assert(PAGE_MAX_TRX_ID + 8 == PAGE_HEADER_PRIV_END);
4809-
memcpy(PAGE_HEADER + page, PAGE_HEADER + src,
4810-
PAGE_HEADER_PRIV_END);
4811-
memcpy(PAGE_DATA + page, PAGE_DATA + src,
4812-
srv_page_size - PAGE_DATA - FIL_PAGE_DATA_END);
4813-
memcpy(PAGE_HEADER + page_zip->data, PAGE_HEADER + src_zip->data,
4814-
PAGE_HEADER_PRIV_END);
4815-
memcpy(PAGE_DATA + page_zip->data, PAGE_DATA + src_zip->data,
4816-
page_zip_get_size(page_zip) - PAGE_DATA);
4812+
memcpy_aligned<2>(PAGE_HEADER + page, PAGE_HEADER + src,
4813+
PAGE_HEADER_PRIV_END);
4814+
memcpy_aligned<2>(PAGE_DATA + page, PAGE_DATA + src,
4815+
srv_page_size - (PAGE_DATA + FIL_PAGE_DATA_END));
4816+
memcpy_aligned<2>(PAGE_HEADER + page_zip->data,
4817+
PAGE_HEADER + src_zip->data,
4818+
PAGE_HEADER_PRIV_END);
4819+
memcpy_aligned<2>(PAGE_DATA + page_zip->data,
4820+
PAGE_DATA + src_zip->data,
4821+
page_zip_get_size(page_zip) - PAGE_DATA);
48174822

48184823
if (dict_index_is_clust(index)) {
48194824
/* Reset the PAGE_ROOT_AUTO_INC field when copying
48204825
from a root page. */
4821-
memset(PAGE_HEADER + PAGE_ROOT_AUTO_INC + page, 0, 8);
4822-
memset(PAGE_HEADER + PAGE_ROOT_AUTO_INC + page_zip->data,
4823-
0, 8);
4826+
memset_aligned<8>(PAGE_HEADER + PAGE_ROOT_AUTO_INC
4827+
+ page, 0, 8);
4828+
memset_aligned<8>(PAGE_HEADER + PAGE_ROOT_AUTO_INC
4829+
+ page_zip->data, 0, 8);
48244830
} else {
48254831
/* The PAGE_MAX_TRX_ID must be nonzero on leaf pages
48264832
of secondary indexes, and 0 on others. */

0 commit comments

Comments
 (0)