Re: Remove HeapTuple and Buffer dependency for predicate locking functions - Mailing list pgsql-hackers
From | Thomas Munro |
---|---|
Subject | Re: Remove HeapTuple and Buffer dependency for predicate locking functions |
Date | |
Msg-id | CA+hUKG+R_04xZeU_3Be=zLVv56h7kA6imn78mhqcX6HumzJFvQ@mail.gmail.com Whole thread Raw |
In response to | Re: Remove HeapTuple and Buffer dependency for predicate lockingfunctions (Andres Freund <andres@anarazel.de>) |
Responses |
Re: Remove HeapTuple and Buffer dependency for predicate locking functions
Re: Remove HeapTuple and Buffer dependency for predicate lockingfunctions |
List | pgsql-hackers |
On Tue, Jun 25, 2019 at 6:02 AM Andres Freund <andres@anarazel.de> wrote: > On 2019-06-24 10:41:06 -0700, Ashwin Agrawal wrote: > > Proposing following changes to make predicate locking and checking > > functions generic and remove dependency on HeapTuple and Heap AM. We > > made these changes to help with Zedstore. I think the changes should > > help Zheap and other AMs in general. > > Indeed. +1 > > - Change PredicateLockTuple() to PredicateLockTID(). So, instead of > > passing HeapTuple to it, just pass ItemPointer and tuple insert > > transaction id if known. This was also discussed earlier in [1], > > don't think was done in that context but would be helpful in future > > if such requirement comes up as well. > > Right. +1 > > - CheckForSerializableConflictIn() take blocknum instead of > > buffer. Currently, the function anyways does nothing with the buffer > > just needs blocknum. Also, helps to decouple dependency on buffer as > > not all AMs may have one to one notion between blocknum and single > > buffer. Like for zedstore, tuple is stored across individual column > > buffers. So, wish to have way to lock not physical buffer but > > logical blocknum. > > Hm. I wonder if we somehow ought to generalize the granularity scheme > for predicate locks to not be tuple/page/relation. But even if, that's > probably a separate patch. What do you have in mind? This is certainly the traditional way to do lock hierarchies (archeological fun: we used to have src/backend/storage/lock/multi.c, a "standard multi-level lock manager as per the Gray paper", before commits 3f7fbf85 and e6e9e18e decommissioned it; SSI brought the concept back again in a parallel lock manager), but admittedly it has assumptions about physical storage baked into the naming. Perhaps you just want to give those things different labels, "TID range" instead of page, for the benefit of "logical" TID users? Perhaps you want to permit more levels? That seems premature as long as TIDs are defined in terms of blocks and offsets, so this stuff is reflected all over the source tree... > > - CheckForSerializableConflictOut() no more takes HeapTuple nor > > buffer, instead just takes xid. Push heap specific parts from > > CheckForSerializableConflictOut() into its own function > > HeapCheckForSerializableConflictOut() which calls > > CheckForSerializableConflictOut(). The alternative option could be > > CheckForSerializableConflictOut() take callback function and > > callback arguments, which gets called if required after performing > > prechecks. Though currently I fell AM having its own wrapper to > > perform AM specific task and then calling > > CheckForSerializableConflictOut() is fine. > > I think it's right to move the xid handling out of > CheckForSerializableConflictOut(). But I think we also ought to move the > subtransaction handling out of the function - e.g. zheap doesn't > want/need that. Thoughts on this Ashwin? > > Attaching patch which makes these changes. > > Please make sure that there's a CF entry for this (I'm in a plane with a > super slow connection, otherwise I'd check). This all makes sense, and I'd like to be able to commit this soon. We come up with something nearly identical for zheap. I'm subscribing Kuntal Ghosh to see if he has comments, as he worked on that. The main point of difference seems to be the assumption about how subtransactions work. -- Thomas Munro https://enterprisedb.com
pgsql-hackers by date: