Hi Dhruv,

On Sun, June 30, 2019 at 7:30 AM, Goel, Dhruv wrote:
> > On Jun 10, 2019, at 1:20 PM, Goel, Dhruv <goeld...@amazon.com> wrote:
> >> On Jun 9, 2019, at 5:33 PM, Tom Lane <t...@sss.pgh.pa.us> wrote:
> >> Andres Freund <and...@anarazel.de> writes:
> >>> On June 9, 2019 8:36:37 AM PDT, Tom Lane <t...@sss.pgh.pa.us> wrote:
> >>>> I think you are mistaken that doing transactional updates in
> >>>> pg_index is OK.  If memory serves, we rely on xmin of the pg_index
> >>>> row for purposes such as detecting whether a concurrently-created
> >>>> index is safe to use yet.
> >
> > I took a deeper look regarding this use case but was unable to find more 
> > evidence. As part of this patch, we essentially
> make concurrently-created index safe to use only if transaction started after 
> the xmin of Phase 3. Even today concurrent
> indexes can not be used for transactions before this xmin because of the wait 
> (which I am trying to get rid of in this
> patch), is there any other denial of service you are talking about? Both the 
> other states indislive, indisready can
> be transactional updates as far as I understand. Is there anything more I am 
> missing here?
> 
> 
> Hi,
> 
> I did some more concurrency testing here through some python scripts which 
> compare the end state of the concurrently
> created indexes. I also back-ported this patch to PG 9.6 and ran some custom 
> concurrency tests (Inserts, Deletes, and
> Create Index Concurrently) which seem to succeed. The intermediate states 
> unfortunately are not easy to test in an
> automated manner, but to be fair concurrent indexes could never be used for 
> older transactions. Do you have more
> inputs/ideas on this patch?

According to the commit 3c8404649 [1], transactional update in pg_index is not 
safe in non-MVCC catalog scans before PG9.4.
But it seems to me that we can use transactional update in pg_index after the 
commit 813fb03155 [2] which got rid of SnapshotNow. 

If we apply this patch back to 9.3 or earlier, we might need to consider 
another way or take the Andres suggestion (which I don't understand the way 
fully though), but which version do you want/do we need to apply this patch?

Also, if we apply this patch in this way, there are several comments to be 
fixed which state the method of CREATE INDEX CONCURRENTLY.

ex.
[index.c]
/*
* validate_index - support code for concurrent index builds
...
* After completing validate_index(), we wait until all transactions that
* were alive at the time of the reference snapshot are gone; this is
* necessary to be sure there are none left with a transaction snapshot
* older than the reference (and hence possibly able to see tuples we did
* not index).  Then we mark the index "indisvalid" and commit.  Subsequent
* transactions will be able to use it for queries.
...
valiate_index()
{
}


[1] 
https://github.com/postgres/postgres/commit/3c84046490bed3c22e0873dc6ba492e02b8b9051#diff-b279fc6d56760ed80ce4178de1401d2c
[2] 
https://github.com/postgres/postgres/commit/813fb0315587d32e3b77af1051a0ef517d187763#diff-b279fc6d56760ed80ce4178de1401d2c

--
Yoshikazu Imai


Reply via email to