Re: Non-reproducible AIO failure
Konstantin Knizhnik <knizhnik@garret.ru>
From: Konstantin Knizhnik <knizhnik@garret.ru>
To: Thomas Munro <thomas.munro@gmail.com>, Andres Freund <andres@anarazel.de>
Cc: pgsql-hackers@lists.postgresql.org
Date: 2025-06-10T14:28:11Z
Lists: pgsql-hackers
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
aio: Stop using enum bitfields due to bad code generation
- ce161b194e84 18.0 landed
- 5865150b6d53 19 (unreleased) landed
-
amcheck: Fix posting tree checks in gin_index_check()
- 0cf205e122ae 18.0 cited
-
aio: Add missing memory barrier when waiting for IO handle
- e9a3615a5224 18.0 landed
On 09/06/2025 2:05 am, Thomas Munro wrote: > On Sat, Jun 7, 2025 at 6:47 AM Andres Freund <andres@anarazel.de> wrote: >> On 2025-06-06 14:03:12 +0300, Konstantin Knizhnik wrote: >>> There is really essential difference in code generated by clang 15 (working) >>> and 16 (not working). >> There also are code gen differences between upstream clang 17 and apple's >> clang, which is based on llvm 17 as well (I've updated the toolchain, it >> repros with that as well). > Just for the record, Apple clang 17 (self-reported clobbered version) > is said to be based on LLVM 19[1]. For a long time it was off by one > but tada now it's apparently two. Might be relevant if people are > comparing generated code up that close.... > > . o O (I wonder if one could corroborate that by running "strings" on > upstream clang binaries (as compiled by MacPorts/whatever) for each > major version and finding new strings, ie strings that don't appear in > earlier major versions, and then seeing which ones are present in > Apple's clang binaries... What a silly problem.) > > [1] https://en.wikipedia.org/wiki/Xcode#Xcode_15.0_-_16.x_(since_visionOS_support) Some updates: I was able to reproduce the problem at my Mac with old clang (15.0) but only with disabled optimization (CFLAGS=-O0). So very unlikely it is bug in compiler. Why it is better reproduced in debug build? May be because of timing. Or may be because without optimization compiler is doing stupid things: loads all three bitfields from memory to register (one half word+one byte), then does some manipulations with this register and writes it back to memory. Can register somehow be clobbered between read and write (for example by signal handler)? Very unlikely... So still do not have any good hypothesis. But with bitfields replaced with uint8 the bug is not reproduced any more. May be just do this change (which seems to be good thing in any case)?