At Tue, 14 Jan 2020 21:13:51 +0100, Peter Eisentraut 
<peter.eisentr...@2ndquadrant.com> wrote in 
> On 2019-12-11 12:40, Leif Gunnar Erlandsen wrote:
> > Adding patch written for 13dev from git
> > "Michael Paquier" <mich...@paquier.xyz> skrev 1. desember 2019
> > kl. 03:08:
> > 
> >> On Fri, Nov 22, 2019 at 11:26:59AM +0000, Leif Gunnar Erlandsen wrote:
> >>
> >>> No it does not. It works well to demonstrate its purpose though.
> >>> And it might be to stop with FATAL would be more correct.
> >>
> >> This is still under active discussion. Please note that the latest
> >> patch does not apply, so a rebase would be nice to have. I have moved
> >> the patch to next CF, waiting on author.
> 
> I reworked your patch a bit.  I changed the outcome to be an error, as
> was discussed.  I also added tests and documentation.  Please take a
> look.

It doesn't show how far the last recovery actually reached. I don't
think activating resource managers harms. Don't we check the
not-reached condition *only* after the else block of the "if (record
!= NULL)" statement?

>     /* just have to read next record after CheckPoint */
>     record = ReadRecord(xlogreader, InvalidXLogRecPtr, LOG, false);
>   }
>
>   if (record != NULL)
>   {
>       ...
>       }
>       else
>       {
>      /* there are no WAL records following the checkpoint */
>      ereport(LOG,
>          (errmsg("redo is not required")));
>   }
>
+   if (recoveryTarget != RECOVERY_TARGET_UNSET && !reachedStopPoint)
..


recvoery_target_* is not cleared after startup. If a server crashed
just after the last shutdown checkpoint, any recovery_target_* setting
prevents the server from starting regardless of its value.

> LOG:  database system was not properly shut down; automatic recovery in 
> progress
> LOG:  invalid record length at 0/9000420: wanted 24, got 0
(recovery is skipped)
> FATAL:  recovery ended before configured recovery target was reached

I think we should ignore the setting while crash recovery. Targeted
recovery mode is documented as a feature of archive recovery.  Perhaps
ArchiveRecoveryRequested is needed in the condition.

> if (ArchiveRecoveryRequested &&
>     recoveryTarget != RECOVERY_TARGET_UNSET && !reachedStopPoint)
         
regards.

-- 
Kyotaro Horiguchi
NTT Open Source Software Center


Reply via email to