Re: [BUG] non archived WAL removed during production crash recovery

Jehan-Guillaume de Rorthais <jgdr@dalibo.com>

From: Jehan-Guillaume de Rorthais <jgdr@dalibo.com>
To: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Cc: masao.fujii@oss.nttdata.com, pgsql-bugs@lists.postgresql.org, michael@paquier.xyz
Date: 2020-04-08T13:26:03Z
Lists: pgsql-bugs, pgsql-hackers
On Wed, 08 Apr 2020 17:39:09 +0900 (JST)
Kyotaro Horiguchi <horikyota.ntt@gmail.com> wrote:

> At Tue, 7 Apr 2020 17:17:36 +0200, Jehan-Guillaume de Rorthais
> <jgdr@dalibo.com> wrote in 
> > > +/* Recovery state */
> > > +typedef enum RecoveryState
> > > +{
> > > +	NOT_IN_RECOVERY = 0,
> > > +	IN_CRASH_RECOVERY,
> > > +	IN_ARCHIVE_RECOVERY
> > > +} RecoveryState;  
> 
> I'm not sure the complexity is required here. Are we asuume that
> archive_mode can be changed before restarting?

I assume it can yes. Eg., one can restore a PITR backup as a standby and change
the value of archive_mode to either off, on or always.

> At Thu, 2 Apr 2020 15:49:15 +0200, Jehan-Guillaume de Rorthais
> <jgdr@dalibo.com> wrote in 
> > > Ok, so our *current* consensus seems the followings. Right?
> > > 
> > > - If archive_mode=off, any WAL files with .ready files are removed in
> > >     crash recovery, archive recoery and standby mode.  
> > 
> > yes  
> 
> If archive_mode = off no WAL files are marked as ".ready".

Sure, on the primary side.

What if you build a standby from a backup with archive_mode=on with
some .ready files in there? 

> > > - If archive_mode=on, WAL files with .ready files are removed only in
> > >     standby mode. In crash recovery and archive recovery cases, they keep
> > >     remaining and would be archived after recovery finishes (i.e., during
> > >     normal processing).  
> > 
> > yes
> >  
> > > - If archive_mode=always, in crash recovery, archive recovery and
> > >     standby mode, WAL files with .ready files are archived if WAL archiver
> > >     is running.  
> > 
> > yes  
> 
> So if we assume archive_mode won't be changed after a crash before
> restarting, if archive_mode = on on a standy, WAL files are not marked
> as ".ready".

.ready files can be inherited from the old primary when building the standby,
depending on the method. See previous explanations from Fujii-san:
https://www.postgresql.org/message-id/flat/ca964b3a-61a0-902e-c7b3-3abbc01a921f%40oss.nttdata.com#ddd6cbad6c5e576e2e1ae53868ca3eea

> If it is "always", WAL files that are to be archived are
> marked as ".ready".  Finally, the condition reduces to:
> 
> If archiver is running, archive ".ready" files. Otherwise ignore
> ".ready" and just remove WAL files after use.
> >   
> > > That is, WAL files with .ready files are removed when either
> > > archive_mode!=always in standby mode or archive_mode=off.  
> > 
> > sounds fine to me.  
> 
> That situation implies that archive_mode has been changed.

Why? archive_mode may have been "always" on the primary when eg. a snapshot has
been created.

Regards,



Commits

  1. Fix interpolation in test name.

  2. Add more TAP coverage for archive status with crash recovery of standbys

  3. Fix handling of WAL segments ready to be archived during crash recovery

  4. Fix WAL recycling on standbys depending on archive_mode