On Wed, Jan 25, 2017 at 10:06 PM, Alvaro Herrera <alvhe...@2ndquadrant.com>
wrote:

> Reading 0001_track_root_lp_v9.patch again:
>
>
Thanks for the review.


> > +/*
> > + * We use the same HEAP_LATEST_TUPLE flag to check if the tuple's
> t_ctid field
> > + * contains the root line pointer. We can't use the same
> > + * HeapTupleHeaderIsHeapLatest macro because that also checks for
> TID-equality
> > + * to decide whether a tuple is at the of the chain
> > + */
> > +#define HeapTupleHeaderHasRootOffset(tup) \
> > +( \
> > +     ((tup)->t_infomask2 & HEAP_LATEST_TUPLE) != 0 \
> > +)
> >
> > +#define HeapTupleHeaderGetRootOffset(tup) \
> > +( \
> > +     AssertMacro(((tup)->t_infomask2 & HEAP_LATEST_TUPLE) != 0), \
> > +     ItemPointerGetOffsetNumber(&(tup)->t_ctid) \
> > +)
>
> Interesting stuff; it took me a bit to see why these macros are this
> way.  I propose the following wording which I think is clearer:
>
>   Return whether the tuple has a cached root offset.  We don't use
>   HeapTupleHeaderIsHeapLatest because that one also considers the slow
>   case of scanning the whole block.
>

Umm, not scanning the whole block, but HeapTupleHeaderIsHeapLatest compares
t_ctid with the passed in TID and returns true if those matches. To know if
root lp is cached, we only rely on the HEAP_LATEST_TUPLE flag. Though if
the flag is set, then it implies latest tuple too.


>
> Please flag the macros that have multiple evaluation hazards -- there
> are a few of them.
>

Can you please tell me an example? I must be missing something.


>
>
> > +/*
> > + * Get TID of next tuple in the update chain. Caller should have
> checked that
> > + * we are not already at the end of the chain because in that case
> t_ctid may
> > + * actually store the root line pointer of the HOT chain whose member
> this
> > + * tuple is.
> > + */
> > +#define HeapTupleHeaderGetNextTid(tup, next_ctid) \
> > +do { \
> > +     AssertMacro(!((tup)->t_infomask2 & HEAP_LATEST_TUPLE)); \
> > +     ItemPointerCopy(&(tup)->t_ctid, (next_ctid)); \
> > +} while (0)
>
> Actually, I think this macro could just return the TID so that it can be
> used as struct assignment, just like ItemPointerCopy does internally --
> callers can do
>         ctid = HeapTupleHeaderGetNextTid(tup);
>
>
Yes, makes sense. Will fix.


>
>
> The API of RelationPutHeapTuple appears a bit contorted, where
> root_offnum is both input and output.  I think it's cleaner to have the
> argument be the input, and have the output offset be the return value --
> please check whether that simplifies things; for example I think this:
>
> > +                     root_offnum = InvalidOffsetNumber;
> > +                     RelationPutHeapTuple(relation, buffer, heaptup,
> false,
> > +                                     &root_offnum);
>
> becomes
>
>         root_offnum = RelationPutHeapTuple(relation, buffer, heaptup,
> false,
>                         InvalidOffsetNumber);
>
>
Make sense. Will fix.


>
>
> Many comments lack finishing periods in complete sentences, which looks
> odd.  Please fix.
>

Sorry, not sure where I picked that style from. I see that the existing
code has both styles, though I will add finishing periods because I like
that way too.

Thanks,
Pavan

-- 
 Pavan Deolasee                   http://www.2ndQuadrant.com/
 PostgreSQL Development, 24x7 Support, Training & Services

Reply via email to