| From: | Andres Freund <andres(at)anarazel(dot)de> | 
|---|---|
| To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Alvaro Herrera <alvherre(at)2ndquadrant(dot)com> | 
| Cc: | Robert Haas <robertmhaas(at)gmail(dot)com>, Masahiko Sawada <sawada(dot)mshk(at)gmail(dot)com>, Kyotaro HORIGUCHI <horiguchi(dot)kyotaro(at)lab(dot)ntt(dot)co(dot)jp>, "Bossart, Nathan" <bossartn(at)amazon(dot)com>, PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org> | 
| Subject: | Re: New vacuum option to do only freezing | 
| Date: | 2019-05-01 15:36:37 | 
| Message-ID: | 20190501153637.nyleiq67w4lvbo46@alap3.anarazel.de | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-hackers | 
Hi,
This thread is referenced an open item, and we ought to make some
progress on it.
On a more cosmetic note:
On 2019-04-16 09:10:19 -0700, Andres Freund wrote:
> On 2019-04-16 12:01:36 -0400, Tom Lane wrote:
> > (BTW, I don't understand why that code will throw "found xmin %u from
> > before relfrozenxid %u" if HeapTupleHeaderXminFrozen is true?  Shouldn't
> > the whole if-branch at lines 6113ff be skipped if xmin_frozen?)
>
> I *think* that just looks odd, but isn't actively wrong. That's because
> TransactionIdIsNormal() won't trigger, as:
>
> #define HeapTupleHeaderGetXmin(tup) \
> ( \
> 	HeapTupleHeaderXminFrozen(tup) ? \
> 		FrozenTransactionId : HeapTupleHeaderGetRawXmin(tup) \
> )
>
> which afaict makes
> 	xmin_frozen = ((xid == FrozenTransactionId) ||
> 				   HeapTupleHeaderXminFrozen(tuple));
> redundant.
>
> Looks like that was introduced relatively recently, in
>
> commit d2599ecfcc74fea9fad1720a70210a740c716730
> Author: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
> Date:   2018-05-04 15:24:44 -0300
>
>     Don't mark pages all-visible spuriously
>
>
> @@ -6814,6 +6815,8 @@ heap_prepare_freeze_tuple(HeapTupleHeader tuple,
>
>     /* Process xmin */
>     xid = HeapTupleHeaderGetXmin(tuple);
> +   xmin_frozen = ((xid == FrozenTransactionId) ||
> +                  HeapTupleHeaderXminFrozen(tuple));
>     if (TransactionIdIsNormal(xid))
>     {
>         if (TransactionIdPrecedes(xid, relfrozenxid))
> @@ -6832,9 +6835,8 @@ heap_prepare_freeze_tuple(HeapTupleHeader tuple,
>
>             frz->t_infomask |= HEAP_XMIN_FROZEN;
>             changed = true;
> +           xmin_frozen = true;
>         }
> -       else
> -           totally_frozen = false;
>     }
Alvaro, could we perhaps clean this up a bit? This is pretty confusing
looking.  I think this probably could just be changed to
bool xmin_frozen = false;
xid = HeapTupleHeaderGetXmin(tuple);
        if (xid == FrozenTransactionId)
                xmin_frozen = true;
        else if (TransactionIdIsNormal(xid))
or somesuch.  There's no need to check for
HeapTupleHeaderXminFrozen(tuple) etc, because HeapTupleHeaderGetXmin()
already does so - and if it didn't, the issue Tom points out would be
problematic.
Greetings,
Andres Freund
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Andres Freund | 2019-05-01 15:53:15 | Re: walsender vs. XLogBackgroundFlush during shutdown | 
| Previous Message | Bruce Momjian | 2019-05-01 15:28:11 | Re: Unhappy about API changes in the no-fsm-for-small-rels patch |