On 2013-12-03 19:15:53 +0900, Kyotaro HORIGUCHI wrote:
>  - In heapam.c, it seems to be better replacing t_self only
>    during logical decoding.

I don't see what'd be gained by that except make the test matrix bigger
at no gain.

>  - Before that, In LogicalDecodingAcquireFreeSlot, lock window
>    for procarray is extended after GetOldestXmin, but procarray
>    does not seem to be accessed during the additional period. If
>    you are holding this lock for the purpose other than accessing
>    procArray, it'd be better to provide its own lock object.

The comment above the part explains the reason:

        /*
         * Acquire the current global xmin value and directly set the logical 
xmin
         * before releasing the lock if necessary. We do this so wal decoding is
         * guaranteed to have all catalog rows produced by xacts with an xid >
         * walsnd->xmin available.
         *
         * We can't use ComputeLogicalXmin here as that acquires ProcArrayLock
         * separately which would open a short window for the global xmin to
         * advance above walsnd->xmin.
         */

>  - In dropdb in dbcommands.c, ereport is invoked referring the
>    result of LogicalDecodingCountDBSlots. But it seems better to
>    me issueing this exception within LogicalDecodingCountDBSlots
>    even if goto is required.

What if LogicalDecodingCountDBSlots() is needed in other places? That
seems like a layering violation to me.

>  - In LogStandbySnapshot in standby.c, two complementary
>    conditions are imposed on two same unlocks. It might be
>    somewhat paranoic but it is safer being like follows,

I don't see an advantage in that.

>  - In tqual.c, in Setup/RevertFrom DecodingSnapshots, the name
>    CatalogSnapshotData looks lacking unity with other
>    Snapshot*Data's.

That part needs a bit of work, agreed.

> ===== 0007:
> 
>  - In heapam.c, the new global variable 'RecentGlobalDataXmin' is
>    quite similar to 'RecentGlobalXmin' and does not represents
>    what it is. The name should be
>    changed. RecentGlobalNonCatalogXmin would be more preferable..

Hm. It's a mighty long name... but it indeed is clearer.

>  - Althgough simplly from my teste, the following part in
>    heapam.c
> 
>     > if (IsSystemRelation(scan->rs_rd)
>     >         || RelationIsAccessibleInLogicalDecoding(scan->rs_rd))
>     >         heap_page_prune_opt(scan->rs_rd, buffer, RecentGlobalXmin);
>     > else
>     >         heap_page_prune_opt(scan->rs_rd, buffer, RecentGlobalDataXmin);
> 
>    would be readable to be like,
> 
>     > if (IsSystemRelation(scan->rs_rd)
>     >         || RelationIsAccessibleInLogicalDecoding(scan->rs_rd))
>     >   xmin = RecentGlobalXmin
>     > else
>     >   xmin = RecentGlobalDataXmin
>     >         heap_page_prune_opt(scan->rs_rd, buffer, xmin);

Well, it requires introducing a new variable (which better not be named
xmin, but OldestXmin or similar). But I don't really care.

>     index_fetch_heap in indexam.c has similar part to this, and
>     you coded in latter style in IndexBuildHeapScan in index.c.

It's different there, because we do an explicit GetOldestXmin() call
there which we surely don't want to do twice.

> 0008 and after to come later..

Thanks for your review!

Greetings,

Andres Freund

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


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to