Re: In progress INSERT wrecks plans on table

From: Jeff Janes <jeff(dot)janes(at)gmail(dot)com>
To: Heikki Linnakangas <hlinnakangas(at)vmware(dot)com>
Cc: Mark Kirkwood <mark(dot)kirkwood(at)catalyst(dot)net(dot)nz>, Simon Riggs <simon(at)2ndquadrant(dot)com>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Gavin Flower <gavinflower(at)archidevsys(dot)co(dot)nz>, "pgsql-performance(at)postgresql(dot)org" <pgsql-performance(at)postgresql(dot)org>
Subject: Re: In progress INSERT wrecks plans on table
Date: 2013-07-13 21:29:20
Message-ID: CAMkU=1y6Os-M+CYa1Q-5LbWwOFoa+ornOEf9JJXKiTAQxsCFHg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers pgsql-performance

On Sunday, June 16, 2013, Heikki Linnakangas wrote:

> On 06.05.2013 04:51, Mark Kirkwood wrote:
>
>> On 05/05/13 00:49, Simon Riggs wrote:
>>
>>> On 3 May 2013 13:41, Simon Riggs <simon(at)2ndquadrant(dot)com> wrote:
>>>
>>> (3) to make the check on TransactionIdIsInProgress() into a heuristic,
>>>> since we don't *need* to check that, so if we keep checking the same
>>>> xid repeatedly we can reduce the number of checks or avoid xids that
>>>> seem to be long running. That's slightly more coding than my quick
>>>> hack here but seems worth it.
>>>>
>>>> I think we need both (1) and (3) but the attached patch does just (1).
>>>>
>>>> This is a similar optimisation to the one I introduced for
>>>> TransactionIdIsKnownCompleted(**), except this applies to repeated
>>>> checking of as yet-incomplete xids, and to bulk concurrent
>>>> transactions.
>>>>
>>>
>>> ISTM we can improve performance of TransactionIdIsInProgress() by
>>> caching the procno of our last xid.
>>>
>>> Mark, could you retest with both these patches? Thanks.
>>>
>>>
>> Thanks Simon, will do and report back.
>>
>
> Did anyone ever try (3) ?
>
> I'm not sure if this the same idea as (3) above, but ISTM that
> HeapTupleSatisfiesMVCC doesn't actually need to call
> TransactionIdIsInProgress(), because it checks XidInMVCCSnapshot(). The
> comment at the top of tqual.c says:
>

Or at least, it doesn't need to call TransactionIdIsInProgress() if
XidInMVCCSnapshot() returned true.

>
> * NOTE: must check TransactionIdIsInProgress (which looks in PGXACT
>> array)
>> * before TransactionIdDidCommit/**TransactionIdDidAbort (which look in
>> * pg_clog). Otherwise we have a race condition: we might decide that a
>> * just-committed transaction crashed, because none of the tests succeed.
>> * xact.c is careful to record commit/abort in pg_clog before it unsets
>> * MyPgXact->xid in PGXACT array. That fixes that problem, but it also
>> * means there is a window where TransactionIdIsInProgress and
>> * TransactionIdDidCommit will both return true. If we check only
>> * TransactionIdDidCommit, we could consider a tuple committed when a
>> * later GetSnapshotData call will still think the originating transaction
>> * is in progress, which leads to application-level inconsistency.
>> The
>> * upshot is that we gotta check TransactionIdIsInProgress first in all
>> * code paths, except for a few cases where we are looking at
>> * subtransactions of our own main transaction and so there can't be any
>> * race condition.
>>
>
> If TransactionIdIsInProgress() returns true for a given XID, then surely
> it was also running when the snapshot was taken (or had not even began
> yet). In which case the XidInMVCCSnapshot() call will also return true. Am
> I missing something?
>
> There's one little problem: we currently only set the hint bits when
> TransactionIdIsInProgress() returns false. If we do that earlier,

But why would we do that earlier? If we never bother to call
TransactionIdIsInProgress(), then we just don't set the hint bits, because
we don't know what to set them to. It can't matter what order we call
TransactionIdIsInProgress and TransactionIdDidCommit in if we don't call
either of them at all during this invocation.

Cheers,

Jeff

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Andrew Dunstan 2013-07-13 22:02:50 Re: checking variadic "any" argument in parser - should be array
Previous Message David Fetter 2013-07-13 20:54:28 Re: GSOC13 proposal - extend RETURNING syntax

Browse pgsql-performance by date

  From Date Subject
Next Message Sergey Konoplev 2013-07-15 04:33:57 Re: how to speed up the index creation in GP?
Previous Message Ants Aasma 2013-07-13 13:41:38 Re: In progress INSERT wrecks plans on table