Re: SSI predicate locking on heap -- tuple or row?

From: Heikki Linnakangas <heikki(dot)linnakangas(at)enterprisedb(dot)com>
To: Kevin Grittner <Kevin(dot)Grittner(at)wicourts(dot)gov>
Cc: drkp(at)csail(dot)mit(dot)edu, pgsql-hackers(at)postgresql(dot)org
Subject: Re: SSI predicate locking on heap -- tuple or row?
Date: 2011-05-30 09:36:04
Message-ID: 4DE36504.6040508@enterprisedb.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 26.05.2011 06:19, Kevin Grittner wrote:
> /*
> * Check whether the writer has become a pivot with an out-conflict
> * committed transaction, while neither reader nor writer is committed. If
> * the reader is a READ ONLY transaction, there is only a serialization
> * failure if an out-conflict transaction causing the pivot committed
> * before the reader acquired its snapshot. (That is, the reader must not
> * have been concurrent with the out-conflict transaction.)
> */
> if (!failure)
> {
> if (SxactHasSummaryConflictOut(writer))
> {
> failure = true;
> conflict = NULL;
> }
> else
> conflict = (RWConflict)
> SHMQueueNext(&writer->outConflicts,
> &writer->outConflicts,
> offsetof(RWConflictData, outLink));
> while (conflict)
> {
> if (SxactIsCommitted(conflict->sxactIn)
> && (!SxactIsCommitted(reader)
> || conflict->sxactIn->commitSeqNo <= reader->commitSeqNo)
> && (!SxactIsCommitted(writer)
> || conflict->sxactIn->commitSeqNo <= writer->commitSeqNo)
> && (!SxactIsReadOnly(reader)
> || conflict->sxactIn->commitSeqNo <= reader->SeqNo.lastCommitBeforeSnapshot))
> {
> failure = true;
> break;
> }
> conflict = (RWConflict)
> SHMQueueNext(&writer->outConflicts,
> &conflict->outLink,
> offsetof(RWConflictData, outLink));
> }
> }

The comment is not in sync with the code. The code is not checking that
"neither reader or writer has committed", but something more complicated.

Looking at OnConflict_CheckForSerializationFailure(), it's really hard
to see how it works, and why the conditions it checks are sufficient. I
find it helps tremendously to draw the dangerous structures being
checked, in addition to just explaining them in text. Ascii art is a bit
clunky, but I think we have to do it here.

I did some of that in the comments, and I think I understand it now. See
attached patch. Does that look right to you? (note that I swapped the
second and third check in the function, I think it's more
straightforward that way). I also added a couple of questions about the
conditions, marked with XXX comments. Can you answer those, please?

PS. Should we say "Cancelled on identification as pivot, during ...", or
"Cancelled on identification as a pivot, during ..." ? We seem to use
both in the error messages.

--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com

Attachment Content-Type Size
ssi-tuple-not-row-locking-4.patch text/x-diff 20.4 KB

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Gaetano Giunta 2011-05-30 09:45:26 adding applications to the stack builder
Previous Message Tomasz Chmielewski 2011-05-30 09:18:17 Re: 'SGT DETAIL: Could not open file "pg_clog/05DC": No such file or directory' - what to do now?