Em sáb., 13 de abr. de 2024 às 04:16, Heikki Linnakangas <hlinn...@iki.fi>
escreveu:

> On 11/04/2024 16:37, Ranier Vilela wrote:
> > Em qui., 11 de abr. de 2024 às 09:54, Heikki Linnakangas
> > <hlinn...@iki.fi <mailto:hlinn...@iki.fi>> escreveu:
> >
> >     On 11/04/2024 15:03, Ranier Vilela wrote:
> >      > Em qua., 10 de abr. de 2024 às 18:28, Heikki Linnakangas
> >      > <hlinn...@iki.fi <mailto:hlinn...@iki.fi> <mailto:hlinn...@iki.fi
> >     <mailto:hlinn...@iki.fi>>> escreveu:
> >      >
> >      >     On 10/04/2024 21:07, Ranier Vilela wrote:
> >      >      > Hi,
> >      >      >
> >      >      > Per Coverity.
> >      >      >
> >      >      > The function ReorderBufferTXNByXid,
> >      >      > can return NULL when the parameter *create* is false.
> >      >      >
> >      >      > In the functions ReorderBufferSetBaseSnapshot
> >      >      > and ReorderBufferXidHasBaseSnapshot,
> >      >      > the second call to ReorderBufferTXNByXid,
> >      >      > pass false to *create* argument.
> >      >      >
> >      >      > In the function ReorderBufferSetBaseSnapshot,
> >      >      > fixed passing true as argument to always return
> >      >      > a valid ReorderBufferTXN pointer.
> >      >      >
> >      >      > In the function ReorderBufferXidHasBaseSnapshot,
> >      >      > fixed by checking if the pointer is NULL.
> >      >
> >      >     If it's a "known subxid", the top-level XID should already
> >     have its
> >      >     ReorderBufferTXN entry, so ReorderBufferTXN() should never
> >     return NULL.
> >      >
> >      > There are several conditions to not return NULL,
> >      > I think trusting never is insecure.
> >
> >     Well, you could make it an elog(ERROR, ..) instead. But the point is
> >     that it should not happen, and if it does for some reason, that's
> very
> >     suprpising and there is a bug somewhere. In that case, we should
> *not*
> >     just blindly create it and proceed as if everything was OK.
> >
> > Thanks for the clarification.
> > I will then suggest improving robustness,
> > but avoiding hiding any possible errors that may occur.
>
> I don't much like adding extra runtime checks for "can't happen"
> scenarios either. Assertions would be more clear, but in this case the
> code would just segfault trying to dereference the NULL pointer, which
> is fine for a "can't happen" scenario.
>
This sounds a little confusing to me.
Is the project policy to *tolerate* dereferencing NULL pointers?
If this is the case, no problem, using Assert would serve the purpose of
protecting against these errors well.


> Looking closer, when we identify an XID as a subtransaction, we:
> - assign toplevel_xid,
> - set RBTXN_IS_SUBXACT, and
> - assign toptxn pointer.
>
> ISTM the 'toplevel_xid' and RBTXN_IS_SUBXACT are redundant.
> 'toplevel_xid' is only used in those two calls that do
> ReorderBufferTXNByXid(rb, txn->toplevel_xid,...), and you could replace
> those by following the 'toptxn' pointer directly. And RBTXN_IS_SUBXACT
> is redundant with (toptxn != NULL). So here's a patch to remove
> 'toplevel_xid' and RBTXN_IS_SUBXACT altogether.
>
+ if (rbtxn_is_subtxn(txn))
+ txn = rbtxn_get_toptxn(txn);

rbtxn_get_toptxn already calls rbtxn_is_subtx,
which adds a little unnecessary overhead.
I made a v1 of your patch, modifying this, please ignore it if you don't
agree.

best regards,
Ranier Vilela

Attachment: v1-0001-Remove-redundant-field-and-flag-from-ReorderBufferTX.patch
Description: Binary data

Reply via email to