Re: PANIC during crash recovery of a recently promoted standby - Mailing list pgsql-hackers
From | Michael Paquier |
---|---|
Subject | Re: PANIC during crash recovery of a recently promoted standby |
Date | |
Msg-id | 20180622035844.GA5215@paquier.xyz Whole thread Raw |
In response to | Re: PANIC during crash recovery of a recently promoted standby (Kyotaro HORIGUCHI <horiguchi.kyotaro@lab.ntt.co.jp>) |
Responses |
Re: PANIC during crash recovery of a recently promoted standby
|
List | pgsql-hackers |
On Thu, Jun 07, 2018 at 07:58:29PM +0900, Kyotaro HORIGUCHI wrote: > (I believe that) By definition recovery doesn't end until the > end-of-recovery check point ends so from the viewpoint I think it > is wrong to clear ControlFile->minRecoveryPoint before the end. > > Invalid-page checking during crash recovery is hamful rather than > useless. It is done by CheckRecoveryConsistency even in crash > recovery against its expectation because there's a case where > minRecoveryPoint is valid but InArchiveRecovery is false. The two > variable there seems to be in contradiction with each other. > > The immediate cause of the contradition is that StartXLOG wrongly > initializes local minRecoveryPoint from control file's value even > under crash recovery. updateMinRecoveryPoint also should be > turned off during crash recovery. The case of crash after last > checkpoint end has been treated in UpdateMinRecoveryPoint but > forgot to consider this case, where crash recovery has been > started while control file is still holding valid > minRecoveryPoint. I have been digesting your proposal and I reviewed it, and I think that what you are proposing here is on the right track. However, the updates around minRecoveryPoint and minRecoveryPointTLI ought to be more consistent because that could cause future issues. I have spotted two bug where I think the problem is not fixed: when replaying a WAL record XLOG_PARAMETER_CHANGE, minRecoveryPoint and minRecoveryPointTLI would still get updated from the control file values which can still lead to failures as CheckRecoveryConsistency could still happily trigger a PANIC, so I think that we had better maintain those values consistent as long as crash recovery runs. And XLogNeedsFlush() also has a similar problem. Note that there is as well the case where the startup process switches from crash recovery to archive recovery, in which case the update of the local copies have to happen once the switch is done. Your patch covers that with just updating updateMinRecoveryPoint each time crash recovery happens but that's not completely consistent, but it seems that it also missed the fact that updateMinRecoveryPoint needs to be switched back to true as the startup process can update the control file. Actually, updateMinRecoveryPoint needs to be switched back to true in that case or the startup process would not be able to update minRecoveryPoint when it calls XLogFlush for example. There is the point of trying to get rid of updateMinRecoveryPoint which has crossed my mind, but that's not wise as it's default value allows the checkpointer minRecoveryPoint when started, which also has to happen once the startup process gets out of recovery and tells the postmaster to start the checkpointer. For backends as well that's a sane default. There is also no point in taking ControlFileLock when checking if the local copy of minRecoveryPoint is valid or not, so this can be bypassed. The assertion in CheckRecoveryConsistency is definitely a good idea as this should only be called by the startup process, so we can keep it. In the attached, I have fixed the issues I found and added the test case which should be included in the final commit. Its concept is pretty simple, the idea is to keep the local copy of minRecoveryPoint to InvalidXLogRecPtr as long as crash recovery runs, and is switched back to normal if there is a switch to archive recovery after a crash recovery. This is not really a complicated patch, and it took a lot of energy from me the last couple of days per the nature of the many scenarios to think about... So an extra pair of eyes from another committer would be welcome. I am letting that cool down for a couple of days now. -- Michael
Attachment
pgsql-hackers by date: