Re: Add macros for ReorderBufferTXN toptxn

From: Peter Smith <smithpb2250(at)gmail(dot)com>
To: vignesh C <vignesh21(at)gmail(dot)com>
Cc: PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: Re: Add macros for ReorderBufferTXN toptxn
Date: 2023-03-15 00:01:10
Message-ID: CAHut+Pv1A0NZW22NAh+dz+PZ-wgkaq6jPPp6V7r9nm1q7ti8kw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Tue, Mar 14, 2023 at 10:33 PM vignesh C <vignesh21(at)gmail(dot)com> wrote:
>
> On Tue, 14 Mar 2023 at 12:37, Peter Smith <smithpb2250(at)gmail(dot)com> wrote:
> >
> > Thanks for the review!
> >
> > On Mon, Mar 13, 2023 at 6:19 PM vignesh C <vignesh21(at)gmail(dot)com> wrote:
> > ...
> > > Few comments:
> > > 1) Can we move the macros along with the other macros present in this
> > > file, just above this structure, similar to the macros added for
> > > txn_flags:
> > > /* Toplevel transaction for this subxact (NULL for top-level). */
> > > +#define isa_toptxn(rbtxn) (rbtxn->toptxn == NULL)
> > > +#define isa_subtxn(rbtxn) (rbtxn->toptxn != NULL)
> > > +#define get_toptxn(rbtxn) (isa_subtxn(rbtxn) ? rbtxn->toptxn : rbtxn)
> > >
> > > 2) The macro name can be changed to rbtxn_is_toptxn, rbtxn_is_subtxn
> > > and rbtxn_get_toptxn to keep it consistent with others:
> > > /* Toplevel transaction for this subxact (NULL for top-level). */
> > > +#define isa_toptxn(rbtxn) (rbtxn->toptxn == NULL)
> > > +#define isa_subtxn(rbtxn) (rbtxn->toptxn != NULL)
> > > +#define get_toptxn(rbtxn) (isa_subtxn(rbtxn) ? rbtxn->toptxn : rbtxn)
> > >
> > > 3) We could add separate comments for each of the macros:
> > > /* Toplevel transaction for this subxact (NULL for top-level). */
> > > +#define isa_toptxn(rbtxn) (rbtxn->toptxn == NULL)
> > > +#define isa_subtxn(rbtxn) (rbtxn->toptxn != NULL)
> > > +#define get_toptxn(rbtxn) (isa_subtxn(rbtxn) ? rbtxn->toptxn : rbtxn)
> > >
> >
> > All the above are fixed as suggested.
> >
> > > 4) We check if txn->toptxn is not null twice here both in if condition
> > > and in the assignment, we could retain the assignment operation as
> > > earlier to remove the 2nd check:
> > > - if (txn->toptxn)
> > > - txn = txn->toptxn;
> > > + if (isa_subtxn(txn))
> > > + txn = get_toptxn(txn);
> > >
> > > We could avoid one check again by:
> > > + if (isa_subtxn(txn))
> > > + txn = txn->toptxn;
> > >
> >
> > Yeah, that is true, but I chose not to keep the original assignment in
> > this case mainly because then it is consistent with the other changed
> > code --- e.g. Every other direct member assignment/access of the
> > 'toptxn' member now hides behind the macros so I did not want this
> > single place to be the odd one out. TBH, I don't think 1 extra check
> > is of any significance, but it is not a problem to change like you
> > suggested if other people also want it done that way.
>
> The same issue exists here too:
> 1)
> - if (toptxn != NULL && !rbtxn_has_catalog_changes(toptxn))
> + if (rbtxn_is_subtxn(txn))
> {
> - toptxn->txn_flags |= RBTXN_HAS_CATALOG_CHANGES;
> - dclist_push_tail(&rb->catchange_txns, &toptxn->catchange_node);
> + ReorderBufferTXN *toptxn = rbtxn_get_toptxn(txn);
>
> 2)
> - if (change->txn->toptxn)
> - topxid = change->txn->toptxn->xid;
> + if (rbtxn_is_subtxn(change->txn))
> + topxid = rbtxn_get_toptxn(change->txn)->xid;
>
> If you plan to fix, bothe the above also should be handled.

OK, noted. Anyway, for now, I preferred the 'toptxn' member to be
consistently hidden in the code so I don't plan to remove those
macros.

Also, please see Amit's reply [1] to your suggestion.

>
> 3) The comment on top of rbtxn_get_toptxn could be kept similar in
> both the below places. I know it is not because of your change, but
> since it is a very small change probably we could include it along
> with this patch:
> @@ -717,10 +717,7 @@ ReorderBufferProcessPartialChange(ReorderBuffer
> *rb, ReorderBufferTXN *txn,
> return;
>
> /* Get the top transaction. */
> - if (txn->toptxn != NULL)
> - toptxn = txn->toptxn;
> - else
> - toptxn = txn;
> + toptxn = rbtxn_get_toptxn(txn);
>
> /*
> * Indicate a partial change for toast inserts. The change will be
> @@ -812,10 +809,7 @@ ReorderBufferQueueChange(ReorderBuffer *rb,
> TransactionId xid, XLogRecPtr lsn,
> ReorderBufferTXN *toptxn;
>
> /* get the top transaction */
> - if (txn->toptxn != NULL)
> - toptxn = txn->toptxn;
> - else
> - toptxn = txn;
> + toptxn = rbtxn_get_toptxn(txn);
>

IMO the comment ("/* get the top transaction */") was not really
saying anything useful that is not already obvious from the macro name
("rbtxn_get_toptxn"). So I've removed it entirely in your 2nd case.
This change is consistent with other parts of the patch where the
toptxn is just assigned in the declaration.

PSA v3. [2]

------
[1] Amit reply to your suggestion -
https://www.postgresql.org/message-id/CAA4eK1%2BoqfUSC3vpu6bJzgfnSmu_yaeoLS%3DRb3416GuS5iRP1Q%40mail.gmail.com
[2] v3 - https://www.postgresql.org/message-id/CAHut%2BPtrD4xU4OPUB64ZK%2BDPDhfKn3zph%3DnDpEWUFFzUvMKo2w%40mail.gmail.com

Kind Regards,
Peter Smith.
Fujitsu Australia

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Melanie Plageman 2023-03-15 00:29:09 Re: Option to not use ringbuffer in VACUUM, using it in failsafe mode
Previous Message Peter Smith 2023-03-14 23:54:26 Re: Add macros for ReorderBufferTXN toptxn