So I now have a refactoring patch ready that I'd like to commit (the
attached two patches together), but to be honest, I have no idea why the second patch is so essential to performance. Thanks. I did some more tests with master, master+patch1, master+patch1+CRC refactoring, but I am not able to see any performance difference with pgbench (--no-vacuum, -t) and the test suite you provided, just some noise that barely changed performance.
Thanks for the confirmation. I'm really going crazy with benchmarking this. Sometimes I see a big difference, the next day it's gone.
The benchmark paradigms.
* Fixed XLogSaveBufferForHint. It didn't initialize BkpBlock struct, rendering it completely broken.
Note for other reviewers: that's represented by this addition in XLogSaveBufferForHint:
+ /* Make a BkpBlock struct representing the buffer */ + XLogFillBkpBlock(buffer, buffer_std, &bkpb)