Uh, was this ever addressed?  I don't see the patch applied or the code
in this area modified.

---------------------------------------------------------------------------

On Thu, May 24, 2018 at 04:33:11PM +0200, Laurenz Albe wrote:
> While looking at this:
> https://stackoverflow.com/q/50413623/6464308
> I realized that "LOCK TABLE <unlogged table>" puts a
> Standby/LOCK into the WAL stream, which causes a log flush
> at COMMIT time.
> 
> That hurts performance, and I doubt that it is necessary.
> At any rate, DROP TABLE on an unlogged table logs nothing.
> 
> The attached patch would take care of it, but I'm not sure
> if that's the right place to check.
> 
> Yours,
> Laurenz Albe

> From d474e7b41298944e43bb9141eb33adbdd9ea1098 Mon Sep 17 00:00:00 2001
> From: Laurenz Albe <laurenz.a...@cybertec.at>
> Date: Tue, 22 May 2018 18:13:31 +0200
> Subject: [PATCH] Don't log locks on unlogged tables
> 
> ---
>  src/backend/storage/lmgr/lock.c | 28 +++++++++++++++++++++-------
>  1 file changed, 21 insertions(+), 7 deletions(-)
> 
> diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c
> index dc3d8d9817..70cac47ab3 100644
> --- a/src/backend/storage/lmgr/lock.c
> +++ b/src/backend/storage/lmgr/lock.c
> @@ -37,6 +37,7 @@
>  #include "access/twophase_rmgr.h"
>  #include "access/xact.h"
>  #include "access/xlog.h"
> +#include "catalog/pg_class.h"
>  #include "miscadmin.h"
>  #include "pg_trace.h"
>  #include "pgstat.h"
> @@ -47,6 +48,7 @@
>  #include "storage/standby.h"
>  #include "utils/memutils.h"
>  #include "utils/ps_status.h"
> +#include "utils/rel.h"
>  #include "utils/resowner_private.h"
>  
>  
> @@ -1041,13 +1043,25 @@ LockAcquireExtended(const LOCKTAG *locktag,
>        */
>       if (log_lock)
>       {
> -             /*
> -              * Decode the locktag back to the original values, to avoid 
> sending
> -              * lots of empty bytes with every message.  See lock.h to check 
> how a
> -              * locktag is defined for LOCKTAG_RELATION
> -              */
> -             LogAccessExclusiveLock(locktag->locktag_field1,
> -                                                        
> locktag->locktag_field2);
> +             bool unlogged_rel = false;
> +
> +             if (locktag->locktag_type == LOCKTAG_RELATION)
> +             {
> +                     Relation r = 
> RelationIdGetRelation(locktag->locktag_field2);
> +                     unlogged_rel = r->rd_rel->relpersistence == 
> RELPERSISTENCE_UNLOGGED;
> +                     RelationClose(r);
> +             }
> +
> +             if (!unlogged_rel)
> +             {
> +                     /*
> +                      * Decode the locktag back to the original values, to 
> avoid sending
> +                      * lots of empty bytes with every message.  See lock.h 
> to check how a
> +                      * locktag is defined for LOCKTAG_RELATION
> +                      */
> +                     LogAccessExclusiveLock(locktag->locktag_field1,
> +                                                                
> locktag->locktag_field2);
> +             }
>       }
>  
>       return LOCKACQUIRE_OK;
> -- 
> 2.14.3
> 


-- 
  Bruce Momjian  <br...@momjian.us>        https://momjian.us
  EDB                                      https://enterprisedb.com

  Only you can decide what is important to you.


Reply via email to