Usually our 4.0.40 (aka ‘four oh forever’) build doesn’t crash, and if it does, it is always hardware problem or kernel/filesystem bug, or whatever else. So, we have a very calm life, until crashes start to happen…
As we used to run RAID0, a disk failure usually means system wipe and reinstall once fixed – so our machines all run relatively new kernels and OS (except some boxes which just refuse to die ;-), and we’re usually way more ahead than all the bunch of conservative RHEL users.
We had one machine which was reporting CPU/northbridge/RAM problems, and every MySQL crash was accompanied by MCEs, so after replacing RAM, CPU and motherboard itself, we just sent the machine back to service, and asked them to do whatever it takes to fix it.
So, this machine, with proud name of ‘db1′ comes and after entering the service starts crashing every day. I reduced InnoDB log file size, to make recovery faster, and would run it under ‘gdb’. Stacktrace on crash pointed to check-summing (aka folding) bunch of functions, so initial assumption was ‘here we get memory errors again’. So, for a while I thought that ‘db1′ needs some more hardware work, and just left it as is, as we were waiting for new database hardware batch to deploy and there was a bit more work around.
We started deploying new database hardware, and it started crashing every few hours instead of every few days. Here again, reduced InnoDB transaction log size and gdb attached allowed to trap the segfault, and it was pointing again to the very same adaptive hash key calculation (folding!).
Unfortunately, it was non-trivial chain of inlined functions (InnoDB is full of these), so I built ‘-g -fno-inline’ build, and was keenly waiting for a crash to happen, so I could investigate what and where gets corrupted. It did not. Then I looked at our zoo just to find out we have lots of different builds. On one hand it was a bit messy, on another hand, it showed few conclusions:
- Only Opterons crashed (though there’re like three year gap between revisions)
- Only Ubuntu 8.04 crashed
- Only GCC-4.2 build crashed
After thinking a bit that:
- We have Opterons that don’t crash (older gcc builds)
- Xeons didn’t crash.
- We have Ubuntu 8.04 that don’t crash (they either are Xeons or run older gcc-4.1 builds)
- We have GCC-4.2 builds that run nice (all – on Xeons, all on 8.04 Ubuntu).
The next test was taking gcc-4.1 builds and running them on our new machines. No crash for next two days.
One new machine did have gcc-4.2 build and didn’t crash for few days of replicate-only load, but once it got some parallel load, it crashed in next few hours.
I tried to chat about it on Freenode’s #gcc, and I got just:
noshadow> domas: almost everything that fails when optimized (as inlining opens many new optimisation possibilities) noshadow> i.e: const misuse, relying on undefined behaviour, breaking aliasing rules, ... domas> interesting though, I hit it just with gcc 4.2.3 and opterons only noshadow> domas: that makes it more likely that it is caused by optimisation unveiling programming bugs
In the end I know, that there’s programming bug in ancient code using inlined functions, that causes memory corruption in multithreaded load if compiled with gcc-4.2 and ran on Opteron. As for now it is our fork, pretty much everyone will point at each other and won’t try to fix it :)
And me? I can always do:
env CC=gcc-4.1 CXX=g++-4.1 ./configure ...
I’m too lazy to learn how to disassemble and check compiled code differences, especially when every test takes few hours. I already destroyed my weekend with this :-) I’m just waiting for people to hit this with stock mysql – would be one of those things we love debugging ;-)