Re: Wrong usage of RelationNeedsWAL

Andres Freund <andres@anarazel.de>

From: Andres Freund <andres@anarazel.de>
To: Kyotaro Horiguchi <horikyota.ntt@gmail.com>, Noah Misch <noah@leadboat.com>
Cc: pgsql-hackers@postgresql.org
Date: 2021-01-15T21:30:54Z
Lists: pgsql-hackers
Hi,

On 2021-01-13 16:07:05 +0900, Kyotaro Horiguchi wrote:
> Commit c6b92041d3 changed the definition of RelationNeedsWAL().
> 
> -#define RelationNeedsWAL(relation) \
> -	((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
> +#define RelationNeedsWAL(relation)										\
> +	((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT &&	\
> +	 (XLogIsNeeded() ||													\
> +	  (relation->rd_createSubid == InvalidSubTransactionId &&			\
> +	   relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId)))
> 
> On the other hand I found this usage.
> 
> plancat.c:128 get_relation_info()
> >	/* Temporary and unlogged relations are inaccessible during recovery. */
> >	if (!RelationNeedsWAL(relation) && RecoveryInProgress())
> >		ereport(ERROR,
> >				(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
> >				 errmsg("cannot access temporary or unlogged relations during recovery")));
> 
> It works as expected accidentally, but the meaning is off.
> WAL-skipping optmization is irrelevant to the condition for the error.
> 
> I found five misues in the tree. Please find the attached.

Noah?

Greetings,

Andres Freund



Commits

  1. Revive "snapshot too old" with wal_level=minimal and SET TABLESPACE.

  2. Fix error with CREATE PUBLICATION, wal_level=minimal, and new tables.

  3. Skip WAL for new relfilenodes, under wal_level=minimal.