While nosing around the problem areas, I think I've found yet another
issue here. The global bool InRecovery is only maintained correctly
in the startup process, which wasn't a problem before 8.4. However,
if we are making the bgwriter execute the end-of-recovery checkpoint,
there are multiple places where it is tested that are going to be
executed by bgwriter. I think (but am not 100% sure) that these
are all the at-risk references:
XLogFlush
CheckPointMultiXact
CreateCheckPoint (2 places)
Heikki's latest patch deals with the tests in CreateCheckPoint (rather
klugily IMO) but not the others. I think it might be better to fix
things so that InRecovery is maintained correctly in the bgwriter too.
regards, tom lane