Skip to content

PS10083 8.4 fix apple build#5943

Closed
jankowsk wants to merge 1 commit into
percona:8.4from
jankowsk:PS10083-8.4-fix_apple_build
Closed

PS10083 8.4 fix apple build#5943
jankowsk wants to merge 1 commit into
percona:8.4from
jankowsk:PS10083-8.4-fix_apple_build

Conversation

@jankowsk
Copy link
Copy Markdown
Contributor

The static_assert(sizeof(thread_group_t) == 512, ...) in sql/threadpool_unix.cc has existed since PS 8.0.12 and was hand-tuned against the Linux/glibc layout of the embedded mysql_mutex_t and PSI structures. PS-10083 ("Add more statistics for threadpool", merged 2026-03-11 between 9.6.0 and 9.7.0) inserted two LiveStats members into thread_group_t and adjusted the trailing 'char padding[]' from 328 to 248 to keep the Linux total at exactly 512.

LiveStats itself is platform-neutral (5 PODs, 40 bytes), but mysql_mutex_t expands by ~128 bytes on macOS / Apple clang + libc++, so on that platform the struct lands at 640 bytes and breaks the build:

sql/threadpool_unix.cc:155:1: error: static assertion failed due
    to requirement 'sizeof(thread_group_t) == 512'

The false-sharing guarantee comes from alignas(128); what matters is that the struct occupies a whole number of 128-byte cache lines, not that it is exactly 512 bytes (640 is also a multiple of 128). Replace the equality check with 'sizeof % 128 == 0' so Linux/glibc, libc++ on macOS, and any future libstdc++ layout drift all pass while the no-false-sharing invariant remains enforced.

The static_assert(sizeof(thread_group_t) == 512, ...) in
sql/threadpool_unix.cc has existed since PS 8.0.12 and was hand-tuned
against the Linux/glibc layout of the embedded mysql_mutex_t and PSI
structures. PS-10083 ("Add more statistics for threadpool", merged
2026-03-11 between 9.6.0 and 9.7.0) inserted two LiveStats members into
thread_group_t and adjusted the trailing 'char padding[]' from 328 to
248 to keep the Linux total at exactly 512.

LiveStats itself is platform-neutral (5 PODs, 40 bytes), but
mysql_mutex_t expands by ~128 bytes on macOS / Apple clang + libc++,
so on that platform the struct lands at 640 bytes and breaks the
build:

    sql/threadpool_unix.cc:155:1: error: static assertion failed due
        to requirement 'sizeof(thread_group_t) == 512'

The false-sharing guarantee comes from alignas(128); what matters is
that the struct occupies a whole number of 128-byte cache lines, not
that it is exactly 512 bytes (640 is also a multiple of 128). Replace
the equality check with 'sizeof % 128 == 0' so Linux/glibc, libc++
on macOS, and any future libstdc++ layout drift all pass while the
no-false-sharing invariant remains enforced.
@jankowsk jankowsk requested a review from lukin-oleksiy May 12, 2026 07:29
@jankowsk
Copy link
Copy Markdown
Contributor Author

We decided to include this in #5942

@jankowsk jankowsk closed this May 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants